我正在尝试对算法复杂性进行一些猜测,但每次我尝试使用指数时间进行猜测时,我的猜测/验证方法似乎都失败了。我确信我做的事情是荒谬的,我自己找不到。
例如,如果我有复发 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->无穷大,表达式为零
这不是说我的猜测太高了吗?但是,我知道事实并非如此。任何人都可以看到我在哪里屠杀理论?感谢。
答案 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
可以是任何正常数,并暗示您的猜测很紧张。