分治递归的高级主定理

cserver side programmingprogramming

分治是一种基于递归将问题分支为多个相似类型的子问题的范式,这些子问题可以轻松解决。

示例

让我们举一个例子来了解有关分治技术的更多信息 −

function recursive(input x size n)
   if(n < k)
      将输入分为 m 个大小为 n/p 的子问题。
      并递归调用每个子问题的 f
    else
      求解 x 并返回

合并所有子问题的结果并返回原始问题的解。

解释 − 在上述问题中,问题集将被细分为可以轻松解决的较小子问题。

分而治之大师定理是一个分析定理,可用于确定递归关系算法的大 0 值。它用于查找算法所需的时间,并以渐近符号形式表示。

上例中问题的运行时间值示例 −

T(n) = f(n) + m.T(n/p)

对于大多数递归算法,您将能够使用大师定理找到算法的时间复杂度,但有些情况下大师定理可能不适用。这些是大师定理不适用的情况。当问题T(n)不是单调时,例如,T(n) = sin n。问题函数f(n)不是多项式。

由于在这些情况下查找时间复杂度的大师定理效率不高,因此设计了递归递归的高级大师定理。它旨在处理形式为 − 的递归问题。

T(n) = aT(n/b) + ø((n^k)logpn)

其中 n 是问题的大小。

a = 递归中的子问题数,a > 0

n/b = 每个子问题的大小 b > 1,k >= 0 且 p 为实数。

为了解决此类问题,我们将使用以下解决方案,

  • 如果 a>bk,则 T(n) = ∅ (nlogba)
  • 如果 a = bk,则
    • 如果 p> -1,则 T(n) = ∅(nlogba logp+1n)
    • 如果 p = -1,则 T(n) = ∅(nlogba loglogn)
    • 如果 p < -1,则 T(n) = ∅(nlogba)
  • 如果 a<bk ,则
    • 如果 p> = 0,则 T(n)= ∅(nklogpn)
    • 如果 p< 0,则 T(n) = ∅(nk)

利用高级大师算法,我们将计算一些算法的复杂度 −

二分查找 − t(n) = θ(logn)

归并排序 − T(n) = θ(nlogn)


相关文章