我创建了一个C ++程序,该程序输出算法的输入大小与执行时间(微秒),并将结果写入.csv文件。在LibreOffice Calc中导入.csv并绘制图形后,
我注意到,即使我搜索不在数组中的元素,对输入大小最大为10000的二进制搜索仍在恒定的时间内运行。同样,对于相同的输入大小,合并排序似乎在所有时间中都是线性时间而不是线性对数时间。
插入排序和气泡排序运行得很好,并且输出图非常类似于最坏情况下的二次复杂度。
我提供文件中的输入数组。对于n = 5,文件内容如下。每行代表一个输入数组:
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1
运行插入排序时的results.csv文件为:
Input,Time(ms)
5,4
4,3
3,2
2,2
1,2
最大输入100的二进制搜索图为here。
最大输入1000的合并排序图也是here,看起来很像是线性的(表中的值也暗示了这一点)。
对于为什么发生这种情况的任何帮助,将不胜感激。
这里是指向github存储库的源代码链接:https://github.com/dhanraj-s/Time-Complexity
答案 0 :(得分:1)
复杂度是关于渐近最坏情况的行为。
...最坏的情况...
如果输入允许,即使是二次算法也可能会退回到线性变量。它的复杂度仍然是二次的,因为在最坏的情况下,该算法只能保证二次运行。
...渐近...
很可能算法的渐近行为仅在输入大小比您选择的大得多时才开始稳定下来。
话虽这么说,实际上,复杂性并不是最有用的指标,但是如果您关心性能,则需要进行衡量。