📜  DAA-最大-最小问题

📅  最后修改于: 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)表示