算法入门001-递归、查找

本文介绍了算法的基础概念,包括程序=数据结构+算法的定义,以及时间复杂度和空间复杂度的衡量标准。通过示例解释了常量时间复杂度O(1),线性时间复杂度O(n)和对数时间复杂度O(logn)。接着讨论了递归的特点,并展示了汉诺塔问题的递归解决方案。最后,对比了顺序查找和二分查找这两种查找方法在效率上的差异。
摘要由CSDN通过智能技术生成

1 算法:Algorithm

Niklaus Wirth: “程序=数据结构+算法”

1.1 时间复杂度:用来评估算法运行效率的一个式子

print("Hello World!")	# 时间复杂度O(1)

for i in range(n):
	print("Hello World!")	# 时间复杂度O(n)

while n>1:
	print("Hello World!")	# 时间复杂度O(logn)
	n=n//2

快速判断时间复杂度:

  • 确定问题规模—>n
  • 循环减半过程—>O(logn)
  • m层关于n的循环—>O(nᵐ)

1.2 空间复杂度:用来评估算法内存占用大小的式子

快速判断时间复杂度

  • 算法使用了几个变量:O(1)
  • 算法使用了长度为n的一维列表:O(n)
  • 算法使用了m行n列的二维列表:O(mn)
  • 空间换时间

2 递归的两个特点

  • 调用自身
  • 有结束条件
#假如x=3,打印结果为3 2 1
def func_xian_digui(x):
   if x>0:
       print(x)
       func_xian_digui(x-1)

#假如x=3,打印结果为1 2 3
def func_hou_digui(x):
   if x>0:
      func_hou_digui(x-1)
      print(x)

2.1 汉诺塔圆盘问题(递归)

# 在柱子a上从上往下按照大小顺序摞者n片圆盘
# 按照大小顺序将圆盘摆放到柱子c上
# 3根柱子之间一次只能移动一个圆盘
def hanoi(n,a,b,c):
    # 2个盘子时,将小圆盘从a移到b;将大圆盘从a移到c;将小圆盘从b移到c
    # n个盘子时,把n-1个圆盘从a经c移到b;把第n个圆盘从a移到c;把n-1个圆盘从b经a移到c
    if n>0:
        hanoi(n-1,a,c,b)
        print("moving from %s to %s" %(a,c))
        hanoi(n-1,b,a,c)

if __name__ == "__main__":
    hanoi(3,"A","B","C")

3 查找

3.1 顺序查找(线性查找)

从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止

def linear_search(li,val):
    for ind,v in enumerate(li):
        if v==val:
            return val
        else:
            return None

if __name__=="__main__":
    li = list(range(10000))
    print(linear_search(li, 9900))

enumerate(sequence,[start=0])
sequence – 一个序列、迭代器或其他支持迭代对象。
start – 下标起始位置。
功能:将一个可遍历的数据对象(列表,元组,字典和字符串)组合成一个索引序列,同时列出数据下标和数据值
在这里插入图片描述

在这里插入图片描述

3.2 二分查找

def binary_search(li, val):
    left = 0
    right = len(li) - 1
    while left <= right:  # 候选区有值
        mid = (left + right) // 2
        if val == li[mid]:
            return mid
        elif val < li[mid]:
            right = mid - 1
        else:
            left = mid + 1
    else:
        return None


if __name__ == "__main__":
    li = list(range(10000))
    print(binary_search(li, 9900))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值