使用guess / verify方法查找算法的下限

时间:2010-09-19 14:37:14

标签: algorithm complexity-theory big-o

我正在尝试对算法复杂性进行一些猜测,但每次我尝试使用指数时间进行猜测时,我的猜测/验证方法似乎都失败了。我确信我做的事情是荒谬的,我自己找不到。

例如,如果我有复发 T(n)= 2T(n-1)+ T(n-2)+ 1 其中T(1)= 0并且T(2)= 1

通过迭代几次并插入值n = 3,4,5,6,7,8 ...我们可以观察到对于任何n> = 8的值,T(n)> 2 ^ n,因此2 ^ n不是上限。

所以,知道这些信息我试着猜测T(n)= O(2 ^ n)

T(n)< = C(2 ^ n)

2T(n-1)+ T(n-2)+1< = C(2 ^ n)

2C(2 ^(n-1))+ C(2 ^(n-2))+ 1 <= c(2 ^ n)

C(2 ^ n)-C(2 ^ n + 2 ^(n-2))> = 1

C(-2 ^(n-2))> = 1

C> = 1 /(2 ^(n-2))|作为n->无穷大,表达式为零

这不是说我的猜测太高了吗?但是,我知道事实并非如此。任何人都可以看到我在哪里屠杀理论?感谢。

2 个答案:

答案 0 :(得分:2)

2T(n-1)+T(n-2)+1 <= C(2^n)2C(2^(n-1))+C(2^(n-2))+1 <= c(2^n)的过渡是错误的 如果T(n) <= C(2^n)您可以推断出2T(n-1)+T(n-2)+1 <= 2C(2^(n-1))+C(2^(n-2))+1而不是2C(2^(n-1))+C(2^(n-2))+1 <= c(2^n)

请注意2C(2^(n-1))=C(2^n),因此必须是2C(2^(n-1))+C(2^(n-2))+1 >= c(2^n)

答案 1 :(得分:2)

我认为在Itay的输入后你的代数是正确的,但你对n --> infinity的理解是错误的。

你是1/(2^(n-2)) --> 0,然后是c --> 0。但是,这并不代表c >= 0,这表明您的猜测太高了。相反,这表明c。因此,unordered_map<std::list<int> > graph可以是任何正常数,并暗示您的猜测很紧张。