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