作为程序员应该了解的32个算法(持续更新)

本文深入浅出地介绍了算法的基本概念,包括算法的定义、时间复杂度和大O表示法,重点讲解了二分查找算法的工作原理及其实现,并列举了多种常见算法类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法是一组完成任务的指令。任何代码片段都可视为算法。

来自百度百科:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

大O表示法

算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。
当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。

大O表示法是一种特殊的表示法,指出了算法的速度有多快。

大O表示法指出了最糟情况下的运行时间
eg: 在一个电话簿(n个电话)中找一个电话,利用快速查找,最好的情况是第一次就找到,最坏的情况是第n次找到。这个运行时间要按照最糟糕的情况算,即O(n)

我们使用大O表示法讨论算法的运行时间,从而理解不同算法的优缺点。
大O表示法

A搜索算法


集束搜索


二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

要求:

  • 必须采用顺序存储结构。
  • 必须按关键字大小有序排列。

说白了就是当我们有一个需求:要查找一个数字是否在一个序列中,我们就可以使用二分法进行查找。
首先我们要对序列进行排序(无论升序还是降序),然后把序列从中间一分为二,拿我们要查找的数字与中间数字做对比,根据判断的结果进行下一步操作。

基于Python实现如下:

# 这里我们用列表来举例
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101]  # 从小到大排列的数字列表
# 如果传入的序列是无序的,我们可以先对序列进行排序

def binary_search(find_num, nums):
    '''
    二分法查找数字是否存在于列表中
    :param find_num: 要查找的数字
    :param nums: 序列
    :return: 返回布尔值, 存在为True
    '''
    # 先判断传入的序列的长度
    if len(nums) == 0:
    	# 如果序列长度为0,则要查找的数字不在此序列中
        print('not exists')
        return False
    # 将序列从中间一分为二,然后拿我们要查找的数字与中间数字做对比,判断大小
    # 这里我们默认序列为从小到大
    mid_index = len(nums) // 2
    # 要查找的数字大于序列中间数字,则我们要查找的数字要么在序列右侧(较大一侧),要么不存在
    if find_num > nums[mid_index]:
        # 取列表右半部分赋值给新变量
        nums = nums[mid_index + 1:]
        # 重新运行功能,传入新列表
        binary_search(find_num, nums)
    # 要查找的数字小于序列中间数字,则我们要查找的数字要么在序列右侧(较大一侧),要么不存在
    elif find_num < nums[mid_index]:
        # 取列表左半部分赋值给新变量
        nums = nums[:mid_index]
        # 重新运行功能,传入新列表
        binary_search(find_num, nums)
    # 要查找的数字等于中间数字,则找到数字,返回True
    else:
        return True


# 函数有返回值,找个变量接收一下
res = binary_search(95, nums)
# 查看结果
print(res)

分支界定算法


Buchberger算法


数据压缩


密钥交换算法


Dijkstra算法


离散微分算法


动态规划算法


欧几里得算法


期望-最大算法


快速傅里叶变换


梯度下降


哈希算法


堆排序


Karatsuba乘法


LLL算法


最大流量算法


合并排序


牛顿法


Q-learning


两次筛法


RANSAC


RSA


Strassen算法


单纯型算法


奇异值分解


求解线性方程组


Strukturtensor


合并查找算法


维特比算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Noah Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值