我有一个计数算法,我正在尝试获得一个一般的 big-o 描述。它是可怕的嵌套和可怕的指数。这里是:
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。
- max_k 是一个很小的数字,总是小于 n,可能在 4 或 5 左右。我将在下面使用 k。
- 此循环始终运行 2^k*(n 选择 k) 次
- 通过考虑第 1 行的常数,我们可以概括这条线,并且知道在最坏的情况下它总共不会触发超过 2^n 次,但通常会运行 2^n 次的一小部分,所以我们称之为 (2^n n)/c2
- 这是所有这些循环中的简单 if 语句操作,所以 c3.
将所有这些相乘得到:
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
由于我想要一个大 O 表示,忽略常量给出:
k * 2^k * (n choose k) * (2^n)
已知 (n choose k) 以 (n * e / k)^k 为界,所以:
O(k * 2^k * (n * e / k)^k * (2^n))
我的问题是,我可以在这里忽略什么... 2^n 肯定是主要术语,因为 n 总是大于 k,而且通常更大。这可以简化为 O(2^n) 吗?还是 O(2^terrible)?还是我应该留在 2^k 中,如 O(2^k * 2^n)?(或保留所有条款?)
我的理解是,如果 k 或 max_k 可以竞争或超过 n,那么它们至关重要。但是由于它们总是被支配,它们可以像多项式运行时间的低阶项一样被丢弃吗?我想所有指数运行时间的混乱都让我感到困惑。任何意见是极大的赞赏。