这个由两部分组成的算法的Big-O是什么?

时间:2011-03-22 05:47:53

标签: algorithm complexity-theory big-o

在大小为N的数据集上给出以下算法:

  1. 将数据分成M =(N / lg N) O(N)时间内的块。
  2. 将块分区为O(M lg M)时间。 *
  3. 什么是大O?我如何评估(N / lg N)* lg(N / lg N)?

    如果不是O(N),是否有一个小到足以使整个事物成为O(N)?

    * 分区算法是STL的stable_partition,在此示例中,它将进行M次测试,最多进行M lg M次交换。 但是,被交换的项目是大小为lg N的块。如果它们必须交换到适当位置,这是否会将步骤2的实际时间推回到O(N lg N)?

    不是家庭作业,只是一个工作的工程师在comp-sci的东西里闲聊。

2 个答案:

答案 0 :(得分:4)

你通过做一些数学评估。

log(x/y) = log(x) - log(y)
- >
log(N / log(N)) = log(N) - log(log(N))

因此,将其重新插入并合并为一个部分 N(log(N) - log(log(N))) / log(N)
=
N - N(log(log(N)) / log(N))
< =,因为log(log(N))< = log(N)为N - > inf。,就像乘以< = 1
N

所以,整个事情是O(N)。

通过注意M = N / log N本身就是O(N),你可以很容易地猜到它是O(N log N)。由于不得不在log M中加倍,我不知道有一个快速的方法来弄清楚它是O(N)而我没有一点疑问。

答案 1 :(得分:2)

是O(N):

N / lgN * lg(N / lgN)=N / lgN * (lgN-lglgN)=N*(1-lglgN / lgN)<=N