哪种复杂性更好?

时间:2014-05-15 16:01:25

标签: algorithm graph big-o complexity-theory

假设图表具有N个节点和M个边,并且迭代总数为k。 (k是一个大于1的常数,与NM无关。

D=M/N成为图表的平均度数。

我有两种基于图形的迭代搜索算法 第一种算法的复杂度为O(D^{2k})时间 第二种算法的复杂度为O(k*D*N)时间。

基于他们的大O时间复杂度,哪一个更好?

有些人告诉我,第一个更好,因为图中节点N的数量通常远大于现实世界中的D

其他人说第二个更好,因为第一个k指数增加,而第二个指数线性增加。

3 个答案:

答案 0 :(得分:3)

摘要

你的两个O都没有统治另一个,所以正确的方法是根据输入选择算法

O支配

  1. 第一个在D<1(稀疏图表)和类似情况时更好。

  2. D相对较大

  3. 时,第二种情况会更好

    算法选择

    重要参数不仅仅是O,而是它前面的实际常数。 例如,O(n)算法实际上100000*n 更差而不是O(n^2)n^2时只有n<100000

    因此,给定图形和所需的迭代计数k,您需要估计每个算法的预期性能并选择最佳算法。

答案 1 :(得分:2)

Big-O表示法描述了函数如何增长,当它的参数增长时。因此,如果您想估计算法时间消耗的增长,您应该首先估计D和N将如何增长。这需要您域中的一些其他信息。

如果我们假设N无论如何都会增长。对于D,您有几种选择:

  1. D保持不变 - 第一个算法肯定更好
  2. DN成比例增长 - 第二种算法更好
  3. 更一般地说:如果D增长速度超过N^(1/(2k-1)),则应选择第一种算法,否则选择第二种算法。

答案 2 :(得分:0)

对于每个固定的D,D ^(2k)是常数,因此如果M足够大,则第一个算法将击败第二个算法。然而,足够大的东西取决于D.如果D不是恒定的或有限的,则无法比较这两种复杂性。

在实践中,您将实现两种算法,找到它们实际速度的良好近似值,并根据您的值选择一个更快的值。