确定正数c& n0表示以下重复次数(使用替换方法):
T(n)= T(上限(n / 2))+ 1 ......猜猜是大哦(n的对数基数为2)
T(n)= 3T(floor(n / 3))+ n ... Guess是Big-Omega(n *的对数基数为3)
T(n)= 2T(floor(n / 2)+17)+ n ......猜猜是大哦(n * n的基数2)。
我正在解决问题1:
我们的猜测是:T(n)= O(log_2(n))。 通过归纳假设假设对于所有k <1,T(k)<= c * log_2(k)。 n,这里c是const&amp; c> 0
T(n) = T(ceiling(n/2)) + 1
<=> T(n) <= c*log_2(ceiling(n/2)) + 1
<=> " <= c*{log_2(n/2) + 1} + 1
<=> " = c*log_2(n/2) + c + 1
<=> " = c*{log_2(n) - log_2(2)} + c + 1
<=> " = c*log_2(n) - c + c + 1
<=> " = c*log_2(n) + 1
<=> T(n) not_<= c*log_2(n) because c*log_2(n) + 1 not_<= c*log_2(n).
要解决这个问题,请使用以下技巧:
T(n) = T(ceiling(n/2)) + 1
<=> " <= c*log(ceiling(n/2)) + 1
<=> " <= c*{log_2 (n/2) + b} + 1 where 0 <= b < 1
<=> " <= c*{log_2 (n) - log_2(2) + b) + 1
<=> " = c*{log_2(n) - 1 + b} + 1
<=> " = c*log_2(n) - c + bc + 1
<=> " = c*log_2(n) - (c - bc - 1) if c - bc -1 >= 0
c >= 1 / (1 - b)
<=> T(n) <= c*log_2(n) for c >= {1 / (1 - b)}
so T(n) = O(log_2(n)).
This solution is seems to be correct to me ... My Ques is: Is it the proper approach to do?
Thanks to all of U.
答案 0 :(得分:1)
问题#1:
设n = 2 ^(m + 1),得到T(n)= t0 + log_2(n)= O(log_2(n))
问题#2:
设n = 3 ^(m + 1),得到T(n)= nt0 + nlog_3(n)= O(nlog_3(n))。
问题#3:
考虑n = 34.T(34)= 2T(17 + 17)+ 34 = 2T(34)+ 34.我们可以解决这个问题,发现T(34)= -34。我们还可以看到,对于奇数n,T(n)= 1 + T(n-1)。我们继续找到修复的值:
我们得到T(32)= 2T(33)+ 32 = 2T(32)+ 34,意味着T(32)= -34。工作后记,我们得到
正如您所看到的,这种复发比其他复杂有点复杂,因此,您应该仔细看看这一点。如果我有任何其他想法,我会回来;否则,你就是自己。
编辑:
再看一下#3之后,你的评估看起来就像是O(nlog_2(n))。所以你可以尝试列出一堆数字 - 我是从n = 0到n = 45。你注意到一种模式:它从负数到n = 43,44左右的正数。要获取序列的下一个偶数索引元素,可按以下顺序添加2的幂:4,8,4,16,4,8,4,32,4,8,4,16,4,8 ,4,64,4,8,4,16,4,8,4,32 ......
这些数字基本上是你标记一个任意长度的标尺......四分之一,一半,八分之一等等。因此,我们可以解决找到和1 + 2 +的顺序的等价问题1 + 4 + 1 + 2 + 1 + 8 + ......(与我们相同,除以4,我们的移位,但顺序仍然有效)。通过观察前k个数的总和(其中k是2的幂)等于和((n /(2 ^(k + 1))2 ^ k)=(1/2)sum(n)对于k = 0到log_2(n),我们得到简单的递归由(n / 2)log_2(n)给出。乘以4得到我们的,并将x向右移动34并且可能加一个常数值结果。所以我们正在玩y = 2nlog_n(x)+ k'来获得一些常数k'。
呼。这是一个棘手的问题。请注意,此重复不承认任何仲裁“初始条件”;换句话说,复发并不描述一系列序列,而是一个特定的序列,没有参数化。
答案 1 :(得分:1)
第一次练习:
我们希望通过归纳显示T(n) <= ceiling(log(n)) + 1
。
我们假设T(1) = 1
,而不是T(1) = 1 <= ceiling(log(1)) + 1 = 1
,并且证明了归纳的基础。
现在,我们假设每个1 <= i < n
持有T(i) <= ceiling(log(i)) + 1
。
对于归纳步骤,我们必须区分n为偶数且何时为奇数的情况。
如果n是偶数:T(n) = T(ceiling(n/2)) + 1 = T(n/2) + 1 <= ceiling(log(n/2)) + 1 + 1 = ceiling(log(n) - 1) + 1 + 1 = ceiling(log(n)) + 1
。
如果n是奇数:T(n) = T(ceiling(n/2)) + 1 = T((n+1)/2) + 1 <= ceiling(log((n+1)/2)) + 1 + 1 = ceiling(log(n+1) - 1) + 1 + 1 = ceiling(log(n+1)) + 1 = ceiling(log(n)) + 1
最后一段是棘手的,但是很可能,因为n是奇数,然后它不能是2的幂。