数据结构 时间空间复杂度 汉诺塔递归问题 查找算法

时间复杂度——小结

1.时间复杂度使用来估计算法运行时间的一个单位

2.时间复杂度高的算法比低的算法慢

3.常见时间复杂度(按效率排序)
O(1)< O(logn)< O(n)< O(nlogn)< O(n方)< O(n三方)

#如何快速判断算法复杂度
# 1.确定问题规模n
# 2.循环减半过程——logn
# 3.K层关于n的循环——n的k方
# 4.复杂情况:根据算法执行过程具体判断

‘’’
/时间比空间重要/——空间换时间
空间复杂度:用来评估算法内存占用大小的式子
‘’’

‘’’
递归的两个特点:
1.调用自身
2.结束条件

**

汉诺塔问题:

n个盘子时:
1.把n-1个圆盘从A经过C移动到B(把上面n-1个盘子看成一个整体)
2.把第n个圆盘从A移动到C
3.把n-1个圆盘从B经过A移动到C
‘’’

#sum = 0
def hanoi(n, a, b, c):
# global sum
if n > 0:
hanoi(n - 1, a, c, b)
sum += 1
print(‘moving from %s to %s’ % (a, c))
hanoi(n - 1, b, a, c)
# print(sum)

hanoi(4, ‘A’, ‘B’, ‘C’)

‘’’

查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程

1.顺序查找(Linear search)

‘’’
from cal_time import *

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

#enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列
#同时列出数据和数据下标,一般用在 for 循环当中

2.二分查找(Binary Search)O(logn)

@cal_time
def binary_search(li,val):
left = 0
right = len(li)-1
while left <= right:
mid = (left + right)//2
if li[mid] == val:
return mid
elif li[mid] > val:
right = mid - 1
else:
left = mid + 1
else:
return None

#li = [1,2,3,4,5,6,7,8,9,10]
li = list(range(10000))
linear_search(li,3)
binary_search(li,3809)

——————————————————

算法时间计算函数模块

import time

def cal_time(func):
def wraper(*args,**kwargs):
t1 = time.time()
result = func(*args,**kwargs)
t2 = time.time()
print(’%s running time %s s’ % (func.name, t2-t1))
return result
return wraper

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值