CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
jackfrued

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: jackfrued/Python-100-Days
Path: blob/master/Day16-20/code/example01.py
Views: 729
1
"""
2
查找 - 顺序查找和二分查找
3
算法:解决问题的方法(步骤)
4
评价一个算法的好坏主要有两个指标:渐近时间复杂度和渐近空间复杂度,通常一个算法很难做到时间复杂度和空间复杂度都很低(因为时间和空间是不可调和的矛盾)
5
表示渐近时间复杂度通常使用大O标记
6
O(c):常量时间复杂度 - 哈希存储 / 布隆过滤器
7
O(log_2 n):对数时间复杂度 - 折半查找
8
O(n):线性时间复杂度 - 顺序查找
9
O(n * log_2 n):- 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序)
10
O(n ** 2):平方时间复杂度 - 简单排序算法(冒泡排序、选择排序、插入排序)
11
O(n ** 3):立方时间复杂度 - Floyd算法 / 矩阵乘法运算
12
也称为多项式时间复杂度
13
O(2 ** n):几何级数时间复杂度 - 汉诺塔
14
O(3 ** n):几何级数时间复杂度
15
也称为指数时间复杂度
16
O(n!):阶乘时间复杂度 - 旅行经销商问题 - NP
17
"""
18
from math import log2, factorial
19
from matplotlib import pyplot
20
21
import numpy
22
23
24
def seq_search(items: list, elem) -> int:
25
"""顺序查找"""
26
for index, item in enumerate(items):
27
if elem == item:
28
return index
29
return -1
30
31
32
def bin_search(items, elem):
33
"""二分查找"""
34
start, end = 0, len(items) - 1
35
while start <= end:
36
mid = (start + end) // 2
37
if elem > items[mid]:
38
start = mid + 1
39
elif elem < items[mid]:
40
end = mid - 1
41
else:
42
return mid
43
return -1
44
45
46
def main():
47
"""主函数(程序入口)"""
48
num = 6
49
styles = ['r-.', 'g-*', 'b-o', 'y-x', 'c-^', 'm-+', 'k-d']
50
legends = ['对数', '线性', '线性对数', '平方', '立方', '几何级数', '阶乘']
51
x_data = [x for x in range(1, num + 1)]
52
y_data1 = [log2(y) for y in range(1, num + 1)]
53
y_data2 = [y for y in range(1, num + 1)]
54
y_data3 = [y * log2(y) for y in range(1, num + 1)]
55
y_data4 = [y ** 2 for y in range(1, num + 1)]
56
y_data5 = [y ** 3 for y in range(1, num + 1)]
57
y_data6 = [3 ** y for y in range(1, num + 1)]
58
y_data7 = [factorial(y) for y in range(1, num + 1)]
59
y_datas = [y_data1, y_data2, y_data3, y_data4, y_data5, y_data6, y_data7]
60
for index, y_data in enumerate(y_datas):
61
pyplot.plot(x_data, y_data, styles[index])
62
pyplot.legend(legends)
63
pyplot.xticks(numpy.arange(1, 7, step=1))
64
pyplot.yticks(numpy.arange(0, 751, step=50))
65
pyplot.show()
66
67
68
if __name__ == '__main__':
69
main()
70
71