python - 合并排序与线性排序:用 Python 证明时间复杂度
问题描述
所以我的任务是证明合并排序的最坏情况比 Python 中具有 500,000 个值的元素的快速排序的最坏情况快多少倍。到目前为止,我已经编写了合并排序的代码,从 0 到 100 万之间的数字中随机选择,这就是我目前所拥有的。
我正要编写线性搜索的代码,直到我突然意识到我不知道如何证明每个算法的最坏情况快多少倍 - 以及我将如何证明它。
我应该怎么办?
解决方案
您可以使用该timeit
模块:
import timeit
def merge_sort(input_list):
...
def linear_sort(input_list):
...
list_input = [50, 345, ...]
print(timeit.timeit(f"merge_sort({list_input})", setup="from __main__ import merge_sort", number=1000))
print(timeit.timeit(f"linear_sort({list_input})", setup="from __main__ import linear_sort", number=1000))
number=
决定了它应该运行代码的次数。该timeit
模块准确地测量运行功能所花费的时间。需要设置代码来导入timeit
模块使用的功能,并且不包含在运行时间中。
如果您需要生成 500k 个元素的列表,类似这样的方法可能会起作用:
import random
list_input = [random.randint(0, 1000000) for _ in range(500000)]
您可以进一步将timeit
代码包含在一个while
或for
循环中,并取几次运行的平均值。
for _ in range(10):
merge_time += timeit.timeit(...)
linear_time += timeit.timeit(...)
merge_avg = merge_time / 10
linear_avg = linear_time / 10
print(f"Merge Sort was {merge_avg/linear_avg}x faster than Linear Sort")
推荐阅读
- c# - 我想为网站开发一个 CRUD 界面,但在 Edit 方法中不断出现错误
- botframework - 如何通过直线将活动从机器人对话框(c#)发送到客户端(角度)
- android - OnItemSelected 不适用于自定义微调器适配器类
- matlab - “double”类型的输入参数的未定义函数“taylorexp”
- file - 从 Kotlin 中的巨大文件中读取第一行
- java - spring boot 应用程序中配置的两个数据库
- elasticsearch - 松紧带。查找其子项与查询不匹配的文档
- plot - 从 gnuplot 中的数据文件中选择单行
- php - strpos() 仅有时有效
- php - PHP cURL通过API在帖子中抛出500错误