简化这种指数算法的Big-O复杂性

时间:2012-07-03 15:40:18

标签: algorithm big-o combinatorics exponential binomial-coefficients

我有一个计数算法,我试图获得一般的大概描述。它是可怕的嵌套和可怕的指数。这是:

 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.

以下是每个运行时间的逐行概念

  1. 这是一个简单的分区,我只想给它一个常数c1。
  2. max_k是一个小数字,总是小于n,可能大约4或5.我将使用下面的k。
  3. 此循环始终运行2 ^ k *(n选择k)次
  4. 通过考虑第1行常量,我们可以推广这一行,并且知道在最坏的情况下它总是不会超过2 ^ n次,但通常会运行2 ^ n次,所以我们称之为(2 ^ N)/ C2
  5. 这是所有这些循环中的简单if语句操作,所以c3。
  6. 将所有这些相乘得出:

    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,那么它们是至关重要的。但由于它们总是占主导地位,它们能否像多项式运行时间的低阶项一样被丢弃?我想所有指数运行时间的混乱让我感到困惑。非常感谢任何建议。

1 个答案:

答案 0 :(得分:7)

  

我的理解是,如果k或max_k可以竞争或超过n,那么   它们至关重要

是的,但另一种方式不是 - 意思是 - 当涉及到大O符号时,它是不可忽视的,即使它不与n竞争。 只有当max_k以常数为界时才会被忽略(有一个常数c,使k <= c)。例如 - O(n * logk)算法不是O(n),因为k因子没有界限,因此存在knlogk > 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,Nn > N,但在处理产品时当然不是这样