在我的算法类项目中,我们必须运行5种不同类型的未知类型的排序方法,并使用针对问题大小的加倍方法为每种方法收集运行时间数据。然后,我们必须使用运行时间的比率来计算时间复杂度函数。使用的排序方法是选择排序,插入排序,合并排序和快速排序(随机和非随机)。我们必须使用经验分析来确定程序中的五个未知方法中使用的排序方法类型。我的问题是如何从比例到功能。我知道N = 2 ^ k,所以我们可以使用log(base2)ratio = k,但是我不确定这与say mergesort的时间复杂度O(N * log N)有何关系。
答案 0 :(得分:4)
Big-O标记或多或少描述了一个函数,其中输入N
是集合的大小,输出是将花费多少时间。我建议通过运行各种样本输入大小,然后收集运行时间来对算法进行基准测试。例如,对于选择排序,您可能会收集以下数据:
N | running time (ms)
1000 | 0.1
10000 | 10
100000 | 1000
1000000 | 100000
如果使用R或Matlab之类的工具进行绘制,或者如果感到懒惰,则可能使用Excel进行绘制,您会发现运行时间随样本大小{{1的平方 }}。也就是说,将样本大小乘以10会导致运行时间增加100倍。这是N
的行为。
对于其他算法,您可以收集相似的基准数据,并创建图。
请注意,您必须牢记诸如启动时间之类的东西,Java可以花这些时间开始运行您的实际代码。解决此问题的方法是获取许多数据点。总体而言,线性,对数等行为仍应可辨别。
答案 1 :(得分:0)
在对数-对数图(大小与运行时间的对数)上,您会发现O(n^k)
是斜率k的线。这样一来,您就可以很容易地从O(n)
告诉O(n^2)
。
要通过O(n)
与O(n log(n))
来比较f(n)/n
中的log(n)
。 O(n)
的函数看起来像一条水平线,而O(n log(n))
的函数看起来像是一条斜率为1的线。
别忘了将有序数据和无序数据都扔给您的方法。
答案 2 :(得分:0)
您可以按时间查看增长情况;
请注意,计时是理论上的。期望值在某个阈值附近。