<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jumanji</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jumanji"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Jumanji"/>
	<updated>2026-04-16T14:11:10Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3643</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3643"/>
		<updated>2010-04-08T16:45:44Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Formulácia problému ==&lt;br /&gt;
&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riešenie problému ==&lt;br /&gt;
&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Iné prístupy k riešeniu ==&lt;br /&gt;
&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zložitosť algoritmu ==&lt;br /&gt;
&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Využitie ==&lt;br /&gt;
&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Program v jazyku C++ ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3642</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3642"/>
		<updated>2010-04-08T16:45:01Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Formulácia problému: ==&lt;br /&gt;
&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riešenie problému: ==&lt;br /&gt;
&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Iné prístupy k riešeniu: ==&lt;br /&gt;
&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zložitosť algoritmu: ==&lt;br /&gt;
&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Využitie: ==&lt;br /&gt;
&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Program v jazyku C++: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3641</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3641"/>
		<updated>2010-04-08T16:44:13Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Formulácia problému: ==&lt;br /&gt;
&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Riešenie problému: ==&lt;br /&gt;
&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Iné prístupy k riešeniu: ==&lt;br /&gt;
&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zložitosť algoritmu: ==&lt;br /&gt;
&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Využitie: ==&lt;br /&gt;
&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Program v jazyku C++: ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3640</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3640"/>
		<updated>2010-04-08T16:38:21Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsah:&lt;br /&gt;
#REDIRECT [[-Formulácia problému]]&lt;br /&gt;
-Návrh riešenia problému&lt;br /&gt;
-Riešenie&lt;br /&gt;
-Zložitosť&lt;br /&gt;
-Využitie&lt;br /&gt;
-Iné prístupy k riešeniu &lt;br /&gt;
-Riešenie v jazyku C++&lt;br /&gt;
&lt;br /&gt;
Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;br /&gt;
#REDIRECT [[#REDIRECT [[]]]]&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3639</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3639"/>
		<updated>2010-04-08T16:32:53Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3638</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3638"/>
		<updated>2010-04-08T16:32:23Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3637</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3637"/>
		<updated>2010-04-08T16:31:13Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
 const n=3;&lt;br /&gt;
 void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
 { double Z=M;&lt;br /&gt;
 int i;&lt;br /&gt;
 for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
 if(W[i]&amp;gt;Z)a&lt;br /&gt;
 break;&lt;br /&gt;
 X[i]=1;&lt;br /&gt;
 Z=Z-W[i];&lt;br /&gt;
 }&lt;br /&gt;
 if ((i&amp;lt;n))&lt;br /&gt;
 X[i]=Z/W[i];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 int main()&lt;br /&gt;
 {	&lt;br /&gt;
 double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};	&lt;br /&gt;
 greedy(20,W,C,X);&lt;br /&gt;
 double p=0;&lt;br /&gt;
 for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
 cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
 cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
 system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3636</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3636"/>
		<updated>2010-04-08T16:28:11Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
const n=3;&lt;br /&gt;
void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
{ double Z=M;&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
  if(W[i]&amp;gt;Z)a&lt;br /&gt;
  break;&lt;br /&gt;
  X[i]=1;&lt;br /&gt;
  Z=Z-W[i];&lt;br /&gt;
  }&lt;br /&gt;
if ((i&amp;lt;n))&lt;br /&gt;
X[i]=Z/W[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};&lt;br /&gt;
	greedy(20,W,C,X);&lt;br /&gt;
	double p=0;&lt;br /&gt;
	for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
	  cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
	  cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
  system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3635</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3635"/>
		<updated>2010-04-08T16:26:56Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
''&lt;br /&gt;
const n=3;&lt;br /&gt;
void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
{ double Z=M;&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
  if(W[i]&amp;gt;Z)a&lt;br /&gt;
  break;&lt;br /&gt;
  X[i]=1;&lt;br /&gt;
  Z=Z-W[i];&lt;br /&gt;
  }&lt;br /&gt;
if ((i&amp;lt;n))&lt;br /&gt;
X[i]=Z/W[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};&lt;br /&gt;
	greedy(20,W,C,X);&lt;br /&gt;
	double p=0;&lt;br /&gt;
	for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
	  cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
	  cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
  system(&amp;quot;pause&amp;quot;); }&lt;br /&gt;
''&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3634</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3634"/>
		<updated>2010-04-08T16:23:05Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formulácia problému:&lt;br /&gt;
Zlodej, ktorý vylomil zámok na trezore, zistil, že je naplnený n vecami rôznych veľkostí a rôznej ceny. Na lup má ale len batoh kapacity k, problém batohu je práve nájsť takú kombináciu vecí z trezoru, aby sa mu zmestila do batoha a bola čo možno najcennejšia. &lt;br /&gt;
&lt;br /&gt;
Riešenie problému:&lt;br /&gt;
Kľúčové pozorovanie, ktoré vedie k peknému riešeniu: Ak máme maximálne dosiahnuteľné ceny lupu pre všetky celočíselné kapacity batohu pomocou prvých k predmetov, ľahko spočítame maximálne ceny pre prvých k+1 predmetov. A to tak, že skúsime pridať k + 1 - vý predmet do batohu s k predmetmi a kapacitou nižšou o hmotnosť tohto predmetu. Predmet nepridáme, pokiaľ cena takého lupu nie je vyššia od ceny lupu z prvých k predmetov v batohu s rovnakou kapacitou. Prvý predmet je možné vložiť do batohu s kapacitou rovnou aspoň hmotnosti predmetu a cena lupu je maximálna možná. Pre ďalšie predmety to plynie z indukcie.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme tabuľku, kde stĺpce budú popisovať cieľovú nosnosť (kapacitu) batohu, posledný stĺpec bude maximálna nosnosť. &lt;br /&gt;
Riadky budú označovať jednotlivé veci, ktoré môžeme do batohu vložiť. &lt;br /&gt;
Budeme potrebovať n + 1 riadkov, kde n je počet predmetov. Riadok navyše máme pre žiadny vložený predmet. Ďalej budeme potrebovať k + 1 stĺpcov, jeden stĺpec navyše je pre kapacitu batoha o veľkosti 0. &lt;br /&gt;
&lt;br /&gt;
Prvý stĺpec naplníme samými nulami, pretože to zodpovedá batohu s nulovou kapacitou. &lt;br /&gt;
Prvý riadok je taktiež naplnený nulami, zodpovedá to totiž batohu so žiadnym vloženým predmetom. &lt;br /&gt;
Tabuľku vypĺňame zľava doprava a zhora nadol. Do jednotlivých buniek vpisujeme hodnotu tak, že sa pozrieme na aktuálnu nosnosť batohu, potom na hmotnosť predmetu a jeho cenu a tiež sa musíme pozrieť na aktuálnu hodnotu vecí v batohu. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Batoh1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- V uvedenom príklade začíname s batohom so žiadnym vloženým predmetom. Tým pádom hodnota batohu je nulová.&lt;br /&gt;
 Pokračujeme ďalej druhým riadkom postupne v smere rastúcej kapacity.&lt;br /&gt;
Celý riadok môžeme zaplniť touto hodnotou (riadiac sa podľa vzorca, ktorý je uvedený). &lt;br /&gt;
- Prvý predmet má hmotnosť 1, teda sa vojde do batohu danej kapacity, čiže môžeme napísať, že cena takého batohu bude rovná cene predmetu.&lt;br /&gt;
Konkrétne, keď sa pozrieme na prvý predmet a nosnosť batohu 6. Váha prvého predmetu je 5 a jeho cena 10. Zistíme, akú cenu mal batoh s rovnakou kapacitou, ale bez tohto   predmetu a akú cenu by mal s kapacitou batohu nižšou o hmotnosť prvého predmetu s nultým predmetom a k tejto hodnote prirátame cenu prvého predmetu.&lt;br /&gt;
- Vidíme, že druhá hodnota je väčšia, tým pádom napíšeme do bunky číslo 24.&lt;br /&gt;
Takto postupne vypĺňame celú tabuľku. Výsledná hodnota je v pravom dolnom stĺpci.&lt;br /&gt;
&lt;br /&gt;
Označme W={w1,w2,..wn} ako sadu hmotností a V={v1,v2,..vn} ako sadu hodnôt predmetov. Nech k je cieľová kapacita, predstavujúca najväčšiu hmotnosť vecí, ktorú batoh dokáže uniesť. Riešením problému je:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Vzorec.jpg]]	 a     [[Súbor:Vzorec1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
T. j. riešenie s maximálnou hodnotou a minimálnou váhou. Množina {0,1} indikuje, či predmet je v batohu alebo nie.&lt;br /&gt;
Tento problém by sa dal riešiť rekurzívnou metódou. Táto metóda by bola ale veľmi neefektívna, lebo niektoré podproblémy by sa riešili viackrát.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Označme T[i][j] maximálnu cenu batohu s i predmetmi a nosnosťou o veľkosti j. Pri dynamickom programovaní teda využijeme tento vzorec:&lt;br /&gt;
 ak j – váhy[i-1] &amp;lt; 0, potom T[i][j] =T [i - 1][j],&lt;br /&gt;
 inak T[i][j] = max (T[i-1,j], hodnoty[i-1] + T[i-1,&lt;br /&gt;
 j - váhy[i-1] ), pričom hodnoty je pole hodnôt jednotlivých predmetov a váhy je pole váh jednotlivých predmetov.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Iné prístupy k riešeniu:&lt;br /&gt;
Greedy algoritmus: tento prístup spočíva v tom, že keďže zlodej je veľmi chamtivý (greedy), tak berie predmety v klesajúcom poradí podľa ich ceny. Skončí s batohom, ktorý nie je úplne zaplnený. To, že batoh nie je úplne zaplnený ešte neznamená, že riešenie nie je správne, ale v mnohých prípadoch je to hlavnou príčinou.&lt;br /&gt;
&lt;br /&gt;
Brute force: iný zlodej skúsil vypočítať všetky možnosti výberu vecí. Všetkých možností je ale 2n, takže zložitosť tohto algoritmu by bola exponenciálna. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zložitosť algoritmu:&lt;br /&gt;
Časová zložitosť algoritmu závisí od veľkosti tabuľky. &lt;br /&gt;
Máme tu 2 faktory: &lt;br /&gt;
n + 1 riadkov, kde n je počet predmetov a &lt;br /&gt;
k + 1 stĺpcov, kde k je maximálna kapacita batohu.&lt;br /&gt;
Čiže časová zložitosť tohto algoritmu je O(k*n).&lt;br /&gt;
Číslo k ale nie je konštanta, môže byť oveľa väčšie ako počet vecí, ktoré môžeme do batohu vložiť.&lt;br /&gt;
Tento algoritmus má teda zložitosť rovnú pseudo – polynomiálnemu času.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Využitie:&lt;br /&gt;
Tento problém sa využíval ako základ pre kryptografický systém (ktorý bol odvtedy prelomený). &lt;br /&gt;
Ďalej sa využíva pri problémoch, kde riešenie závisí na výbere nejakého počtu vecí, ktorých hodnota je maximálna (alebo minimálna), a ktorých váha je rovná cieľovej váhe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Program v jazyku C++:&lt;br /&gt;
&lt;br /&gt;
const n=3;&lt;br /&gt;
void greedy(double M,double W[n],double C[n],double X[n])&lt;br /&gt;
{ double Z=M;&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
  if(W[i]&amp;gt;Z)a&lt;br /&gt;
  break;&lt;br /&gt;
  X[i]=1;&lt;br /&gt;
  Z=Z-W[i];&lt;br /&gt;
  }&lt;br /&gt;
if ((i&amp;lt;n))&lt;br /&gt;
X[i]=Z/W[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	double W[n]={10,12,16}, C[n]={60,70,80}, X[n]={0,0,0};&lt;br /&gt;
	greedy(20,W,C,X);&lt;br /&gt;
	double p=0;&lt;br /&gt;
	for (int i=0 ;i&amp;lt;n; p+=X[i]*C[i],i++)&lt;br /&gt;
	  cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;W[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;C[i]&amp;lt;&amp;lt;&amp;quot;\t&amp;quot;&amp;lt;&amp;lt;X[i]&amp;lt;&amp;lt;endl;&lt;br /&gt;
	  cout&amp;lt;&amp;lt;&amp;quot;celkom:&amp;quot;&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl;&lt;br /&gt;
  system(&amp;quot;pause&amp;quot;); }&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3631</id>
		<title>Problém batoha</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Probl%C3%A9m_batoha&amp;diff=3631"/>
		<updated>2010-04-08T16:14:10Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: Vytvorená stránka „&amp;lt;gallery&amp;gt;Batoh1.jpg&amp;lt;/gallery&amp;gt;“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;gallery&amp;gt;Batoh1.jpg&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Batoh1.jpg&amp;diff=3630</id>
		<title>Súbor:Batoh1.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Batoh1.jpg&amp;diff=3630"/>
		<updated>2010-04-08T16:13:26Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Algoritmy_triedenia&amp;diff=2837</id>
		<title>Algoritmy triedenia</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Algoritmy_triedenia&amp;diff=2837"/>
		<updated>2010-03-21T21:01:13Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Cvicenie|Triedenie(riešené príklady)}}&lt;br /&gt;
'''Triedenie'''&lt;br /&gt;
&lt;br /&gt;
Triedaci algoritmus je v informatike  algoritmus, ktorý zoraďuje prvky zoznamu v určenom poradí. Najpoužívanejšie sú numerické a lexikografické poradie. &lt;br /&gt;
Efektívne triedenie je dôležité pre optimalizáciu použitia iných algoritmov (ako je napr. vyhľadávanie), ktoré vyžadujú pre svoju správnu funkčnosť utriedené zoznamy. Formálne povedané, výstupné utriedené údaje musia spĺňať dve podmienky:&lt;br /&gt;
#Prvky vo výstupnom zozname majú neklesajúci trend (každý prvok je väčší alebo rovný ako predchádzajúci prvok)&lt;br /&gt;
#Výstupom je permutácia vstupných resp. preusporiadanie týchto údajov.&lt;br /&gt;
&lt;br /&gt;
==Klasifikácia==&lt;br /&gt;
Triediace algoritmy môžeme klasifikovať podľa:&lt;br /&gt;
;Výpočtová zložitosť: (najhoršia, priemerná a najlepšia) pre zoznam s veľkosťou n položiek. Pre typické triediace algoritmy je prijateľná výpočtová zložitosť aspoň O(n.log n) a zlá O(n2). Ideálna zložitosť je O(n). Triediace algoritmy, ktoré používajú iba abstraktnú operáciu porovnania vždy majú priemernú zložitosť aspoň O(n.log n) porovnaní.&lt;br /&gt;
;Využitie pamäte:(a využívanie ďalších počítačových zdrojov). Niektoré triediace algoritmy sú typu &amp;quot;in-place&amp;quot;. To znamená, že im stačí O(1) alebo O(log n) pamäte na triedené položky.&lt;br /&gt;
;Rekurzia: Niektoré algoritmy sú buď rekurzívne alebo nerekurzívne, niektoré môžu byť implementovateľné oboma spôsobmi (napr. Merge sort).&lt;br /&gt;
;Stabilita: Stabilné triediace algoritmy - súvis s triedením dvojíc kľúč-hodnota, pričom existujú 2 také záznamy, že kľúče sú rovnaké. Stabilný algoritmus nezmení poradie týchto dvojíc vo výsledku.&lt;br /&gt;
;Metóda triedenia: vkladanie, výmena, výber, zlúčenie, a pod.&lt;br /&gt;
&lt;br /&gt;
==Typy triediacich algoritmov==&lt;br /&gt;
===Vnútorné triedenie===&lt;br /&gt;
Vnútorný triedenie je akýkoľvek triediaci proces, ktorý prebieha v hlavnej pamäti počítača. To je možné ak údaje, ktoré majú byť triedené majú takú veľkosť, že sa dokážu nahrať do hlavnej pamäti. Akékoľvek čítanie alebo zápis dát do/z externej pamäte môže značne spomaliť proces triedenia.&lt;br /&gt;
&lt;br /&gt;
Uvažujem algoritmus Bubblesort, kde sa vymieňajú priľahlé záznamy s cieľom dostať ich do správneho poradia. V prípade, že časť triedeného súboru by bola b hlavnej pamäti a časť na externej pamäti, neustále by sa musel nahrávať do pamäti ten blok spboru, v ktorom sa vykonáva &amp;quot;prebulávanie&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Vonkajšie triedenie===&lt;br /&gt;
Vonkajšie triedenie&amp;lt;ref&amp;gt;External_sorting - http://en.wikipedia.org/wiki/External_sorting&amp;lt;/ref&amp;gt; je termín pre triedu triediacich algoritmov, ktoré môžu spracovať obrovské množstvo dát. Vonkajšie triedenie sa vyžaduje, ak sa triedené údaje nezmestia do hlavnej pamäte počítača (zvyčajne RAM) a namiesto toho musia byť umiestnené v pomalšej vonkajšej pamäti (zvyčajne pevný disk). Vonkajšie triedenie zvyčajne používa princíp zlučovania. Vo fáze triedenia sú dáta rozdelené do malých objemov ktoré sa zmestia do hlavnej pamäte. Pri fáze zlúčenia sú tieto bloky spojené do jedného väčšieho súboru.&lt;br /&gt;
====Externý Mergesort====&lt;br /&gt;
Príklad externého triedenia je  algoristmus externého mergesortu.&amp;lt;ref&amp;gt;Donald Knuth, ''The Art of Computer Programming'', Volume 3: ''Sorting and Searching'', Second Edition. Addison-Wesley, 1998, ISBN 0-201-89685-0, Section 5.4: External Sorting, pp.248&amp;amp;ndash;379.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Ellis Horowitzand Sartaj Sahni, ''Fundamentals of Data Structures'', H. Freeman &amp;amp; Co., ISBN 0-716-78042-9.&amp;lt;/ref&amp;gt;. Ako príklad uvádzame triedenie 900MB súboru ktorý rozdelíme na 100MB bloky, ktoré sú nahraté do pamäte.&lt;br /&gt;
# Načítaj 100MB dát do hlavnej pamäti a utrieď ich ľubovoľným triediacim algoritmom.&lt;br /&gt;
# Zapíš utriedený súbor na disk.&lt;br /&gt;
# Opakuj kroky 1. a 2.  pokiaľ nie sú utriedené všetky 100MB bloky dát. Potom budeme tieto bloky spájať.&lt;br /&gt;
# Načítaj do pamäti prvých 10MB z každého utriedeného súboru. Alokuj zvyšných 10MB pre výstupný buffer.&lt;br /&gt;
# Vykonaj 9-násobný algoritmus  merge (spájanie) zapíš výsledok do výstupného bufferu. Ak je výstupný buffer zaplnený, zapíš tieto údaje do výsledného utriedeného súboru. Ak je ľubovoľný z 9-tich vstupných bufferov prázdny, naplň ho ďalšími 10MB z jeho 100MB utriedeného súboru.&lt;br /&gt;
&lt;br /&gt;
==Porovnanie algoritmov==&lt;br /&gt;
V nasledujúcej tabuľke je n počet záznamov, ktoré majú byť utriedené. Stĺpce &amp;quot;Priemerne&amp;quot; a &amp;quot;najhoršie&amp;quot; hovoria o časovej zložitosti, za predpokladu, že dĺžka všetkých kľúčov je konštantná, a preto všetky porovnania, výmeny a ďalšie potrebné operácie môže vykonať v konštantnom čase. &amp;quot;Pamäť&amp;quot; označuje množstvo pomocnej potrebnej okrem tej, ktorá je potrebná na samotné uloženie poľa ktoré sa bude triediť.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=1 cellpadding=5 &lt;br /&gt;
|-&lt;br /&gt;
! Názov&lt;br /&gt;
! Najlepšie&lt;br /&gt;
! Priemerne&lt;br /&gt;
! Najhoršie&lt;br /&gt;
! Pamäť&lt;br /&gt;
! Metóda triedenia&lt;br /&gt;
|-&lt;br /&gt;
| Bubble sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Výmena&lt;br /&gt;
|-&lt;br /&gt;
| Gnome sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| ---&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Výmena&lt;br /&gt;
|-&lt;br /&gt;
| Shake sort &lt;br /&gt;
| ---&lt;br /&gt;
| ---&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Výmena&lt;br /&gt;
|-&lt;br /&gt;
| Selection sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Výber&lt;br /&gt;
|-&lt;br /&gt;
| Shell sort &lt;br /&gt;
| &amp;lt;math&amp;gt;O(n^{1 + \frac{c}{\sqrt m}})&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;sedgewick96&amp;quot;&amp;gt;Robert Sedgewick: [http://www.cs.princeton.edu/~rs/shell/ ''Analysis of Shellsort and Related Algorithms''], Fourth Annual European Symposium on Algorithms, Barcelona, 1996&amp;lt;/ref&amp;gt;&lt;br /&gt;
| ---&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n \cdot \log^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Vkladanie&lt;br /&gt;
|-&lt;br /&gt;
| Insert sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Vkladanie&lt;br /&gt;
|-&lt;br /&gt;
| Merge sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Zlučovanie&lt;br /&gt;
|-&lt;br /&gt;
| Heap sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O} (n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Výber&lt;br /&gt;
|-&lt;br /&gt;
| Quick sort &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n \cdot \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Delenie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Popis metód tiedenia===&lt;br /&gt;
Existuje niekoľko základných druhov algoritmov univerzálneho vnútorného triedenia. Niektoré z pokročilejšách algoritmov využívajú viacero postupov.&lt;br /&gt;
&lt;br /&gt;
;Triedenie výberom:V súbore sa vždy nájde najmenší zo zostávajúcich položiek a uloží na koniec postupne vytváraného utriedeného súboru.&lt;br /&gt;
;Triedenie vkladaním:Zo súboru neusporiadaných dát sa postupne berie položka po položke a vkladá sa na správne miesto v usporiadanom súbore (na začiatku je prázdny).&lt;br /&gt;
;Triedenie výmenou:V súbore sa vždy nájde (nejakou metódou závislou na konkrétnom algoritme) nejaká dvojica prvkov, ktorá je v zlom poradí, a tieto prvky sa navzájom zamenia.&lt;br /&gt;
;Triedenie zlučovaním:Vstupný súbor sa rozdelí na časti, ktoré sa (typicky rekurzívne) zoradia. Výsledné časti sa potom zlúčia takým spôsobom, aby aj výsledok bol zoradený.&lt;br /&gt;
&lt;br /&gt;
Neexistuje žiaden &amp;quot;dokonalý&amp;quot; triediaci algoritmus, ktorý by bol ideálny pre všetky použitia. Rôzne algoritmy majú rôzne vlastnosti čo sa týka ich očakávané časovej a pamäťovej zložitosti, náročnosti implementácie a ďalších vlastností. Pre konkrétne podmienky sa tak často navrhujú špecifické varianty.&lt;br /&gt;
&lt;br /&gt;
==Princíp známych triediacich algoritmov==&lt;br /&gt;
&lt;br /&gt;
===Bubble sort===&lt;br /&gt;
Bubble sort predstavuje jednoduchý spôsob triedenia dát. Algoritmus začína na začiatku súboru údajov. Porovnáva prvé dva prvky, a ak je prvý väčší ako druhý, tak ich zamení. Toto robí pre každú dvojicu susedných prvkov až po koniec dátového súboru. Potom začína odznova s prvými dvoma prvkami, až pokiaľ nie je čo zameniť. Tento algoritmus je veľmi neefektívny, a málo použiteľný. Napríklad, ak budeme mať utriediť 100 prvkov, potom celkový počet porovnaní bude 10 000. Mierne lepšia varianta je Shake sort (Coctail sort), ktorý pracuje na princípe Buublesort ale prebublávanie sa deje striedavo smerom zľava doprava (a opačne). Modifikovaný Bubblesort zmenšuje počet porovnaní na 4950 (pri 100 prvkoch)&lt;br /&gt;
===Selection sort===&lt;br /&gt;
Princíp fungovania je, že sa vyberie z nezotriedenej časti postupnosti prvok s minimálnou hodnotou a vloží sa na koniec zotriedenej časti postupnosti. Na začiatku má zotriedená postupnosť 0 prvkov a nezotriedená má toľko prvokv, koľko je veľkosť poľa.&lt;br /&gt;
===Shell sort===&lt;br /&gt;
Pracuje podobne ako Selectionsort na princípe výberu. Shellsort vylepšuje vkladanie prvkov zadefinovaním kroku pri porovnávaní prvkov. Viacnásobným prechodom triedeným poľom a zmenšovaním kroku dosahuje lepšie výsledku ako InsertSort. Tento algoritmus je vhodné na zoznamy, ktoré sú skoro utriedené.&lt;br /&gt;
===Merge sort===&lt;br /&gt;
Merge sort využíva spájanie už zotriedených zoznamov do nového zoznamu, ktorý bude tiež zotriedený. Začína porovnávaním každých dvoch prvkov (tj 1 s 2,potom s 3, potom s 4, ...) a ich vzájomnou zámenou, aby boli zotriedené. Potom sa spojí každý z výsledných zoznamov (zatiaľ dvojprvkových) na štvrprvkový zoznam, a tak ďalej, až pokiaľ nie sú posledné dva zoznamy zlúčené do finálneho usporiadaného zoznamu.&lt;br /&gt;
===Heap sort===&lt;br /&gt;
Heapsort je efektívnejšia verzia Selectionsort-u. Funguje na výbere najmenšieho/najväčšieho prvku a umiestnením na začiatok/koniec zoznamu. Podobným spôsobom sa pokračuje zo zvyškom zoznamu. Pracuje sa s dátovou štruktúrou [[halda]], čo je špeciálny prípad binárneho stromu.&lt;br /&gt;
===Quick sort===&lt;br /&gt;
Quicksort je algoritmus typu &amp;quot;rozdeľuj a panuj&amp;quot;. Funguje na princípe rozdelenia triedeného poľa vzhľadom na vzťažný prvok (pivot) tak že prvky menšie ako pivot sú naľavo od pivota a prvky väčšie ako pivot sú napravo od pivota. Potom sa algoritmus rekurzívne aplikuje na tieto rozdelenia.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
* Donald E. Knuth: ''The Art of Computer Programming, Volume 3: Sorting and Searching.'' Second Edition. Reading, Massachusetts: Addison-Wesley, 1998. ISBN 0-201-89685-0&lt;br /&gt;
* [http://www.nist.gov/dads/HTML/sort.html Algoritmy řazení ve slovníku algoritmů a datových struktur NIST]&lt;br /&gt;
* [http://tjn.fjfi.cvut.cz/~virius/jera/binary/trideni.htm ''Třídění'' ve výukových materiálech k předmětu Základy algoritmizace]&lt;br /&gt;
* David R. Martin: Sorting Algorithm Animations - http://www.sorting-algorithms.com&lt;br /&gt;
* [http://www.informit.com/store/product.aspx?isbn=0201361205 Algorithms in Java], Parts 1-4, 3rd edition  by Robert Sedgewick. Addison Wesley, 2003. &lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Algoritmy_vyh%C4%BEad%C3%A1vania&amp;diff=2833</id>
		<title>Algoritmy vyhľadávania</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Algoritmy_vyh%C4%BEad%C3%A1vania&amp;diff=2833"/>
		<updated>2010-03-21T20:39:54Z</updated>

		<summary type="html">&lt;p&gt;Jumanji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Cvicenie|Vyhľadávanie (riešené príklady)}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
'''Vyhľadávanie'''&lt;br /&gt;
&lt;br /&gt;
Vyhľadávanie je základnou úlohou pri práci s väčším objemom dát. Podľa povahy dát (zložitosti, usporiadania, veľkosti) volíme vhodný algoritmus vyhľadávania. Algortimy vyhľadávanie môžeme rozdeliť do niekoľko skupín:&lt;br /&gt;
#Sekvenčné vyhľadávanie&lt;br /&gt;
#Vyhľadávanie v usporiadaných zoznamoch (resp. poliach)&lt;br /&gt;
#Vyhľadávanie v rekurzívnych štruktúrach&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Sekvenčné vyhľadávanie=&lt;br /&gt;
==Jednoduché sekvenčné vyhľadávanie==&lt;br /&gt;
Princíp tohto vyhľadávania je jednoduchý. Majme pole údajov o dĺžke ''n'', v ktorých budeme hľadať údaj ''x''. Pod pojmom údaj si môžeme ptredstaviť ľubovoľný dátový typ (celé číslo, reálne číslo, štruktúru, smerník na nejaký dátový typ).&lt;br /&gt;
Princíp: postupne prechádzame pole od indexu ''0'' až po index ''n-1''. V prípade, ak zistíme zhodu hľadaného prvku s prvkom v poli, tak funkciu ukončíme s úspechom, v opačnom prípade skončíme s výsledkom &amp;quot;prvok sa nenašiel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Dohodnuté návratové hodnoty funkcie:'''&lt;br /&gt;
&lt;br /&gt;
Vyhľadávacia funkcia bude vracať index prvku, ktorý je zhodný s hľadaným prvkom. V prípade neúspechu (hľadaný prvok sa v poli nevyskytuje) vráti funkcia hodnotu -1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov funkcie=hladajSekvencne&lt;br /&gt;
Návratová hodnota=index nájdeného prvku (-1 pri neúspechu)&lt;br /&gt;
Parametre=pole prvkov - pole&amp;lt;br/&amp;gt;rozmer poľa - n&amp;lt;br/&amp;gt;hľadaný prvok - x&lt;br /&gt;
Zložitosť algoritmu=O(n)&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
int hladajSekvencne(int *pole,int dlzka,int x)&lt;br /&gt;
{  int i=0;&lt;br /&gt;
	while( (i&amp;lt;dlzka) &amp;amp;&amp;amp; (pole[i]!=x) )&lt;br /&gt;
		 i++;&lt;br /&gt;
    if(i&amp;lt;dlzka)  return i;&lt;br /&gt;
	else return -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analýza riešenia:&lt;br /&gt;
Algoritmus je vhodný pre vyhľadávanie údajov v dátovej štruktúre jednorozmerné pole. Údaje v tomto poli môžu byť neusporiadané.&lt;br /&gt;
Podmienka i&amp;lt;dlzka zaručí, že sa bude prehľadávať len v rozsahu poľa ''pole''. Vždy sa začína na indexe i=0; tento index sa postupne zvyšuje (i++), pokiaľ nenarazíme na hľadaný prvok (pole[i]!=x). Podmienka na riadku 5 je tam pre kontrolu prípadu, keď sme prešli celé pole a hľadaný prvok sme nenašli.&lt;br /&gt;
&lt;br /&gt;
Nevýhoda: každý cyklus sa vykonávajú 2 porovnania: i&amp;lt;dlzka a pole[i]!=x&lt;br /&gt;
&lt;br /&gt;
==Jednoduché sekvenčné vyhľadávanie s nárazníkom==&lt;br /&gt;
V predchádzajúcom prípade sa v každom cykle robili 2 porovnania. Určitými úpravami dokážeme tieto porovnania znížiť len na 1 porovnanie. Bude to však chcieť drobnú úpravu poľa, v ktorom budeme vyhľadávať. Pole si upravíme tak, že hľadaný prvok sa tam bude vždy vyskytovať. Skutočná veľkosť poľa ''pole'' musí byť teda o jednu položku väčšia ako je počet prvkov v poli. Iba po splnení tejto podmienky môžeme urobiť priradenie, ako je ukázané v riadku 3.&lt;br /&gt;
Toto priradenie nazveme '''nárazník'''. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov funkcie=hladajSekvencneN&lt;br /&gt;
Návratová hodnota=index nájdeného prvku (-1 pri neúspechu)&lt;br /&gt;
Parametre=pole prvkov - pole&amp;lt;br/&amp;gt;rozmer poľa - n&amp;lt;br/&amp;gt;hľadaný prvok - x&lt;br /&gt;
Zložitosť algoritmu=O(n)&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
int hladajSekvencneN(int *pole, int n, int x)&lt;br /&gt;
{&lt;br /&gt;
  pole[n] = x; // musi byt na to vyhradene miesto!&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  while (pole[i] != x) &lt;br /&gt;
    i++;&lt;br /&gt;
  if (i &amp;lt; n) &lt;br /&gt;
    return i;&lt;br /&gt;
  else&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Analýza riešenia:&lt;br /&gt;
Algoritmus je vhodný pre vyhľadávanie údajov v dátovej štruktúre jednorozmerné pole. Údaje v tomto poli môžu byť neusporiadané.&lt;br /&gt;
Priradenie pole[n] = x dovoľuje vynechať kontrolu i&amp;lt;dlzka (funkcia hladajSekvencne). Vieme, že prvok v poli vždy nájdeme, preto stačí na konci urobiť porovnanie (riadok 7), či sme prvok x našli na pozícii menšej ako n (v rozsahu poľa). Ak áno, vrátime hodnotu premennej i, čo je index nájdeného prvku, ak sme hľadaný prvok našli na pozícii n, vrátime hodnotu -1, pretože na pozícii n je náš nárazník.&lt;br /&gt;
&lt;br /&gt;
Poznámka: Touto úpravou sme vylepšili čas, vyhľadávania, ale nie zložitosť algoritmu. &lt;br /&gt;
&lt;br /&gt;
Nasledujúci obrázok ukazuje porovanie časov vyhľadávania doteraz spomínaných algorimnov pri opakovanom vyhľadávaní vo veľkých (cca 1 000 000 položiek) poliach.&lt;br /&gt;
&amp;lt;pLines ymin=0 axiscolor=888888 cubic angle=90 plots legend xtitle=pocet_cisel ytitle=cas&amp;gt;&lt;br /&gt;
,hladajSekvencne,hladajSekvencneN&lt;br /&gt;
10 000, 0.016, 0.015 &lt;br /&gt;
100 000, 0.235, 0.125&lt;br /&gt;
200 000, 0.859, 0.813&lt;br /&gt;
300 000, 1.281, 1.234 &lt;br /&gt;
500 000, 2.156, 2.063 &lt;br /&gt;
700 000, 3.031, 2.891&lt;br /&gt;
1 000 000, 4.328, 4.141 &lt;br /&gt;
2 000 000, 8.656, 8.375 &lt;br /&gt;
5 000 000, 21.531, 20.657&lt;br /&gt;
10 000 000, 42.422, 41.235&lt;br /&gt;
&amp;lt;/pLines&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vyhľadávanie v usporiadaných zoznamoch=&lt;br /&gt;
Zložitosť O(n) pre algorimy lineárneho, resp. sekvenčného vyhľadávania dokážeme znížiť, ak sú údaje v ktorých budeme vyhľadávať usporiadané. V tomto prípade nemusíme pole prvkov v ktorom hľadáme prechádzať celé (od indexu 0 až po n-1), ale stačí si skontrolovať položky len na určitých miestach.&lt;br /&gt;
&lt;br /&gt;
==Binárne vyhľadávanie==&lt;br /&gt;
Predpoklad správneho vyhľadávania je, že prvku sú v poli usporiadané. Postup vyhľadávania:&lt;br /&gt;
;Použité premenné:&lt;br /&gt;
*''pole'' - jednorozmerné pole, v ktorom budeme vyhľadávať&lt;br /&gt;
*''x'' - prvok, ktorý hľadáme&lt;br /&gt;
*''n'' - veľkosť pola ''pole''.&lt;br /&gt;
*''lavy'', ''pravy'' - rozsah poľa, (začiatok , koniec) kde budeme hľadať.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Rozdeľ pole na 2 polovice. Index stredného prvku vypočítaš ako:&lt;br /&gt;
#* stred=(lavy+pravy)/2&lt;br /&gt;
#Ak platí lavy&amp;gt;pravy, tak koniec, prvok sa nenašiel.&lt;br /&gt;
#Zober prvok v strede poľa (na indexe stred) a porovnaj ho s hľadaným prvkom ''x''&lt;br /&gt;
#Ak sa ''x'' zhoduje so stredným prvkom - koniec. Výsledok je index tohto prvku &lt;br /&gt;
#V opačnom prípade&lt;br /&gt;
#*Ak je ''x'' väčšie ako stredný prvok, tak hľadaj v pravej časti poľa&lt;br /&gt;
#**lavy=stred+1, pravy zostava nezmenený (choď na krok 1)&lt;br /&gt;
#*Ak je ''x'' menšie ako stredný prvok, tak hľadaj v ľavej časti poľa&lt;br /&gt;
#**lavy=zostava nezmenený, pravy = stred-1 (choď na krok 1)&lt;br /&gt;
&lt;br /&gt;
Ukážme si konkrétny príklad (šedé políčka predstavujú indexy poľa, biele sú prvky poľa):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 x=18&lt;br /&gt;
 n=10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=1 cellpadding=5&lt;br /&gt;
|+pole=&lt;br /&gt;
|- style=&amp;quot;color:green;background-color:#DADADA&amp;quot;&lt;br /&gt;
|0 ||1 ||2 ||3 ||4 ||5 ||6 ||7 ||8 ||9 ||10&lt;br /&gt;
|-&lt;br /&gt;
|1 ||2 ||6 ||18 ||20 ||23 ||29 ||32 ||34 ||39 ||43&lt;br /&gt;
|}&lt;br /&gt;
Pre implementáciu algoritmu binárneho vyhľadávania si musíme vypočítať hodnoty ľavého a pravého indexu poľa, v ktorom hľadáme. Na začiatok je to jednoduché:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 lavy=0&lt;br /&gt;
 pravy=n-1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Porovnajme hľadaný prvok x=18 so stredným prvkom: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 stred=(lavy+pravy)/2&lt;br /&gt;
 stred=5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=1 cellpadding=5&lt;br /&gt;
|+pole=&lt;br /&gt;
|- style=&amp;quot;color:green;background-color:#DADADA&amp;quot;&lt;br /&gt;
|0 ||1 ||2 ||3 ||4 ||5 ||6 ||7 ||8 ||9 ||10&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |2 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |6 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |18 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |20 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot; | 23 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |29 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|32 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|34 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|39 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|43&lt;br /&gt;
|}&lt;br /&gt;
* pole[5] != x (23 != 18 )&lt;br /&gt;
** platí že x&amp;lt;23 (resp. x&amp;lt;pole[stred])&lt;br /&gt;
** budeme vyhľadávať vľavo (žltá časť)&lt;br /&gt;
*** lavy zostane nezmeneny (0)&lt;br /&gt;
*** pravy=stred - 1 (4)&lt;br /&gt;
&lt;br /&gt;
*Porovnajme hľadaný prvok x=18 so stredným prvkom: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 stred=(lavy+pravy)/2 = (0+4)/2=2&lt;br /&gt;
 stred=2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=1 cellpadding=5&lt;br /&gt;
|+pole=&lt;br /&gt;
|- style=&amp;quot;color:green;background-color:#DADADA&amp;quot;&lt;br /&gt;
|0 ||1 ||2 ||3 ||4 ||5 ||6 ||7 ||8 ||9 ||10&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |2 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot; |6 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |18 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot; |20 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; | 23 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |29 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|32 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|34 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|39 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|43&lt;br /&gt;
|}&lt;br /&gt;
* pole[2] != x  (6 != 18 )&lt;br /&gt;
** platí že x&amp;gt;6 (resp. x&amp;gt;pole[stred])&lt;br /&gt;
** budeme vyhľadávať vpravo (žltá časť)&lt;br /&gt;
*** lavy = stred + 1 (3)&lt;br /&gt;
*** pravy zostane nezmeneny (4)&lt;br /&gt;
&lt;br /&gt;
*Porovnajme hľadaný prvok x=18 so stredným prvkom: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 stred=(lavy+pravy)/2 = (3+4)/2=3&lt;br /&gt;
 stred=3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* pole[3] == x (18 = 18 )&lt;br /&gt;
*Stredný prvok je zhodný s hľadaným&lt;br /&gt;
*Algoritmus končí&lt;br /&gt;
**Výsledok je index nájdeného prvku, teda ''stred''. V našom príklade je to 3.&lt;br /&gt;
&lt;br /&gt;
===Binárne vyhľadávanie - zdrojový kód v jazyku C===&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov funkcie=hladajBinarne&amp;lt;br/&amp;gt;hladajBinarneR&lt;br /&gt;
Návratová hodnota=index nájdeného prvku (-1 pri neúspechu)&lt;br /&gt;
Parametre=pole prvkov - pole&amp;lt;br/&amp;gt;rozmer poľa - n&amp;lt;br/&amp;gt;hľadaný prvok - x&lt;br /&gt;
Zložitosť algoritmu=O(Log(n))&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keďže samotné definícia binárneho vyhľadávania je rekurzívna, uvádzame aj rekurzívnu verziu funkcie.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable border=1 cellpadding=5&lt;br /&gt;
|+ Binárne vyhľadávanie - jazyk C&lt;br /&gt;
|-&lt;br /&gt;
! Iteračná verzia&lt;br /&gt;
! Rekurzívna verzia&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int hladajBinarne(int *pole,int dlzka, int x)&lt;br /&gt;
{	int najdene=0;&lt;br /&gt;
int lavy = 0, pravy = dlzka - 1, stred;&lt;br /&gt;
while ( (lavy &amp;lt;= pravy) &amp;amp;&amp;amp; (najdene==0) )&lt;br /&gt;
{&lt;br /&gt;
   stred = (lavy + pravy) / 2;&lt;br /&gt;
   if (pole[stred] == x) &lt;br /&gt;
	 najdene=1;&lt;br /&gt;
   else &lt;br /&gt;
  	  if (pole[stred] &amp;lt; x) &lt;br /&gt;
	     lavy = stred + 1;&lt;br /&gt;
	   else &lt;br /&gt;
 	     pravy=stred - 1;&lt;br /&gt;
}&lt;br /&gt;
if(najdene==1)&lt;br /&gt;
	return stred;&lt;br /&gt;
else&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int hladajBinarneR(int *pole,int lavy, int pravy, int x)&lt;br /&gt;
{   if(lavy&amp;gt;pravy)&lt;br /&gt;
		return -1;&lt;br /&gt;
	else&lt;br /&gt;
	{	&lt;br /&gt;
		int stred=(lavy+pravy)/2;&lt;br /&gt;
		if(pole[stred]==x)&lt;br /&gt;
		  return stred;&lt;br /&gt;
		else&lt;br /&gt;
		{   if( x&amp;lt;pole[stred] )&lt;br /&gt;
			return hladajB(pole,lavy,stred-1,x);&lt;br /&gt;
		   else&lt;br /&gt;
			return hladajB(pole,stred+1,pravy,x);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ternárne vyhľadávanie==&lt;br /&gt;
Predpoklad správneho vyhľadávania je, že prvku sú v poli usporiadané. Postup vyhľadávania je podobný ako pri binárnom vyhľadávaním abšak pole nerozdelíme na polovicu ale na tretiny.&lt;br /&gt;
&lt;br /&gt;
;Použité premenné:&lt;br /&gt;
*''pole'' - jednorozmerné pole, v ktorom budeme vyhľadávať&lt;br /&gt;
*''x'' - prvok, ktorý hľadáme&lt;br /&gt;
*''n'' - veľkosť pola ''pole''.&lt;br /&gt;
*''i'', ''j'' - rozsah poľa, (začiatok , koniec) kde budeme hľadať.&lt;br /&gt;
*''m1'' - index prvku v prvej tretine&lt;br /&gt;
*''m2'' - index prvku v druhej tretine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Rozdeľ pole na tretiny&lt;br /&gt;
##m1=( i*2 + j ) / 3;&lt;br /&gt;
##m2=( i + j*2 ) / 3;&lt;br /&gt;
#Porovnaj, či sa hľadaný prvok zhoduje z prvkom na indexe m1, ak áno, tak koniec. Výsledok je index m1&lt;br /&gt;
#Porovnaj, či sa hľadaný prvok zhoduje z prvkom na indexe m2, ak áno, tak koniec. Výsledok je index m2&lt;br /&gt;
#Ak platí i&amp;gt;j, skonči, prvok x sa v poli nenachádza.&lt;br /&gt;
#Ak je hľadaný prvok menší ako prvok pole[m1], tak hľadaj v prvej tretine poľa&lt;br /&gt;
#* i zostáva nezmenené , j=m1-1. Choď na krok 1.&lt;br /&gt;
#Ak je hľadaný prvok väčší ako prvok pole[m2], tak hľadaj v tretej tretine poľa&lt;br /&gt;
#* i = m2+1 , j zostáva nezmenené. Choď na krok 1.&lt;br /&gt;
#inak hľadaj v druhej tretine poľa&lt;br /&gt;
#* i = m1+1 , j=m2-+. Choď na krok 1.&lt;br /&gt;
&lt;br /&gt;
Uveďme príklad: V prechádzajúcom príklade hľadajme číslo x=39&lt;br /&gt;
&lt;br /&gt;
Na začiatku máme:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 i=0&lt;br /&gt;
 j=10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vypočítame m1, m2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 m1=( i*2 + j ) / 3 = (0+10)/3 = 3&lt;br /&gt;
 m2=( i + j*2 ) / 3 = (0+20)/3 = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=1 cellpadding=5&lt;br /&gt;
|+pole=&lt;br /&gt;
|- style=&amp;quot;color:green;background-color:#DADADA&amp;quot;&lt;br /&gt;
|0 ||1 ||2 ||m1=3 ||4 ||5 ||m2=6 ||7 ||8 ||9 ||10&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |2 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |6 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot; |18 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |20 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;| 23 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot; |29 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot;|32 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot;|34 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot;|39 &lt;br /&gt;
|style=&amp;quot;background-color:yellow&amp;quot;|43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Teraz hľadáme v tretej tretine poľa:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 i=m2+1=7&lt;br /&gt;
 j=10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vypočítame m1, m2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 m1=( i*2 + j ) / 3 = (14+10)/3 =8&lt;br /&gt;
 m2=( i + j*2 ) / 3 = (7+20)/3 = 9&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=1 cellpadding=5&lt;br /&gt;
|+pole=&lt;br /&gt;
|- style=&amp;quot;color:green;background-color:#DADADA&amp;quot;&lt;br /&gt;
|0 ||1 ||2 ||3 ||4 ||5 ||6 ||7 ||m1=8 ||m2=9 ||10&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |2 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |6 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |18 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |20 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;| 23 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot; |29 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|32 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot;|34 &lt;br /&gt;
|style=&amp;quot;font-weight:800&amp;quot;|39 &lt;br /&gt;
|style=&amp;quot;background-color:gray&amp;quot;|43&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Platí, že x=pole[m2]. Výsledkom bude teda hodnota m2 (index nájdeného prvku v poli)&lt;br /&gt;
===Ternárne vyhľadávanie - zdrojový kód v C===&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov funkcie=hladajTernarne&lt;br /&gt;
Návratová hodnota=index nájdeného prvku (-1 pri neúspechu)&lt;br /&gt;
Parametre=pole prvkov - pole&amp;lt;br/&amp;gt;rozmer poľa - n&amp;lt;br/&amp;gt;hľadaný prvok - x&lt;br /&gt;
Zložitosť algoritmu=O(Log n)&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int hladajTernarne(int pole[],int i,int j,int x) {&lt;br /&gt;
  int m1,m2;&lt;br /&gt;
  m1=( i*2 + j ) / 3;&lt;br /&gt;
  m2=( i + j*2 ) / 3;&lt;br /&gt;
  if(x==pole[m1])&lt;br /&gt;
    return m1;&lt;br /&gt;
  if(x==pole[m2])   &lt;br /&gt;
    return m2;&lt;br /&gt;
  if(i&amp;gt;j) return -1; // prvok sa nenašiel  &lt;br /&gt;
  if(x&amp;lt;pole[m1]) // hľadaj v prvej tretine&lt;br /&gt;
    return(hladajTernarne(pole, i,m1-1,x));&lt;br /&gt;
  if(x&amp;gt;pole[m2])  // hľadaj v druhej tretine&lt;br /&gt;
    return(hladajTernarne(pole, m2+1,j,x));&lt;br /&gt;
  else   // hľadaj v tretej tretine&lt;br /&gt;
    return(hladajTernarne(pole, m1+1,m2-1,x));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Porovnanie binárneho a ternárneho vyhľadávania===&lt;br /&gt;
;Provnávané varianty:rekurzívne verzie funkcií&lt;br /&gt;
;Spôsov porovnávania: Veľkosť poľa v ktorom hľadáme - n (os x grafu)&amp;lt;br/&amp;gt;&lt;br /&gt;
:Počet hľadaných čísel - 1000&amp;lt;br/&amp;gt;&lt;br /&gt;
:Počet opakovaní každého hľadania - 1000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pLines ymin=0 axiscolor=888888 cubic angle=90 plots legend xtitle=pocet_cisel ytitle=cas_[s]&amp;gt;&lt;br /&gt;
,binarne,ternarne&lt;br /&gt;
1 000, 2.115, 2.094 &lt;br /&gt;
5 000, 2.537, 2.513&lt;br /&gt;
10 000, 2.674, 2.622&lt;br /&gt;
50 000, 3.028, 3.005 &lt;br /&gt;
100 000, 3.252, 3.032&lt;br /&gt;
500 000, 3.642, 3.358&lt;br /&gt;
1 000 000, 3.719, 3.471 &lt;br /&gt;
5 000 000, 4.129, 3.771&lt;br /&gt;
10 000 000, 4.410, 3.963&lt;br /&gt;
50 000 000, 5.679, 4.304&lt;br /&gt;
100 000 000, 5.806, 5.248&lt;br /&gt;
&amp;lt;/pLines&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vyhľadávanie v rekurzívnych štruktúrach=&lt;br /&gt;
Ďalším špeciálnym typom vyhľadávania je vyhľadávanie v rekurzívne definovaných štruktúrach. Medzi tieto štruktúry patria [[Strom_Dátová štruktúra|stromy]], konkrétne [[Binárny strom]] alebo [[B-strom]]. V týchto štruktúrach sa nedá implementovať lineárne vyhľadávanie ani binárne (resp. ternárane) vyhľadávanie, pretože samotná štruktúra takéhoto dátového typu to nedovoľuje.&lt;br /&gt;
==Vyhľadávanie v binárnych stromoch==&lt;br /&gt;
Najjednoduchšia forma stromu je binárny strom. Binárny strom je stromová dátová štruktúra, v ktorej každý uzol má najviac dvoch potomkov. Binárny strom sa skladá z&lt;br /&gt;
# koreňového uzla&lt;br /&gt;
# ľavý a pravý podstrom.&lt;br /&gt;
#*Oba podstromy sú taktiež binárne stromy.&lt;br /&gt;
[[Súbor:binStrom.png|frame|right|Binárny strom]]&lt;br /&gt;
Uzly na najnižšej úrovni stromu (2, 5, 11, 4) sa nazývajú ''listy''.&lt;br /&gt;
Vlastnosťou binárneho stromu je to, že údaje v ňom sú vždy usporiadané nasledovným spôsobom:&lt;br /&gt;
* naľavo od uzla sú tie prvky, ktoré majú hodnotu menšiu ako tohoto uzla&lt;br /&gt;
* napravo od uzla sú tie prvky, ktoré majú hodnotu väčšiu ako tohoto uzla&lt;br /&gt;
&lt;br /&gt;
Pri tomto predpoklade môžeme sformulovať vyhľadávací algoritmus pre binárne stromy:&lt;br /&gt;
&lt;br /&gt;
Budeme hľadať v binárnom strome, ktorý si označme ''bstrom''. Tento každý uzol stromu môže mať žiadneho, jedného alebo dvoch potomkov. Potomkov budeme značiť ''ľavý'' a ''pravý''. V strome ''bstrom'' budeme hľadať prvok ''x''.&lt;br /&gt;
&lt;br /&gt;
#Označ si koreň stromu v ktorom budeme hľadať ako ''uzol''.&lt;br /&gt;
#Porovnaj hodnotu uzla ''uzol'' s hľadaným prvkom ''x''.&lt;br /&gt;
#Ak sa tieto hodnoty zhodujú - koniec. Našli sme prvok ''x''.&lt;br /&gt;
#Ak aktuálny ''uzol'' nemá potomkov, tak koniec - Nenašli sme prvok ''x''.&lt;br /&gt;
#Ak je hodnota ''x'' menšia ako hodnota uzla ''uzol'', tak označ si ako ''uzol'' potomka ''ľavý''. Choď na krok 1.&lt;br /&gt;
#Ak je hodnota ''x'' menšia ako hodnota uzla ''uzol'', tak označ si ako ''uzol'' potomka ''pravý''. Choď na krok 1.&lt;br /&gt;
&lt;br /&gt;
Pseudokód algoritmu vyhľadávania:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
hľadaj(strom, x)&lt;br /&gt;
uzol &amp;lt;- vrhol stromu strom&lt;br /&gt;
ak je uzol list&lt;br /&gt;
  koniec - x sme nenašli&lt;br /&gt;
ak je hodnota uzla == x tak &lt;br /&gt;
  koniec - vráť hodnotu x&lt;br /&gt;
ak je hodnota uzla &amp;lt; x tak&lt;br /&gt;
  hľadaj(uzol-&amp;gt;lavy,x)&lt;br /&gt;
ak je hodnota uzla &amp;gt; x tak&lt;br /&gt;
  hľadaj(uzol-&amp;gt;pravy,x)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
značenie uzol-&amp;gt;lavy, resp. uzol-&amp;gt;pravy má význam, že ďalej budeme pracovať len s ľavou, resp. pravou časťou binárneho stromu.&lt;br /&gt;
&lt;br /&gt;
===Implementácia v jazyku C===&lt;br /&gt;
Definícia binárneho stromu je v kapitole [[Binárny strom]]. Pre správne pochopenie nasledujúcej časti je potrebné vedieť pracovať s binárnym stromom.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definujme dátovú štruktúru binárny strom:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TUzol&lt;br /&gt;
{   int data;&lt;br /&gt;
	 TUzol *lavy,*pravy;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Názov funkcie=hladajRekurzivneStrom&lt;br /&gt;
Návratová hodnota=smerník na nájdený prvok (v prípade neúspechu NULL)&lt;br /&gt;
Parametre=binárny strom - strom&amp;lt;br/&amp;gt;hľadaný prvok - x&lt;br /&gt;
Zložitosť algoritmu=O(n)&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
TUzol* hladajRekurzivneStrom(TUzol *s, int x)&lt;br /&gt;
{ &lt;br /&gt;
  if(s==NULL) return NULL;   &lt;br /&gt;
  if(s-&amp;gt;data == x ) return s;&lt;br /&gt;
  if(x &amp;lt; s-&amp;gt;data) return hladajRekurzivneStrom(s-&amp;gt;lavy);&lt;br /&gt;
  if(x &amp;gt; s-&amp;gt;data) return hladajRekurzivneStrom(s-&amp;gt;pravy);&lt;br /&gt;
&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://www.cs.auckland.ac.nz/software/AlgAnim/trees.html&lt;br /&gt;
&lt;br /&gt;
=HASH funkcie=&lt;br /&gt;
&lt;br /&gt;
=Odkazy=&lt;br /&gt;
* http://en.wikipedia.org/wiki/Linear_search&lt;br /&gt;
* http://en.wikipedia.org/wiki/Binary_search&lt;br /&gt;
* http://en.wikipedia.org/wiki/Ternary_search&lt;br /&gt;
* http://www.dcc.uchile.cl/~rbaeza/handbook/search_a.html&lt;br /&gt;
* http://www.cs.auckland.ac.nz/software/AlgAnim/searching.html&lt;/div&gt;</summary>
		<author><name>Jumanji</name></author>
		
	</entry>
</feed>