T(n) = 2T(n/2) + 0(1)
T(n) = T(sqrt(n)) + 0(1)
在第一个中,我使用n,logn等的替换方法;都给了我错误的答案 重复树:我不知道我是否可以申请,因为根将是一个常数。
有人能帮忙吗?
答案 0 :(得分:11)
使用Master Theorem
来解决此类重复关系。
让 a 为大于或等于1的整数, b 为大于的实数 1.让 c 为正实数 d 非负实数。鉴于表格的重复出现
T(n)= a T(n / b)+ n c ..如果n> 1
T(n)= d ..如果n = 1
然后n为b的幂,
- 如果log b a< c,T(n)=Θ(n c ),
- 如果log b a = c,T(n)=Θ(n c log n),
- 如果log b a> c,T(n)=Θ(n log b a )。
醇>
1)T(n) = 2T(n/2) + 0(1)
在这种情况下
a = b = 2;
log b a = 1; c = 0(因为n c = 1 => c = 0)
案例(3)适用。所以T(n) = Θ(n)
:)
2)T(n) = T(sqrt(n)) + 0(1)
设m = log 2 n;
=> T(2 m )= T(2 m / 2 )+ 0(1)
现在重命名K(m)= T(2 m )=> K(m)= K(m / 2)+ 0(1)
应用案例(2)。
答案 1 :(得分:11)
让我们来看看第一个。首先,你需要知道T(基本情况)。你提到它是一个常数,但是当你解决这个问题时,你必须把它写下来。通常它就像T(1)= 1.我会使用它,但你可以推广到它是什么。
接下来,找出您重复的次数(即递归树的高度)。 n
是您的问题大小,那么我们可以多次将n重复除以2?从数学上讲,n/(2^i) = 1
时我是什么人?搞清楚,稍等一下。
接下来,做一些替换,直到你开始注意到一种模式。
T(n) = 2(2(2T(n/2*2*2) + θ(1)) + θ(1)) + θ(1)
好的,模式是我们将T()乘以2次,并将n除以2次。多少次? i
次。{/ p>
T(n) = (2^i)*T(n/(2^i)) + ...
对于最后的大-θ术语,我们使用了一个可爱的技巧。看看我们有几个替换的地方,并忽略T()部分。我们想要θ项的总和。请注意,它们相加(1 + 2 + 4 + ... + 2^i) * θ(1)
。你能找到1 + 2 + 4 + ... + 2^i
的封闭表格吗?我会给你那个;它是(2^i - 1)
。这是一个很好的记忆,但here's how you'd figure it out。
无论如何,总而言之,我们得到了
T(n) = (2^i) * T(n/(2^i)) + (2^i - 1) * θ(1)
如果你之前解决了i
,那么你知道i = log_2(n)
。将其插入,做一些代数,然后进入
T(n) = n*T(1) + (n - 1)*θ(1)
。 T(1) = 1
。所以T(n) = n + (n - 1)*θ(1)
。这是常数的n倍,加上常数加n。我们删除低阶项和常数,所以它是θ(n)。
Prasoon Saurav使用主方法是正确的,但重要的是你要知道复发关系的含义。要问的是,我在每一步做了多少工作,以及输入大小n
的步骤数是多少?
答案 2 :(得分:7)
对于第1部分,您可以使用Master Theorem作为@Prasoon Saurav建议。
对于第2部分,只需展开重复:
T(n) = T(n ^ 1/2) + O(1) // sqrt(n) = n ^ 1/2
= T(n ^ 1/4) + O(1) + O(1) // sqrt(sqrt(n)) = n ^ 1/4
etc.
系列将继续k
个字词,直至n ^ 1/(2^k) <= 1
,即2^k = log n
或k = log log n
。这给了T(n) = k * O(1) = O(log log n)
。
答案 3 :(得分:1)
让我们看看第一次重现,T(n)= 2T(n / 2)+ 1.这里我们的线索是n / 2:每个嵌套术语的参数是其父项的一半。因此,如果我们从n = 2 ^ k开始,那么在我们的基础情况T(0)之前,我们将在扩展中使用k个术语,每个术语在总数中加1。因此,假设T(0)= 1,我们可以说T(2 ^ k)= k + 1.现在,由于n = 2 ^ k,我们必须具有k = log_2(n)。因此T(n)= log_2(n)+ 1。
我们可以对你的第二次重复使用相同的技巧,T(n)= T(n ^ 0.5)+ 1.如果我们从n = 2 ^ 2 ^ k开始,我们将在扩展中使用k项,每次添加1到总数。假设T(0)= 1,我们必须有T(2 ^ 2 ^ k)= k + 1.由于n = 2 ^ 2 ^ k,我们必须有k = log_2(log_2(n)),因此T(n) = log_2(log_2(n))+ 1。
答案 4 :(得分:0)
递归关系和递归函数也应该从f(1)开始解决。在情况1中,T(1)= 1; T(2)= 3; T(4)= 7; T(8)= 15;很明显,T(n)= 2 * n -1,其中O符号为O(n) 在第二种情况下,T(1)= 1; T(2)= 2; T(4)= 3; T(16)= 4; T(256)= 5; T(256 * 256)= 6;需要很少的时间才能发现T(n)= log(log(n))+ 1其中log是基数2.显然这是O(log(log(n))关系。
答案 5 :(得分:0)
大多数情况下,处理重复的最佳方法是绘制重复树并小心处理基本情况。
但是在这里,我会给你一些轻微的提示来解决使用替换方法。
重复尝试首先尝试替换n = 2^k
在重复尝试第二次尝试替换n = 2^2^k