我有一个计数算法,我试图获得一般的大概描述。它是可怕的嵌套和可怕的指数。这是:
1. For each T_i in T
2. For k = 1 to max_k
3. For each of 2^k*(n choose k) items
4. For each t in T_i
5. check if the item is in t...etc.
以下是每个运行时间的逐行概念
将所有这些相乘得出:
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
由于我想要一个大O表示,忽略常量给出:
k * 2^k * (n choose k) * (2^n)
众所周知,(n选择k)以(n * e / k)^ k为界,因此:
O(k * 2^k * (n * e / k)^k * (2^n))
我的问题是,我在这里可以忽略什么...... 2 ^ n当然是主导术语,因为n总是大于k,通常更加如此。这可以简化为O(2 ^ n)吗?或者O(2 ^可怕)?或者我应该留在2 ^ k,如在O(2 ^ k * 2 ^ n)? (或保留所有条款?)
我的理解是,如果k或max_k可以竞争或超过n,那么它们是至关重要的。但由于它们总是占主导地位,它们能否像多项式运行时间的低阶项一样被丢弃?我想所有指数运行时间的混乱让我感到困惑。非常感谢任何建议。
答案 0 :(得分:7)
我的理解是,如果k或max_k可以竞争或超过n,那么 它们至关重要
是的,但另一种方式不是 - 意思是 - 当涉及到大O符号时,它是不可忽视的,即使它不与n竞争。 只有当max_k以常数为界时才会被忽略(有一个常数c
,使k <= c
)。例如 - O(n * logk)
算法不是O(n)
,因为k因子没有界限,因此存在k
,nlogk > c*n
为每个常数c
由于您获得的表达式是一个产品,因此您可以忽略的只是常量,在您的情况下 - 只有e
才能获得O(k*2^k * (n/k)^k * 2^n)
。
如果k
有界,那么您可以将其从表达式中删除,也可以使用大O表示法,然后您将获得O(n^k* 2^n)
。请注意,即使在这种情况下,虽然n^k << 2^n
仍然无法忽略,因为对于每个常量c,存在一些n
,使得c*2^n < n^k *2^n
,因此算法不是{{1}一个。
在添加时可以忽略较小的因素。如果O(2^n)
然后是k < n
,因为有一个常量O(n + k) = O(n)
,对于所有c,N
:n > N
,但在处理产品时当然不是这样