重要的是思想,而不是靠哪种语言实现 每台机器执行的总时间不同,但是执行的基本预算量大体相同
# 第二次尝试 import time start_time = time.time() # 注意是两重循环 for a in range(0, 1001): for b in range(0, 1001 - a): c = 1000 - a - b if a ** 2 + b ** 2 == c ** 2: print("a, b, c: %d, %d, %d" % (a, b, c)) end_time = time.time() print("elapsed: %f" % (end_time - start_time)) print("complete!") ''' a, b, c: 0, 500, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 1.356157 complete! '''时间复杂度,就是要计算的步骤基本数量总和
如何理解大“O”记法
最坏时间复杂度
时间复杂度的几条基本计算规则
# 第一次尝试 for a in range(0, 1001): for b in range(0, 1001): for c in range(0, 1001): if a**2 + b**2 == c**2 and a+b+c == 1000: print("a, b, c: %d, %d, %d" % (a, b, c)) # 时间复杂度:T(n) = O(n*n*n) = O(n3) # 第二次尝试 for a in range(0, 1001): for b in range(0, 1001-a): c = 1000 - a - b if a**2 + b**2 == c**2: print("a, b, c: %d, %d, %d" % (a, b, c)) # 时间复杂度:T(n) = O(n*n*(1+1)) = O(n*n) = O(n2)常见的时间复杂度
常见时间复杂度之间的关系
list中 append 和 insert的快慢
def t6(): li = [] for i in range(10000): li.append(i) def t7(): li = [] for i in range(10000): li.insert(0, i) # 在前面添加一个元素的方法 timer6 = Timer("t6()", "from __main__ import t6") print("append", timer6.timeit(1000)) timer7 = Timer("t7()", "from __main__ import t7") print("append", timer7.timeit(1000)) # append 更快,往后面添加数据更快,因为列表是栈数据类型的pop操作测试
x = range(2000000) pop_zero = Timer("x.pop(0)", "from __main__ import x") print("pop_zero ", pop_zero.timeit(number=1000), "seconds") x = range(2000000) pop_end = Timer("x.pop()", "from __main__ import x") print("pop_end ", pop_end.timeit(number=1000), "seconds") # ('pop_zero ', 1.9101738929748535, 'seconds') # ('pop_end ', 0.00023603439331054688, 'seconds') # 从结果可以看出,pop最后一个元素的效率远远高于pop第一个元素list内置操作的时间复杂度
''' index[] 索引取值 index assignment 按照索引的方式赋值 pop(i) 从指定位置剔除, 最坏复杂度,所以是O(n) del 代表一个元素一个元素都要去清空 iteration 迭代 如使用for操作 contains(in) 使用in 操作符,也需要遍历一遍 get slice[x:y] 取切片 O(k) 先定位x只需要O(1),在定位到Y,这时只跟距离有关系,和n没关系 del slice 删除后,会将元素往前移 set slice 设置 会先删除,然后再补充,所以是O(n+k) # li=[1,2,3,4,5,6] # li[0:3]=[8,9,10,11] 切片赋值 reverse 逆置 concatenate 加的操作,将第二个列表中的元素补充进去, 指的是第二个列表中有多少个元素,所以只和K有关 '''解决一组数据如何保存,它的保存形式是怎么样的, 数据结构就是对 基本数据类型的一次封装
''' name age hometown # 如果用列表来存 [("zhangsan", 24, "beijing"), ("zhangsan", 24, "beijing"), ("zhangsan", 24, "beijing"), ] # 如何取出 for stu in stus: if stu(0)== "zhangsan": # 第二种,列表中嵌套字典 [{"name":"zhangsan","age":23,"hometown":"beijing"},] #用字典来存 {"zhangsan":{"age":24,"hometown":""},} # 取出,直接用键就可以了 stus["zhangsan"] '''二维数组,多为数组,广义表,树结构,图结构