Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 27. 10. 2010 19:52 — Editoval VojtechSejkora (27. 10. 2010 19:52)

VojtechSejkora
Příspěvky: 176
Reputace:   
 

Halda

Halda


tady nějak nechápu to s tím prvkem na pozici k jakto že má dva následníky? na 2k a 2k+1?? (tedy pro k=10 na pozicích 20 a 21)??




nějak nechápu jak přišli na to že se pokaždé pozice prvku x zmenší o polovinu

Offline

  • (téma jako vyřešené označil(a) VojtechSejkora)

#2 27. 10. 2010 20:59

septolet
Příspěvky: 334
Reputace:   
 

Re: Halda

↑ VojtechSejkora:

Pokud se nepletu, tak to máš z téhle stránky: http://ksp.mff.cuni.cz/tasks/20/cook4.html Je u toho i obrázek, který mi přijde celkem jasný. Ten ti nepomohl?

Vlastními slovy to řeknu takto. Máš nějaký vrchol a k němu náleží dva potomci. Ovšem číselné označení vrcholů je inkrementující zprava doleva, takže pokud se chceš posunout na potomka, tak musíš přeskočit všechny ostatní vrcholy na stejné úrovni. Asi je to trochu kostrbatě řečené, ale snad ti to trochu pomůže.

Má dva následníky, protože je to prostě výhodné z hlediska časové náročnosti. Jak se na té stránce píše, tak se halda využívá například ke třídění čísel.

A ano, pro k=10 budou následníci na pozicích 20 a 21.

Co se týče tvého druhého dotazu, tak to prostě souvisí s uspořádáním té haldy. Koukni se na uvedený obrázek a a na tento algoritmus (je také na té stránce):

Code:

procedure vloz(prvek: integer);    
var i, x: integer;
begin
  i:=N; N:=N+1;
  halda[i]:=prvek;
  while (i>1) and (halda[i div 2]>halda[i]) do begin
    x:=halda[i div 2];
    halda[i div 2]:=halda[i];
    halda[i]:=x;
    i:=i div 2
  end
end;

Jak vidíš, tak prohazuješ prvek s jeho předchůdcem tak dlouho, dokud buď neprobublá na první pozici haldy, nebo dokud je jeho předchůdce větší.

Offline

 

#3 27. 10. 2010 20:59

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: Halda

Ahoj!

Aj Ty riešiš KSP ako vidím :) (dedukujem z toho, že to máš z kuchárky)...

No takže vysvetlím ti to rýchlo a po svojom...

Halda je binárny strom, kde je splnené nasledujúce:
1) V každej hladine od prvej až po predposlednú je maximálny počet uzlov v k-tej hladine $2^{k-1}$ (zamysli sa prečo sám, vyplýva to zo skutočnosti, že sa jedná o binárny strom).
2) V poslednej hladine sú uzly umiestnené čo najviac vľavo (vyplýva to z toho, že je realizovaná v poli).
3) Pre každý vrchol platí, že hodnota uložená v ňom je menšia ako hodnota v ľubovoľnom následníkovi daného vrchola (alebo väčšia, podľa toho či si haldu usporiadávaš tak, aby si mal v koreni maximum alebo minimum).

(Použiem ten obrázok z KSP)

https://ksp.mff.cuni.cz/tasks/20/halda.png

Vidíš tam tie vrcholy binárneho stromu očíslované 1-9?
To čo sa pýtaš v prvej otázke, je pre jednoduché pohybovanie sa v poli.
V poli máš tie hodnoty na obrázku usporiadané takto:
1     2     3     4     5     6     7     8     9
5     6     20     25     7     21     22     26     27

No a keď sa nachádzaš na prvku s indexom 4 (hodnota je 25) tak z obrázka vidíš, že nasledovníci (dvaja) sú prvky s indexom 8 a 9. Čo je vlastne $2*4$ a $2*4+1$

No a druhá otázka...
Zišlo by sa ti naštudovať čo je to binárny strom. Tam sa dá pomerne ľahko odvodiť, že výška binárneho stromu je približne $log_2N$. A keďže halda nie je nič iné ako binárny strom, tak také pendlovanie prvku zhora-dole zaberie približne $O(logN)$.


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#4 27. 10. 2010 22:09

VojtechSejkora
Příspěvky: 176
Reputace:   
 

Re: Halda

↑ pizet:

díky tak tomu teď už trošku rozumím.... mě nedošlo že to musím brát pro ten blbej strom.... a kde se dá najít něco o binárním stromě?

ano řeším KSP, a myslel jsme že budu toto potřeboval, ale jesli jsem to tedy dobře pochopil tak ten binární strom je realizován v poli?

a jakto že na 3.pozici není 7čka a je tam 20tka?:-o.... ano splňuje podmínky haldy, ale.....pokud bych to měl tedy v poli tak by to bylo špatně seřazeno když to chci mít od nejnižšího po nejvyšší a nebo to já takto seřazeno nechci? a nebo to se dělá až v tom dalším? a tady se spokojím jen s tím že předešlý prvek je menší než tento a následovník je větší?

jinak 1čka je jasná, protože je to normální binární soustava, tu znám ze školy , 2ku taktéž chápu a 3ku taky.... takže pokud jen tyto 3body musím splnit pro haldu.... tak si nastuduji binární strom a potom heap nebo jak se jmenuje to seřazování pomocí haldy.... díky asi jsme to trošku pochopil:)

↑ septolet:
ano mám to z kuchařky a asi i zu toho serveru jak jsi psal, ale koukal jsme se na to i na wiki, ale ta mi vůbec nepomohla a ono když máme programování 1.ročník a já bych tomu ani programování neříkal (pomalu toho i já vím více jak p. učitel, ale něco ví on zas já)  tak nemůžu vědět co je to binární strom... navíc se stejně v tom programování učíme jen psaní nějakých blbostí podle předem napsaného algoritmu takže vpodstatě přepisujeme grafický algoritmus do jazyka java...takže nic moc

jo a paskalu vůbec nerozumím a nevyznám se v něm ano měl bych se ho asi doučit, protože většina věcích obecných je psaná v paskalu, ale prostě mě zatím tneto jazyk nedává moc smysl a neumím ho číst, proto mi byl ten obrázek kničemu

Offline

 

#5 27. 10. 2010 22:28

septolet
Příspěvky: 334
Reputace:   
 

Re: Halda

↑ VojtechSejkora:

Pascal bych se neučil, přijde mi to zbytečné. Nicméně ten kousek kódu viz. výše mi přijde, že se dá pochopit i bez znalosti Pascalu, proto jsem ho zde uvedl. Třeba já jsem v Pascalu nenapsal ani Hello world.

Jinak souhlas, že "programování" na SŠ je nic moc.

Offline

 

#6 27. 10. 2010 23:12 — Editoval xxsawer (28. 10. 2010 10:10)

xxsawer
Příspěvky: 196
Reputace:   
 

Re: Halda

↑ VojtechSejkora:

Ahoj, je to jednoduchý, jenom je potřeba si uvědomit pár věcí...
Je dobrý vědět, co to je binární strom. Je to datová struktura, kterou vidíš na obrázkách. Máš nějakej uzel a ten má maximálně dva poduzly (proto se mu taky říká binární). Jak vidíš, tak ty uzly úplně dole už nemají žádný poduzly a říká se jim listy stromu.

Jak takovouhle strukturu implementovat? Normálně se to implementuje pomocí ukazatelů. Uděláš si datový typ záznam (když to budeš psát třeba v Pascalu), kde budeš mít užitečnou hodnotu - to je obsah toho uzlu a pak dva ukazatele, každej na jeden poduzel.
Jiná možnost je implementovat to pomocí pole a to je právě to co máš dělat ty.
Abysme se v tom nezamotali tak budem rozlišovat dva pojmy: Předchůdce v poli je prvek s indexem o jedničku menším. Takže předchůdce v poli prvku s indexem 5 je prvek s indexem 4. Toto tě ale vůbec nezajímá... Předchůdce v haldě je rodič danýho prvku v binárnim stromu. Takže když koukneš na ty obrázky, tak předchůdce v haldě prvku 10 je prvek 5. NENÍ to prvek 9 ani 8 atd atd.

http://www.sdilej.eu/pics/25261cbd03efe3c166a4e632227c887b.jpg
Aby to bylo jednodušší na pochopení, tak pole indexuju od 1 a na začátku do něj dám prvky stejný jako jsou jeho indexy. Takže je hezky vidět, že je ten strom v tom poli uloženej jakoby po řadách...

Teď si představ, že do týhle struktury chceš vložit prvek s hodnotou 2,5. Tak jak to ukazuje další obrázek.
http://www.sdilej.eu/pics/3c56a97eb55f04ca6e0a6142ecef8728.jpg

Ty chceš tenhle prvek vložit na správný místo v poli. Takže tak jak to máš napsaný v tom návodu ho na začátku vrazíš na konec pole. Dobrý je ale tady si uvědomit, kdo je předchůdce v hromadě tohodle prvku. Není to 15tka, ale je to 8čka!!! tak jak to je nakreslený na obrázku. Index předchůdce spočítáš pomocí trunc(k/2) viz ten tvůj návod.

Teď porovnáš ten prvek 2,5 s jeho předchůdcem (tedy s prvkem 8). 2,5 < 8 takže prvky přehodíš, viz další obrázek
http://www.sdilej.eu/pics/70bd44c002f66a6a259cb8862f22b9d9.jpg

Pak zas porovnáš 2,5 s předchůdcem (tedy s prvkem 4). 2,5 < 4 takže je zas přehodíš, viz další obrázek
http://www.sdilej.eu/pics/0628c5e52cf736ec6d01564062418277.jpg
Pak zas porovnáš 2,5 s jeho předchůdcem (tedy s prvkem 2). 2,5 > 2 takže už nic nepřehazuješ a máš hotovo.


Co je dobrý si uvědomit?
Jak vidíš to pole nebude seřazený podle velikosti prvků. To sem tak zvolil jenom na začátku aby to pěkně vypadalo. Stejně tak neplatí, že levý poduzel je vždycky menší než pravý poduzel (Zkus si do toho posledního stromu vložit třeba uzel s hodnotou 3 a všimni si kam ti spadla 4ka). Jediný co máš tady jistý je, že rodičovský uzel bude vždycky větší (nebo roven) než oba jeho poduzly. Jak v takovýhle struktuře vyhledávat? Nad tím sem si chvíli lámal hlavu a pak mi došlo, že nijak :) Tohle neni binární vyhledávací strom. Dá se sem jenom vkládat novej prvek, odebrat nejmenší nebo zjistit hodnotu nejmenšího přesně tak jak to je v tom návodu...

Offline

 

#7 28. 10. 2010 01:31

VojtechSejkora
Příspěvky: 176
Reputace:   
 

Re: Halda

↑ xxsawer:
paráda tak teď si myslím e už tomu opravdu rozumím:) díky...

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson