O(n) - 按字典顺序排列的下一个排列

时间:2012-09-21 18:03:44

标签: algorithm

我只是想知道this algorithm的效率(O(n))是多少:

  1. 找到最大的索引k,使得a [k]< a [k + 1]。如果不存在这样的索引,则排列是最后的排列。
  2. 找到最大的索引l,使得a [k]&lt;一个[1]。由于k + 1是这样的指数,因此l被很好地定义并且满足k <1。湖
  3. 用[l]交换[k]。
  4. 将序列从[k + 1]反转到最后一个元素a [n]。
  5. 据我所知,最坏的情况是O(n)= n(当k是先前置换的第一个元素时),最佳情况O(n)= 1(当k是先前置换的最后一个元素时)。

    我可以说O(n)= n / 2?

4 个答案:

答案 0 :(得分:2)

O(n) = n/2毫无意义。让f(n) = n成为算法的运行时间。然后正确的说法就是f(n)位于O(n)O(n)是一组函数,在n中最多渐近线性。

您的优化会产生预期的运行时间g(n) = n/2g(n)也位于O(n)。事实上O(n) = O(n/2)所以你节省一半的时间不会改变渐近的复杂性。

答案 1 :(得分:1)

算法中的所有步骤都渐近O(n)

您的平均值不正确。仅仅因为最好的情况是O(1)而最坏的情况是O(n),你不能说算法需要O(n)= n / 2。 Big O表示法仅用于算法的上限。

因此,无论最佳情况如何,算法仍为O(n)

答案 2 :(得分:0)

没有O(n)= n / 2。

当你进行O(n)计算时,你只是想找到函数依赖,你不关心系数。所以没有O(n)= n / 2,就像没有O(n)= 5n

答案 3 :(得分:0)

渐近地,O(n)与O(n / 2)相同。在任何情况下,都为n中的每一个执行算法!排列,所以顺序远大于你的估计(大约为n!)。