DAA - Problema Max-Min
Vamos considerar um problema simples que pode ser resolvido pela técnica de dividir para conquistar.
Declaração do Problema
O problema Max-Min na análise de algoritmos é encontrar o valor máximo e mínimo em uma matriz.
Solução
Para encontrar os números máximo e mínimo em uma determinada matriz numbers[] de tamanho n, o seguinte algoritmo pode ser usado. Primeiro estamos representando onaive method e então apresentaremos divide and conquer approach.
Método Naïve
O método ingênuo é um método básico para resolver qualquer problema. Neste método, o número máximo e mínimo podem ser encontrados separadamente. Para encontrar os números máximo e mínimo, o seguinte algoritmo simples pode ser usado.
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)
Análise
O número de comparação no método ingênuo é 2n - 2.
O número de comparações pode ser reduzido usando a abordagem de dividir para conquistar. A seguir está a técnica.
Abordagem de divisão e conquista
Nesta abordagem, a matriz é dividida em duas metades. Então, usando a abordagem recursiva, os números máximo e mínimo em cada metade são encontrados. Posteriormente, retorne o máximo de dois máximos de cada metade e o mínimo de dois mínimos de cada metade.
Neste problema, o número de elementos em uma matriz é $ y - x + 1 $, onde y é maior que ou igual a x.
$ \ mathbf {\ mathit {Max - Min (x, y)}} $ retornará os valores máximo e mínimo de um array $ \ 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))
Análise
Deixei T(n) seja o número de comparações feitas por $ \ mathbf {\ mathit {Max - Min (x, y)}} $, onde o número de elementos $ n = y - x + 1 $.
E se T(n) representa os números, então a relação de recorrência pode ser representada como
$$ T (n) = \ begin {cases} T \ left (\ lfloor \ frac {n} {2} \ rfloor \ right) + T \ left (\ lceil \ frac {n} {2} \ rceil \ right ) +2 & para \: n> 2 \\ 1 & para \: n = 2 \\ 0 & para \: n = 1 \ final {casos} $$
Vamos supor que n está na forma de poder de 2. Conseqüentemente,n = 2k Onde k é a altura da árvore de recursão.
Então,
$$ 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 $$
Em comparação com o método Naïve, na abordagem dividir para conquistar, o número de comparações é menor. No entanto, usando a notação assintótica, ambas as abordagens são representadas porO(n).