假设图表具有N
个节点和M
个边,并且迭代总数为k
。
(k
是一个大于1的常数,与N
和M
无关。
让D=M/N
成为图表的平均度数。
我有两种基于图形的迭代搜索算法
第一种算法的复杂度为O(D^{2k})
时间
第二种算法的复杂度为O(k*D*N)
时间。
基于他们的大O
时间复杂度,哪一个更好?
有些人告诉我,第一个更好,因为图中节点N
的数量通常远大于现实世界中的D
。
其他人说第二个更好,因为第一个k
指数增加,而第二个指数线性增加。
答案 0 :(得分:3)
你的两个O
都没有统治另一个,所以正确的方法是根据输入选择算法
O
支配第一个在D<1
(稀疏图表)和类似情况时更好。
当D
相对较大
重要参数不仅仅是O
,而是它前面的实际常数。
例如,O(n)
算法实际上100000*n
更差而不是O(n^2)
,n^2
时只有n<100000
。
因此,给定图形和所需的迭代计数k
,您需要估计每个算法的预期性能并选择最佳算法。
答案 1 :(得分:2)
Big-O表示法描述了函数如何增长,当它的参数增长时。因此,如果您想估计算法时间消耗的增长,您应该首先估计D和N将如何增长。这需要您域中的一些其他信息。
如果我们假设N
无论如何都会增长。对于D
,您有几种选择:
D
保持不变 - 第一个算法肯定更好D
与N
成比例增长 - 第二种算法更好更一般地说:如果D
增长速度超过N^(1/(2k-1))
,则应选择第一种算法,否则选择第二种算法。
答案 2 :(得分:0)
对于每个固定的D,D ^(2k)是常数,因此如果M足够大,则第一个算法将击败第二个算法。然而,足够大的东西取决于D.如果D不是恒定的或有限的,则无法比较这两种复杂性。
在实践中,您将实现两种算法,找到它们实际速度的良好近似值,并根据您的值选择一个更快的值。