Maximum és minimum kiválasztás (algoritmus)

A Programozás Wiki wikiből
(Maximum kiválasztás (algoritmus) szócikkből átirányítva)

Maximum kiválasztás[szerkesztés]

Maximum kiválasztásnál általában egy adathalmaz ( tömb vagy más adatszerkezet) elemei közül az (egyik) legnagyobb megkereséséről van szó. Amennyiben az adathalmaz rendezett a kiválasztás alapjául is szolgáló szempont szerint, úgy a maximum a halmaz első (csökkenő rendezés esetében) vagy utolsó elemének (növekvő rendezés esetében) kiolvasásával megállapítható. Ha az adatok nincsenek rendezve - vagy nem a maximukiválasztás alapjául szolgáló szempont szerint vannak rendezve -, akkor a maximumot csakis az adathalmaz teljes bejárásával tudjuk meghatározni.

Minimum kiválasztás[szerkesztés]

A minimum kiválasztás algoritmusa nagyon hasonló a maximum kiválasztáshoz, csak a legnagyobb elem helyett a legkisebbet keressük. A (C) forráskódban a (második) relációs jel fordítva kell szerepeljen.

Szélső esetek[szerkesztés]

Üres (vagy másképpen nulla hosszú) bemenet esetén a minimum és maximum értékek nem értelmezettek. Ezt az esetet kezelhetjük hibajelzéssel, vagy dokumentálhatjuk, hogy az algoritmus nem hívható üres bemenettel.

Egyetlen bemenő elem esetén a minimum és a maximum is egyenlő a bemenő elemmel.

Lehetséges, hogy a minimum illetve maximum értéke többször is előfordul a bemenetben. Ekkor a szokásos megoldás a legelső előfordulás visszaadása, de a legutolsó előfordulás visszaadása is egyszerűen megvalósítható.

Érdekességek[szerkesztés]

Maximum kiválasztás összehasonlítás nélkül[szerkesztés]

Nemnegatív valós számokból álló adathalmaz esetén van lehetőség összehasonlítás nélkül történő maximum kiválasztásra, ennek azonban a gyakorlati haszna csekély, ellenben az elméleti (elsősorban matematikai) haszna jelentős.

Az eljárás annyiból áll, hogy a sorozat összes tagját n-edik hatványra emeljük, ahol n tart a végtelenhez, összeadjuk őket, majd az összegből n-edik gyököt vonunk. Ebben az esetben, mivel az adathalmaz legnagyobb tagja konvergál (aszimptotikusan is) leggyorsabban a végtelenhez, ezért nagy n-ek esetén a halmaz többi tagja már elhanyagolható hozzá képest.

Így, amikor gyököt vonunk az összegből a sorozat legnagyobb tagját kapjuk eredményül.

Ennek a "módszernek" egyébként a hivatalos elnevezése végtelen-norma, de hívják sakktávolságnak is.

Egy példa (n = végtelen helyett n = 1000, de már így is látható a lényeg)

Maximum kiválasztás megvalósítása különböző nyelveken[szerkesztés]

C[szerkesztés]

   /* Nem kezeli az üres bemenetet */
   int findmax( int [] arr, int size, int * index ) {
      int i;
      int res = arr[0];
      *index = 0;
      for ( i = 1; i < size; ++i ) 
         if (res < arr[i]) {
            *index = i;
            res = arr[i];
         }
      return res;
   }

C++[szerkesztés]

typedef std::vector<int> container;
container A;
// 'A' feltöltése, lehet üres is
for(int n=random()%10; n--;)
    A.push_back(random()%100);

// maximum keresése
// minimum kereséshez std::min_element-et használj
container::iterator max_at=std::max_element(A.begin(),A.end());

if(max_at==A.end())
    std::cout << "üres tartomány" << std::endl;
else std::cout << "maximális elem pozíciója=" << max_at-A.begin() << ", értéke=" << *max_at << std::endl;

Visual Basic[szerkesztés]

   Private Sub Max()
      Dim i As Integer    ' Futóindex
      Dim x(1 To 1000) As Double    'A tömb, amelyből keresünk
      Dim max As Double    ' A megtalált maximum érték
      Dim p As Integer     ' A maximum érték tömb-sorszáma
   
         For i = 1 To 1000 Step 1
            If max < x(i) Then 
               max = x(i)
               p = i
            Else
            End If
         Next i
      ' A Keresett maximum érték kiírása
         msgbox max & ", az elem száma: " & p
   End Sub

Go[szerkesztés]

func max(arr []int) (int,int) {
        max_i := 0
        for i,v := range arr {
                if arr[max_i] < v {
                        max_i = i
                }
        }
        return max_i,arr[max_i]
}