example01.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. import numpy
  21. def seq_search(items: list, elem) -> int:
  22. """顺序查找"""
  23. for index, item in enumerate(items):
  24. if elem == item:
  25. return index
  26. return -1
  27. def bin_search(items, elem):
  28. """二分查找"""
  29. start, end = 0, len(items) - 1
  30. while start <= end:
  31. mid = (start + end) // 2
  32. if elem > items[mid]:
  33. start = mid + 1
  34. elif elem < items[mid]:
  35. end = mid - 1
  36. else:
  37. return mid
  38. return -1
  39. def main():
  40. """主函数(程序入口)"""
  41. num = 6
  42. styles = ['r-.', 'g-*', 'b-o', 'y-x', 'c-^', 'm-+', 'k-d']
  43. legends = ['对数', '线性', '线性对数', '平方', '立方', '几何级数', '阶乘']
  44. x_data = [x for x in range(1, num + 1)]
  45. y_data1 = [log2(y) for y in range(1, num + 1)]
  46. y_data2 = [y for y in range(1, num + 1)]
  47. y_data3 = [y * log2(y) for y in range(1, num + 1)]
  48. y_data4 = [y ** 2 for y in range(1, num + 1)]
  49. y_data5 = [y ** 3 for y in range(1, num + 1)]
  50. y_data6 = [3 ** y for y in range(1, num + 1)]
  51. y_data7 = [factorial(y) for y in range(1, num + 1)]
  52. y_datas = [y_data1, y_data2, y_data3, y_data4, y_data5, y_data6, y_data7]
  53. for index, y_data in enumerate(y_datas):
  54. pyplot.plot(x_data, y_data, styles[index])
  55. pyplot.legend(legends)
  56. pyplot.xticks(numpy.arange(1, 7, step=1))
  57. pyplot.yticks(numpy.arange(0, 751, step=50))
  58. pyplot.show()
  59. if __name__ == '__main__':
  60. main()