IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Hľadanie extrému (minima a maxima) v poli

Algoritmus pre nájdenie najväčšieho alebo najmenšieho prvku v poli je síce zrejmý, ale pre istotu aj úplnosť som sa ho rozhodol uviesť.

Budem tu popisovať vyhľadanie maxima, vyhľadanie minima bude potom analogické. Algoritmus bude mať spočiatku v premennej uloženej východiskovej maximum. Potom prejde pole prvok po prvku a ak je nejaký prvok väčší, ako toto maximum, bude novým maximom tento prvok. Po prejdení pole bude v premennej určite maximum z daných hodnôt v poli.

Teraz ako je to s tým východiskovým maximom. Niektoré z vás iste napadlo dať mu hodnotu 0. Čo keď ale budeme mať pole plné záporných čísel? Naša maximum bude maximom aj po priechode poľom (pretože nič nebude väčšia ako 0) a jeho hodnota je úplne chybná, pretože sa v poli ani nevyskytuje. Dáme mu teda nejakú hodnotu z poľa, vôbec nezáleží akú. Ponúka sa napr. Prvý prvok, pretože k nemu máme najľahšie prístup.

V praxi sa tiež do premennej neukladá maximálna hodnota, ale index s maximálnym prvkom (v prípade predvoleného prvého prvku by bol teda 0). Veľakrát nás totiž zaujíma index, pod ktorým sa maximálna hodnota skrýva, viac, než koľko maximálna hodnota číselne je. Ak napr. Budeme mať v poli zamestnanca (objekty) a budeme chcieť vypísať toho s najvyšším platom, nebude nás zaujímať jeho plat, ale jeho meno. Keď budeme mať index toho zamestnanca, môžeme si potom vypísať jeho ľubovoľný údaj vrátane jeho platu alebo jeho mena.

Na záver možno dodať, že časová zložitosť algoritmu je O (n) a nemali by sme teda operáciu vykonávať príliš často. Ak tomu tak bude, mali by sme sa zamyslieť nad vhodnejšie dátovú štruktúrou, ako je pole. Ponúka sa napríklad zotriedené poľa alebo halda.

Zdrojové kódy

V zdrojových kódoch program v jednom priechodu spočíta minimum aj maximum z daného poľa.

// vrátí pozici minima ze zadaného pole
public static int minimum (int[] list) {
  int min = 0;
  for (int i = 0; i < list.length; i++)
  if (list[i] < list[min])
  min = i;
  return min;
}

// vrátí pozici maxima ze zadaného pole
public static int maximum (int[] list) {
  int max = 0;
  for (int i = 0; i < list.length; i++)
  if (list[i] > list[max])
  max = i;
  return max;
}
// vrátí pozici minima ze zadaného pole
public static int minimum (int[] list) {
  int min = 0;
  for (int i = 0; i < list.Length; i++)
  if (list[i] < list[min])
  min = i;
  return min;
}

// vrátí pozici maxima ze zadaného pole
public static int maximum (int[] list) {
  int max = 0;
  for (int i = 0; i < list.Length; i++)
  if (list[i] > list[max])
  max = i;
  return max;
}
// vrati minumum ze zadaneho pole
function minimum(var list: array of integer): integer;
var min, i: integer;
begin
  min:=0;
  for i:=0 to (length(list) - 1) do
  if (list[i] < list[min]) then
  min:=i;
  result:=min;
end;

// vrati minumum ze zadaneho pole
function maximum(var list: array of integer): integer;
var max, i: integer;
begin
  max:=0;
  for i:=0 to (length(list) - 1) do
  if (list[i] > list[max]) then
  max:=i;
  result:=max;
end;
# vrati pozici minima ze zadaneho pole
def minimum(list)
  min = 0
  list.length.times { |i| min = i if (list[i] < list[min]) }
  return min
end

# vrati pozici maxima ze zadaneho pole
def maximum(list)
  max = 0
  list.length.times { |i| max = i if (list[i] > list[max]) }
  return max
end

 

Všetky články v sekcii
Vyhľadávacie algoritmy
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity