📅  最后修改于: 2021-01-12 03:31:40             🧑  作者: Mango
让我们考虑一个可以通过分而治之的技术解决的简单问题。
算法分析中的最大-最小问题是在数组中找到最大值和最小值。
要在大小为n的给定数组number []中找到最大和最小数目,可以使用以下算法。首先,我们代表天真的方法,然后我们将提出分而治之的方法。
天真的方法是解决任何问题的基本方法。在这种方法中,最大数量和最小数量可以分别找到。为了找到最大和最小数目,可以使用以下简单算法。
Algorithm: Max-Min-Element (numbers[])
max := numbers[1]
min := numbers[1]
for i = 2 to n do
if numbers[i] > max then
max := numbers[i]
if numbers[i] < min then
min := numbers[i]
return (max, min)
朴素方法的比较数为2n-2 。
使用分而治之方法可以减少比较次数。以下是技术。
用这种方法,将阵列分为两半。然后使用递归方法找到每个半部分的最大值和最小值。之后,返回每个半数的最大值和两个半数的最小值。
在这个给定的问题中,数组中元素的数量为$ y-x + 1 $,其中y大于或等于x 。
$ \ mathbf {\ mathit {Max-Min(x,y)}} $将返回数组$ \ mathbf {\ mathit {numbers [x … y]}} $的最大值和最小值。
Algorithm: Max - Min(x, y)
if y – x ≤ 1 then
return (max(numbers[x], numbers[y]), min((numbers[x], numbers[y]))
else
(max1, min1):= maxmin(x, ⌊((x + y)/2)⌋)
(max2, min2):= maxmin(⌊((x + y)/2) + 1)⌋,y)
return (max(max1, max2), min(min1, min2))
令T(n)为$ \ mathbf {\ mathit {Max-Min(x,y)}} $进行的比较次数,其中元素$ n = y-x + 1 $。
如果T(n)代表数字,则递归关系可以表示为
$$ T(n)= \ begin {cases} T \ left(\ lfloor \ frac {n} {2} \ rfloor \ right)+ T \ left(\ lceil \ frac {n} {2} \ rceil \ right )+2&for \:n> 2 \\ 1&for \:n = 2 \\ 0&for \:n = 1 \ end {cases} $$
让我们假设n的形式为2的幂。因此, n = 2 k ,其中k是递归树的高度。
所以,
$$ T(n)= 2.T(\ frac {n} {2})+ 2 = 2. \ left(\ begin {array} {c} 2.T(\ frac {n} {4})+ 2 \ end {array} \ right)+ 2 ….. = \ frac {3n} {2}-2 $$
与单纯方法相比,在分治法中,比较次数更少。但是,使用渐近符号,这两种方法都由O(n)表示。