对于家庭作业,我们会给出一个名为“Septenary Search"这就像二进制搜索,但不是将数据结构减半,而是将其细分为7组。我们要求通过编写递推方程并求解它来证明最坏情况运行时是在BigTheta(log n)中。
以下是septenary搜索的伪代码:
septenarySearch(L, s):
HELPER(L, 0, L.length-1, s)
HELPER(L, Lo, Hi, s):
if Hi - Lo + 1 > 7:
basic_group_size = floor((Hi - Lo + 1) / 7)
number_of_larger_groups = (Hi - Lo + 1) % 7
for i in 0 .. 6:
group_size = basic_group_size
if i < number_of_larger_groups:
group_size = group_size + 1
first_element_of_group = i*group_size
last_element_of_group = (i+1)*group_size - 1
if L[first_element_of_group] <= s <= L[last_element_of_group]:
return HELPER(L, first_element_of_group, last_element_of_group, s)
else:
for index in Lo .. Hi:
if s == L[index]:
return true
return false
我们还得到了一个提示,即考虑的元素数量 在对HELPER的递归调用中,至少是传入的范围(Lo和Hi之间)的1/7,并且数量不超过1/4。
我非常确定其中一个递推方程是T(n) = c + T(n/7)
,其中c
是一个常数值,我认为这会得到BigO(log n)。如果我试图证明Big Theta,我还需要证明BigOmega(log n),对吗?我如何找到BigOmega是什么?
我确定1/4应该用于查找BigOmega,但不确定如何做到这一点(或者甚至是1/4来自的地方)。
答案 0 :(得分:0)
提示:
Number of elements in recursive call >= n/7 (+)
Number of elements in recursive call <= n/4 (++)
因此,算法运行时间的下限和上限由
给出Lower bound:
Assume all recursive calls contains n/7 number of elements from
range passed to previous call call (n elements).
Recurrence relation:
T_L(n) = T(n/7) + c (i)
Upper bound:
Assume all recursive calls contains n/4 number of elements from
range passed to previous call call (n elements).
Recurrence relation:
T_U(n) = T(n/4) + c (ii)
您可以通过展开递归来解决(i)
和(ii)
,这将直接为您提供Big-Θ关系:
现在,您被问及最坏情况的复杂性,在这种情况下T(n) = T_U(n)
。因此,最坏的情况是T(n) ∈ Θ(log_4 n)
。
答案 1 :(得分:0)
基本上这个算法的作用是:
L
n
n/7
到n/7 + 1
所以递归关系充其量只是
T(n) = T(n/7) + c
最糟糕的情况是
T(n) = T(n/7 + 1) + c ≤ T(n/4) + c
1/4来自于使用d
和floor(n/7) + 1 = n/d
最小化n > 7
中的n mod 7 ≠ 0
。它被n = 8
最小化,并产生d = 4
。
您现在可以使用masters theorem解决此问题。
这导致每个最佳和最差情况T(n) ∈ Θ(log n)
(因为忽略不同的日志基础等常数因素)