Adatszerkezetek és algoritmusok

Halom adatszerkezet bemutató

Halom adatszerkezet bemutató
Az adatok értékek. Az adatokat összegyűjthetjük és sorba, oszlopba, táblázatba vagy fa formába helyezhetjük. Az adatok szerkezete nem csak az adatok elhelyezése ezen formák bármelyikében. A számítás során az adatszerkezet e formátumok bármelyike, plusz az értékek közötti kapcsolat, valamint az értékeken végrehajtott műveletek (függvények). Az ideérkezés előtt már rendelkeznie kell alapvető ismeretekkel a fa adatszerkezetéről, mivel az ott szereplő fogalmakat kevés vagy egyáltalán nem magyarázzák. Ha nincs ilyen ismerete, olvassa el a Fa adatszerkezet oktató kezdőknek című oktatóanyagot a következő linken: https: // linuxhint.com / tree_data_structure_tutorial_beginners /. Ezt követően olvassa tovább ezt az oktatóanyagot.A halom adatszerkezet egy teljes vagy csaknem teljes bináris fa, ahol az egyes csomópontok gyermekei értéke egyenlő vagy kisebb, mint a szülője értéke. Alternatív megoldásként ez egy olyan fa, ahol a szülő értéke megegyezik vagy kisebb, mint bármelyik gyermeke értéke. A fa értékét (nullapontját) kulcsnak is nevezik.

Halom adatszerkezetek illusztrációja

Két halomtípus létezik: egy max-kupac és egy min-kupac. A max-halom struktúra az, ahol a maximális érték a gyökér, és az értékek kisebbek lesznek, amint a fa leereszkedik; bármelyik szülő vagy egyenlő vagy nagyobb értékű, mint egyik közvetlen gyermeke. Min-halom struktúra, ahol a minimális érték a gyökér, és az értékek nagyobbak lesznek, amikor a fa leereszkedik; bármelyik szülő értéke egyenlő vagy kisebb, mint egyik közvetlen gyermeke. A következő ábrákon az első egy max-kupac, a második pedig egy min-kupac:

Mindkét halomnál vegye figyelembe, hogy egy gyermekpár esetében nem mindegy, hogy a bal oldali a nagyobb érték-e. A fa egy szintjén lévő sort nem feltétlenül kell kitölteni a minimumtól a legnagyobbig, balról; nem feltétlenül tölti be a maximumtól a minimumig, balról.

Halom képviselete egy tömbben

Ahhoz, hogy a szoftver könnyedén használhasson egy kupacot, a kupacot tömbben kell ábrázolni. A fenti tömbben látható maximális kupac a következő:

89., 85., 87., 84., 82., 79., 73., 80., 81.,, 65., 69

Ez úgy kezdődik, hogy a tömb első értékének gyökérértéke kezdődik. Az értékeket folyamatosan helyezzük el a fa balról jobbra, felülről lefelé olvasásával. Ha egy elem hiányzik, akkor a tömbben való helyzete kihagyásra kerül. Minden csomópontnak két gyermeke van. Ha egy csomópont az n indexben (pozícióban) van, akkor a tömbben az első gyermek a 2n + 1, a következő gyermek pedig a 2n + 2 indexen van. 89 a 0 indexen van; első gyermeke, 85 a 2-es indexen van (0) + 1 = 1, míg a második gyermeke a 2-es (0) + 2 = 2 indexen van. 85 az 1. indexen van; első gyermeke, 84, a 2-es (1) + 1 = 3 indexen van, míg második gyermeke, 82 a 2-es (1) + 2 = 4 indexen van. 79 az 5. indexen van; első gyermeke, a 65-ös a 2-es (5) + 1 = 11 indexen van, míg a második gyermeke a 2-es (5) + 2 = 12 indexen van. A képleteket a tömb többi elemére alkalmazzuk.

Egy ilyen tömböt, ahol az elem jelentését és az elemek közötti kapcsolatot az elem helyzete implikálja, implicit adatstruktúrának nevezzük.

A fenti min-halom implicit adatstruktúrája:

65, 68, 70, 73., 71., 83., 84., 79., 80., 85., 89

A fenti max-kupac teljes bináris fa, de nem teljes bináris fa. Ezért egyes helyek (pozíciók) üresek a tömbben. Teljes bináris fa esetén egyetlen tömb sem lesz üres.

Ha például a kupac csaknem teljes fa lenne, például ha hiányozna a 82 érték, akkor a tömb a következő lenne:

89, 85, 87, 84, 79, 73, 80, 81,, 65, 69

Ebben a helyzetben három helyszín üres. A képletek azonban továbbra is alkalmazhatók.

Tevékenységek

Az adatszerkezet az adatok formátuma (pl.g. egy fa), plusz az értékek közötti kapcsolat, plusz az értékeken végrehajtott műveletek (függvények). Egy kupac esetében az egész kupacon áthaladó kapcsolat az, hogy a szülőnek legalább akkora értékűnek kell lennie, mint a gyerekek, egy kupachoz; és a szülőnek legalább egy halom értékűnek kell lennie, vagy kisebbnek kell lennie, mint a gyerekek. Ezt a kapcsolatot halom tulajdonságnak nevezzük. A halom műveletei a Teremtés, Alapvető, Belső és Ellenőrzés címsorokba vannak csoportosítva. A halom műveleteinek összefoglalása következik:

Halom műveletek összefoglalása

Vannak olyan szoftveres műveletek, amelyek közösek a halmokban, az alábbiak szerint:

Halom létrehozása

create_heap: Halom létrehozása azt jelenti, hogy olyan objektumot kell alkotni, amely a kupacot ábrázolja. A C nyelven létrehozhat egy halmot a struct objektumtípussal. A struktúra egyik tagja a kupac tömb lesz. A többi tag a halom függvénye (művelete) lesz. A Create_heap egy üres halom létrehozását jelenti.

Heapify: A kupac tömb részben rendezett (rendezett) tömb. A Heapify azt jelenti, hogy egy halomtömböt adjon meg egy válogatatlan tömbből - lásd alább a részleteket.

Egyesítés: Ez azt jelenti, hogy két különböző kupacból képezzen egy unió halmot - lásd a részleteket alább. A két kupacnak max-kupacnak vagy min-kupacnak kell lennie. Az új kupac összhangban van a kupac tulajdonsággal, miközben az eredeti kupacok megmaradnak (nem törlődnek).

Összeolvadás: Ez azt jelenti, hogy két azonos típusú halmot egyesítsen, hogy újat alakítson ki, megőrizve a duplikátumokat - lásd alább a részleteket. Az új kupac összhangban van a kupac tulajdonsággal, míg az eredeti kupacok megsemmisülnek (törlődnek). Az összeolvadás és az összeolvasztás közötti fő különbség az, hogy az összeolvasztáshoz az egyik fa részfaként illeszkedik a másik fa gyökeréhez, lehetővé téve az ismétlődő értékeket az új fában, míg az összevonáshoz új kupacfa jön létre, eltávolítva a duplikátumokat. Nincs szükség a két eredeti halom karbantartására.

Halom alapműveletek

find_max (find_min): Keresse meg a max-heap tömb maximális értékét, és adjon vissza egy példányt, vagy keresse meg a minimális értéket a min-heap tömbben, és adjon vissza egy példányt.

Beszúrás: Adjon hozzá egy új elemet a kupac tömbhöz, és rendezze át a tömböt úgy, hogy a diagram kupac tulajdonságai megmaradjanak.

extract_max (extract_min): Keresse meg a max-heap tömb maximális értékét, távolítsa el és adja vissza; vagy keresse meg a minimális értéket a min-heap tömbben, távolítsa el és adja vissza.

delete_max (delete_min): Keresse meg a max-heap gyökércsomópontját, amely a max-heap tömb első eleme, távolítsa el anélkül, hogy feltétlenül visszaadná; vagy keresse meg a min-halom gyökércsomópontját, amely a min-halom tömb első eleme, távolítsa el anélkül, hogy feltétlenül visszaadná;

Csere: Keresse meg bármelyik halom gyökércsomópontját, távolítsa el és cserélje le egy újra. Nem számít, hogy a régi gyökér visszatér-e.

Belső kupacműveletek

növekedés_kulcs (csökkentés_kulcs): Növelje bármelyik csomópont értékét egy max-halomhoz és átrendezze úgy, hogy a kupac tulajdonság megmaradjon, vagy csökkentse bármelyik csomópont értékét egy min-kupac és átrendezés érdekében, hogy a kupac tulajdonság megmaradjon.

Törlés: töröljön minden csomópontot, majd rendezze át úgy, hogy a kupac tulajdonság megmaradjon a max-heap vagy a min-heap számára.

shift_up: csúsztasson egy csomópontot max-kupacban vagy min-kupacban felfelé, ameddig csak szükséges, átrendezve a kupac tulajdonság fenntartása érdekében.

shift_down: csúsztasson lefelé egy csomópontot max-kupacban vagy min-kupacban, ameddig csak szükséges, átrendezve a kupac tulajdonság fenntartása érdekében.

Halom ellenőrzése

Méret: Ez visszaadja a halmok kulcsainak (értékeinek) számát; nem tartalmazza a halomtömb üres helyeit. A kupacot ábrázolhatjuk kóddal, mint az ábrán, vagy tömbökkel.

üres: Ez logikai értéket ad vissza, ha nincs egy csomópont egy kupacban, vagy logikai hamis, ha a kupacban van legalább egy csomópont.

Halomban szitálás

Van fel- és leszűrés:

Szitálás: Ez azt jelenti, hogy cseréljünk egy csomópontot a szülőjével. Ha a halom tulajdonság nem teljesül, cserélje ki a szülőt a saját szülőjével. Folytassa ezt az utat addig, amíg a kupac tulajdonság meg nem felel. Az eljárás elérheti a gyökeret.

Sift-Down: Ez azt jelenti, hogy cseréljünk egy nagy értékű csomópontot a két gyermek közül a kisebbikre (vagy egy gyereket egy szinte teljes halomra). Ha a halom tulajdonság nem teljesül, cserélje ki az alsó csomópontot a saját két gyermekének kisebb csomópontjával. Folytassa ezt az utat addig, amíg a kupac tulajdonság meg nem felel. Az eljárás eljuthat egy levélig.

Halmozó

A Heapify azt jelenti, hogy rendezni kell egy rendezetlen tömböt, hogy a kupac tulajdonság kielégüljön a max-halom vagy a min-halom esetében. Ez azt jelenti, hogy lehet néhány üres hely az új tömbben. A max-kupac vagy a min-kupac halmozásának alapvető algoritmusa a következő:

- ha a gyökércsomópont szélsőségesebb, mint bármelyik gyermeke csomópontja, akkor cserélje ki a gyökérpontot a kevésbé szélső gyermekcsomópontra.

- Ismételje meg ezt a lépést a gyermekek csomópontjaival egy előrendelési fa átjárási sémában.

A végső fa egy kupacfa, amely kielégíti a kupac tulajdonságait. A kupac ábrázolható fa diagramként vagy tömbben. A kapott kupac egy részben válogatott fa, azaz.e. részben rendezett tömb.

Halom művelet részletei

A cikk ezen szakasza a halom műveletek részleteit tartalmazza.

Halom létrehozása Részletek

create_heap

Lásd fent!

elhalmozni

Lásd fent

összeolvad

Ha a kupac tömbök,

89., 85., 87., 84., 82., 79., 73., 80., 81.,, 65., 69

és

89., 85., 84., 73., 79., 80., 83., 65., 68., 70., 71

egyesülnek, az ismétlődések nélküli eredmény lehet,

89., 85., 87., 84., 82., 83., 81., 80., 79., 73., 68., 65., 69., 70., 71

Némi szitálás után. Figyelje meg, hogy az első tömbben 82-nek nincs gyermeke. A kapott tömbben a 4. indexen van; és a 2. (4) + 1 = 9 és 2 (4) + 2 = 10 indexen található helyek üresek. Ez azt jelenti, hogy az új fadiagramon szintén nincsenek gyerekek. Az eredeti két kupacot nem szabad törölni, mivel információik nem igazán vannak az új kupacban (új tömb). Az azonos típusú halmok egyesítésének alapvető algoritmusa a következő:

- Csatlakoztassa az egyik tömböt a másik tömb aljához.

- A Heapify kiküszöböli a duplikátumokat, ügyelve arra, hogy azok a csomópontok, amelyeknek nem voltak gyermekeik az eredeti kupacokban, még mindig ne legyenek gyermekeik az új kupacban.

bemond

Két azonos típusú (akár két max, akár két perc) halom összeolvasztásának algoritmusa a következő:

- Hasonlítsa össze a két gyökércsomópontot.

- Készítse el a kevésbé szélső gyökeret és annak többi fáját (alfa), a szélső gyökér második gyermekét.

- Szitálja a mostani szélső részfa gyökerének kóbor gyermekét, a szélső részen lefelé.

A kapott kupac még mindig összhangban van a kupac tulajdonsággal, miközben az eredeti kupacok megsemmisülnek (törlődnek). Az eredeti kupacok elpusztulhatnak, mert az összes birtokukban lévő információ még mindig az új kupacban van.

Halom alapműveletek

find_max (find_min)

Ez azt jelenti, hogy megtalálja a maximális értéket a max-heap tömbben és visszaküldi a példányt, vagy megtalálja a minimális értéket a min-heap tömbben, és visszaküld egy példányt. A halomtömb definíció szerint már kielégíti a kupac tulajdonságot. Tehát csak adja vissza a tömb első elemének másolatát.

betét

Ez azt jelenti, hogy új elemet kell hozzáadni a kupac tömbhöz, és úgy kell átrendezni a tömböt, hogy a diagram kupac tulajdonságai megmaradjanak (elégedettek). Az algoritmus mindkét halomtípusra a következő:

- Tegyünk fel egy teljes bináris fát. Ez azt jelenti, hogy a tömböt a végén üres helyekkel kell kitölteni, ha szükséges. A teljes kupac csomópontjainak teljes száma 1, 3 vagy 7 vagy 15 vagy 31, stb.; folyamatosan duplázzon és adjon hozzá 1-et.

- Helyezze a csomópontot nagyságrendileg a legalkalmasabb üres helyre, a kupac vége felé (a kupac tömb vége felé). Ha nincs üres hely, akkor kezdjen egy új sort a bal alsó sarokból.

- Szükség esetén szitáljuk fel, amíg a kupac tulajdonság meg nem felel.

extract_max (extract_min)

Keresse meg a max-heap tömb maximális értékét, távolítsa el és adja vissza; vagy keresse meg a minimális értéket a min-heap tömbben, távolítsa el és adja vissza. A_max (extract_min) kivonásának algoritmusa a következő:

- Távolítsa el a gyökércsomópontot.

- Vegyük el (távolítsuk el) a jobb alsó szélső csomópontot (a tömb utolsó csomópontja), és tegyük a gyökérhez.

- Szükség szerint szitálja le, amíg a kupac tulajdonság meg nem felel.

delete_max (delete_min)

Keresse meg a max-heap gyökércsomópontját, amely a max-heap tömb első eleme, távolítsa el anélkül, hogy feltétlenül visszaadná; vagy keresse meg a min-heap gyökércsomópontját, amely a min-heap tömb első eleme, távolítsa el anélkül, hogy feltétlenül visszaadná. A gyökércsomópont törlésére szolgáló algoritmus a következő:

- Távolítsa el a gyökércsomópontot.

- Vegyük (távolítsuk el) a jobb alsó szélső csomópontot (a tömb utolsó csomópontja), és tegyük a gyökérhez.

- Szükség szerint szitálja le, amíg a kupac tulajdonság meg nem felel.

cserélje ki

Keresse meg bármelyik halom gyökércsomópontját, távolítsa el, és cserélje ki az újra. Nem számít, hogy a régi gyökér visszatér-e. Szükség esetén szitálja le, amíg a kupac tulajdonság meg nem felel.

Belső kupacműveletek

növekedés_kulcs (csökkentés_kulcs)

Növelje bármelyik csomópont értékét egy max-halomhoz és rendezze át úgy, hogy a kupac tulajdonság megmaradjon, vagy csökkentse bármelyik csomópont értékét egy min-halom és átrendezés érdekében, hogy a kupac tulajdonság megmaradjon. Szitáljon felfelé vagy lefelé, ha szükséges, amíg a kupac tulajdonság meg nem felel.

töröl

Távolítsa el az érdekes csomópontot, majd rendezze át úgy, hogy a kupac tulajdonság megmaradjon a max-kupac vagy a min-kupac számára. A csomópont törlésére szolgáló algoritmus a következő:

- Távolítsa el az érdekes csomópontot.

- Vegyük (távolítsuk el) a jobb alsó szélső csomópontot (a tömb utolsó csomópontja), és helyezzük az eltávolított csomópont indexéhez. Ha a törölt csomópont az utolsó sorban van, akkor erre nincs szükség.

- Szitáljon felfelé vagy lefelé, ha szükséges, amíg a kupac tulajdonság meg nem felel.

felvált

Csúsztasson fel egy csomópontot max-halomban vagy min-halomban, ameddig csak szükséges, átrendezze a kupac tulajdonság fenntartása érdekében - szitálja fel.

shift_down

Csúsztasson lefelé egy max-halomban vagy egy min-kupacban, ameddig csak szükséges, átrendeződik a kupac tulajdonság fenntartása érdekében - szitáljon le.

Halom ellenőrzése

méret

Lásd fent!

üres

Lásd fent!

A halmok egyéb osztályai

Az ebben a cikkben leírt halom tekinthető fő (általános) kupacnak. Vannak más halomosztályok is. Azonban a kettő, amelyet ezen túl tudnia kell, a bináris halom és a d-ary halom.

Bináris kupac

A bináris halom hasonló ehhez a fő kupachoz, de több korlátozással rendelkezik. Különösen a bináris kupacnak teljes fának kell lennie. Ne keverje össze a teljes és a teljes fát.

d-ary Halom

A bináris halom egy 2-ary halom. Egy halom, ahol minden csomópontnak 3 gyermeke van, egy 3 kosos kupac. Egy halom, ahol minden csomópontnak 4 gyermeke van, egy 4 ary halom, és így tovább. A d-ary halomnak egyéb korlátai vannak.

Következtetés

A kupac egy teljes vagy csaknem teljes bináris fa, amely kielégíti a kupac tulajdonságot. A kupac tulajdonságnak 2 alternatívája van: egy max-kupachoz a szülőnek értéke egyenlő vagy nagyobb, mint a közvetlen gyerekek; min-halom esetén a szülőnek egyenlőnek vagy kisebbnek kell lennie, mint a közvetlen gyerekek. A kupac ábrázolható faként vagy tömbben. Ha egy tömbben ábrázolják, a gyökércsomópont a tömb első csomópontja; és ha egy csomópont az n indexen van, akkor a tömb első gyermeke a 2n + 1 indexen van, a következő gyermeke pedig a 2n + 2 indexen van. A halomnak vannak bizonyos műveletei, amelyeket a tömbön hajtanak végre.

Chrys

Az AutoKey használata a Linux játékok automatizálásához
Az AutoKey egy asztali automatizáló segédprogram Linux és X11 rendszerekhez, Python 3, GTK és Qt programozással. A parancsfájlok és a MACRO funkcióina...
Az FPS-számláló megjelenítése a Linux-játékokban
A Linux játék komoly lendületet kapott, amikor a Valve 2012-ben bejelentette a Linux támogatását a Steam kliensnek és játékaiknak. Azóta sok AAA és in...
Sid Meier Civilization VI letöltése és lejátszása Linuxon
Bevezetés a játékba A Civilization 6 egy modern felvétel a Age of Empires játékok sorozatában bevezetett klasszikus koncepcióra. Az ötlet meglehetősen...