你怎么弄清楚Septenary Search的Big O和Big Omega?

时间:2016-01-27 03:23:11

标签: java algorithm runtime big-o big-theta

对于家庭作业,我们会给出一个名为“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来自的地方)。

2 个答案:

答案 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-Θ关系:

enter image description here

现在,您被问及最坏情况的复杂性,在这种情况下T(n) = T_U(n)。因此,最坏的情况是T(n) ∈ Θ(log_4 n)

答案 1 :(得分:0)

基本上这个算法的作用是:

  1. 获取大小为L
  2. 的排序列表n
  3. 将其拆分为7个子列表,其大小为n/7n/7 + 1
  4. 检查您的元素可能在哪个子列表中。
  5. 在此子列表上递归运行算法。
  6. 所以递归关系充其量只是

    T(n)  = T(n/7) + c
    

    最糟糕的情况是

    T(n) = T(n/7 + 1) + c  ≤  T(n/4) + c
    

    1/4来自于使用dfloor(n/7) + 1 = n/d最小化n > 7中的n mod 7 ≠ 0。它被n = 8最小化,并产生d = 4

    您现在可以使用masters theorem解决此问题。

    这导致每个最佳和最差情况T(n) ∈ Θ(log n)(因为忽略不同的日志基础等常数因素)