在大小为N的数据集上给出以下算法:
什么是大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的东西里闲聊。
答案 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