算法入门001-递归、查找

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))

你可能感兴趣的:(算法,python,数据结构)