. előadás ról általában, soros, önátrendező, rendezett és kulcstranszformációs Adatszerkezetek és algoritmusok előadás 0. április. ról általában,, és Debreceni Egyetem Informatikai Kar.
Általános tudnivalók Ajánlott irodalom: Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Új algoritmusok, Scolar Informatika, 00. Donald E. Knuth: A számítógépprogramozás művészete. (Alapvető algoritmusok), Műszaki Könyvkiadó,. Donald E. Knuth: A számítógépprogramozás művészete. (Keresés és rendezés), Műszaki Könyvkiadó,. Seymour Lipschutz: Adatszerkezetek, Panem-McGraw-Hill, Budapest,. Rónyai Lajos, Ivanyos Gábor, Szabó Réka: Algoritmusok, Typotex, Budapest, 00. Félév teljesítésének feltételei: Gyakorlati aláírás ZH Írásbeli vizsga, aminek az értékelésébe... További részletek: http://hallg.inf.unideb.hu/~halasz http://it.inf.unideb.hu/~halasz http://shrek.unideb.hu/~gjhalasz ról általában.
Adatelemei tartalmuk alapján, valamilyen kulcs segítségével címezhetők (pl.: tömb, mátrix, ). Legegyszerűbb eset: kulcs = index (pl. tömb). Megkülönböztetünk: közvetlen (direkt) szervezésű struktúrák véletlen (indirekt) szervezésű struktúrák Feladat: a kulcs alapján feleltessünk meg valamilyen memóriaterületet az adatelemnek. ról általában Közvetlen szervezésű struktúrák esetén a kulcs és az adatelem között egyértelmű megfeleltetés állítható fel..
dinamikus, homogén és asszociatív adatszerkezet. KULCS ÉRTÉK a egy eleme ról általában Elemei összetettek: kulcs és érték komponensből állnak..
A kulcsnak a ban előforduló értékeit kulcsértékeknek nevezzük. KULCS ÉRTÉK ról általában a kulcs értékei (különbözőek) elemeit a kulcsuk értékei alapján különböztetjük meg egymástól. ban nem szerepelhet két azonos kulcsérték. (Ezért nevezhetjük őket kulcsértékeknek.).
az egydimenziós tömb általánosításának tekinthető: az adatelemeket a kulcsuk értéke alapján azonosítjuk, ezeknek az értékeknek azonban nem feltétlenül kell egész számoknak lenniük, lehet más típusuk is. KULCS ÉRTÉK ról általában azonos típusúak A KULCS és ÉRTÉK komponensek típusának sem feltétlenül kell megegyeznie egymással. Az adatelemekben a kulcsértékek típusát a KULCS típusa, az értékek típusát az ÉRTÉK típusa határozza meg..
az egydimenziós tömb általánosításának tekinthető: az adatelemeket a kulcsuk értéke alapján azonosítjuk, ezeknek az értékeknek azonban nem feltétlenül kell egész számoknak lenniük, lehet más típusuk is. KULCS ÉRTÉK ról általában azonos típusúak A KULCS és ÉRTÉK komponensek típusának sem feltétlenül kell megegyeznie egymással. Az adatelemekben a kulcsértékek típusát a KULCS típusa, az értékek típusát az ÉRTÉK típusa határozza meg..
Az adatelemek beli sorrendjét az elemek ba kerülésének időbeli (érkezési) sorrendje, ill. az esetleges törlések sorrendje befolyásolja. tal végezhető műveletek Létrehozás: a KULCS és az ÉRTÉK típusának meghatározása, és az elemek elhelyezése érkezési sorrendben. Bővítés: a végén, az új elemet az eddigi utolsó elem mögé helyezzük el. Törlés: mind folytonos, mind szétszórt reprezentáció mellett megvalósítható a fizikai törlés. Csere: az érték rész bármikor, kulcsérték csak akkor cserélhető, ha az új érték még nem szerepel. Rendezés: nem értelmezett. Keresés: teljes keresés a kulcs értéke alapján. Elérés: soros. Bejárás: általában az elejétől a végéig. A feldolgozás alapja a kulcs és a teljes keresés. ról általában.
Folytonosan és szétszórtan (pl. egyirányban láncolt listával) egyaránt ábrázolható. Előbbi esetben a fizikai törlést úgy valósíthatjuk meg, hogy a törlendő adatelemet a utolsó elemével felülírjuk, és csökkentjük a aktuális elemszámát. Utóbbi esetben a törlés szokás szerint mutatóértékek cseréjével oldható meg. Mikor érdemes használni? Ha az elemek feldolgozási gyakorisága nagyjából azonos, és nem lényeges az elemek feldolgozásának a sorrendje. (Pl.: Sokkal gyakrabban számolunk átlagot, mint keresünk egy bizonyos elemet.) ról általában.
tal végezhető műveletek A műveletek legtöbbje megegyezik a soros éval. Kivételt képez a feldolgozás. Egy elem feldolgozása után a feldolgozott elemet a elejére helyezzük, az addigi első elem elé. Ennek következtében mindig a legutoljára feldolgozott elem lesz a elején. Nagyszámú adatelem feldolgozása után az elemek sorrendje a ban jól fogja közelíteni a feldolgozási gyakoriságot: a elején lesznek a gyakrabban feldolgozott elemek. Az önátrendező legjobban szétszórtan, egyirányban láncolt listával reprezentálható. Ekkor a feldolgozás művelete mindössze három mutató értékének a cseréjét jelenti. ról általában Mikor érdemes használni? Ha az elemek feldolgozási gyakorisága (nagyon) eltérő..
endezett Elemei a kulcsértékek alapján rendezettek, az adatelemek sorrendjét a kulcsértékek (általában) növekvő sorrendje definiálja. tal végezhető műveletek A műveletek legtöbbje megegyezik a soros éval. Kivételt képeznek a következő műveletek: Létrehozás és bővítés: az érkező elemeket rendezetten helyezzük el a ban, rendezett sorozatba történő beszúrással. Csere: az adatelem értékrésze bármikor cserélhető. Keresés: lineáris vagy bináris (reprezentációfüggő). Folytonos reprezentációnál gyorsabb a keresés, de nehézkes a bővítés és a törlés. Szétszórt reprezentációnál ennek az ellenkezője igaz. ról általában Mikor érdemes használni? Ha az elemek feldolgozási gyakorisága nagyjából azonos, és fontos a feldolgozásuk sorrendje és gyorsasága..0
ulcstranszformációs Véletlen szervezésű struktúrák. Cél A (szinte) közvetlen elérés biztosítása a kulcsértékek alapján. Hash függvény A kulcstranszformációs ban egy K értékű kulccsal rendelkező elem helyét (címét) egy h függvény h(k ) értéke határozza meg. Ezt a h függvényt hívjuk hasító vagy hash függvénynek. Hashing Azt az eljárást, melynek során egy adatelem K értékű kulcsához meghatározzuk a h(k ) értéket (az adatelem beli helyét), hasításnak, hashingnek, randomizálásnak vagy kulcstranszformációnak nevezzük. ról általában Ennek a fajtának az ábrázolása folytonos vagy legalább a folytonos ábrázoláson alapul..
ulcstranszformációs Kölcsönösen egyértelmű hash függvény használható, ha a gyakorlatban előforduló kulcsértékek száma közel azonos az elvileg lehetséges kulcsértékek számával; vagy a gyakorlatban előforduló kulcsértékek egyenletesen oszlanak el az elvileg lehetséges kulcsértékek között. ról általában Ha a gyakorlatban előforduló kulcsértékek száma és az elvi lehetőségek száma között nagy az eltérés, és a gyakorlatban előforduló kulcsértékeknek nem egyenletes az eloszlása, akkor csak egyértelmű hash függvények használatára van lehetőség. Egy egyértelmű hash függvénytől a következőket várjuk el: a gyakorlatban előforduló kulcsokat képezze le a rendelkezésre álló címtartományba; a rendelkezésre álló címtartományon belül tegye egyenletessé az elemek eloszlását..
ulcstranszformációs módszer A kulcstranszformációs módszer egy algoritmus, amely azt írja le, hogy a hash függvény hogyan képezi le a kulcsértéket a tárbeli címre. A gyakorlatban a kulcsok típusa alapján megkülönböztetünk szöveges és numerikus kulcsokat. Szöveges típusú kulcsok esetén a szöveget alkotó karakterek belső kódjainak valamilyen numerikus függvényét tekintjük, amellyel a kulcstranszformációt a numerikus típusú kulcsok esetére vezethetjük vissza. ról általában Numerikus típusú kulcsok esetén többek között az alábbi használhatók: prímszámmal való osztás szorzás helyiérték-kiválasztás bázistranszformáció.
, szinonimakezelő Univerzális hash függvény nem létezik. A csak egyértelmű hash függvényeknél előfordulhat, hogy a függvény a különböző kulcsértékekkel rendelkező adatelemekhez ugyanazt a tárcímet rendeli. Az ilyen adatelemeket szinonimáknak, magát a jelenséget pedig túlcsordulásnak nevezzük. (Egyéb elnevezések: ütközés, ütközéskezelés.) A szinonimák felbukkanását kezelni kell, mert nem helyezhetünk el két vagy több adatelemet ugyanazon a tárhelyen. ról általában Néhány szinonimakezelő módszer: független túlcsordulási lista alkalmazása nyílt címzés módszere nyílt címzés (belső) láncolással.
üggetlen túlcsordulási lista h(k) = k mod + 0 ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil nil nil nil ról általában.
üggetlen túlcsordulási lista h(k) = k mod + 0 nil nil nil nil nil ról általában.
üggetlen túlcsordulási lista ról általában.
Független túlcsordulási lista Hatékonyság Legyen T egy m rést tartalmazó hasító, melyben n elem van. Definiáljuk T-ben az α kitöltési tényezőt, mint az n/m hányadost, ami nem más, mint az egy láncba fűzött elemek átlagos száma. Feltételezzük, hogy minden elem egyforma valószínűséggel képződik le bármely résre, függetlenül attól, hogy a többiek hová kerültek. Ezt egyszerű egyenletes hasítási feltételnek nevezzük. Ha a T[j] lista hosszát n j -vel ( j =,,..., m ), jelöljük, akkor n = n + n + + n m ról általában és n j várható értéke E [n j ] = n/m = α. Feltesszük, hogy a h(k) hasított érték O() idő alatt számítható ki, s így egy k kulcsú elem keresésének ideje lineárisan függ a T [h(k)] lista n h(k) hosszától..
Független túlcsordulási lista Hatékonyság Theorem (Tankönyv:.. tétel.) Ha egy hasító ban az ütközések feloldására láncolást használunk és a hasítás egyszerű egyenletes, akkor a sikertelen keresés átlagos ideje Θ( + α). Bizonyítás. Az egyszerű egyenletesség feltételezése miatt bármely k kulcs, amely még nincs a ban, egyforma valószínűséggel képződik le az m rés bármelyikére. Ezért egy k kulcs sikertelen keresésének átlagos ideje megegyezik annak átlagos idejével, hogy a T [h(k)] listát végigkeressük. Ennek a listának az átlagos hossza E [ n h(k) ] = α. Ezért a sikertelen keresés során megvizsgált elemek várható száma α, s így az összes szükséges idő (beszámítva a h(k) kiszámítási idejét is) valóban Θ( + α). ról általában Theorem (Tankönyv:.. tétel.) Ha egy hasító ban a kulcsütközések feloldására láncolást használunk és a hasítás egyszerű egyenletes, akkor a sikeres keresés átlagos ideje Θ( + α)..
Független túlcsordulási lista Hatékonyság Theorem (Tankönyv:.. tétel.) Ha egy hasító ban az ütközések feloldására láncolást használunk és a hasítás egyszerű egyenletes, akkor a sikertelen keresés átlagos ideje Θ( + α). Bizonyítás. Az egyszerű egyenletesség feltételezése miatt bármely k kulcs, amely még nincs a ban, egyforma valószínűséggel képződik le az m rés bármelyikére. Ezért egy k kulcs sikertelen keresésének átlagos ideje megegyezik annak átlagos idejével, hogy a T [h(k)] listát végigkeressük. Ennek a listának az átlagos hossza E [ n h(k) ] = α. Ezért a sikertelen keresés során megvizsgált elemek várható száma α, s így az összes szükséges idő (beszámítva a h(k) kiszámítási idejét is) valóban Θ( + α). ról általában Theorem (Tankönyv:.. tétel.) Ha egy hasító ban a kulcsütközések feloldására láncolást használunk és a hasítás egyszerű egyenletes, akkor a sikeres keresés átlagos ideje Θ( + α)..
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: ról általában h(k) = k mod + h(k) 0.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Egy tárhely státusza lehet: { üres szabad logikailag törölt foglalt bővítése: h(k) h(k) = k mod + 0 ról általában.
yílt címzés módszere Ha adott egy h : U {,,..., m } közönséges hasító függvény, akkor a lineáris kipróbálás módszere az alábbi hasító függvényt használja (i=,,...,m): h(k, i) = ((h (k) + i ) mod m) +. ról általában Négyzetes kipróbálás módszere: ( ) h(k, i) = (h (k) + c (i ) + c (i ) ) mod m +. Dupla hasítás módszere: h(k, i) = ((h (k) + (i ) h (k)) mod m) +. Itt h (k)-nak relatív prímnek kell lennie m-hez képest. (Pl. m = k és h (k) = h (k) +.).0
yílt címzés módszere Ha adott egy h : U {,,..., m } közönséges hasító függvény, akkor a lineáris kipróbálás módszere az alábbi hasító függvényt használja (i=,,...,m): h(k, i) = ((h (k) + i ) mod m) +. ról általában Négyzetes kipróbálás módszere: ( ) h(k, i) = (h (k) + c (i ) + c (i ) ) mod m +. Dupla hasítás módszere: h(k, i) = ((h (k) + (i ) h (k)) mod m) +. Itt h (k)-nak relatív prímnek kell lennie m-hez képest. (Pl. m = k és h (k) = h (k) +.).0
yílt címzés módszere Ha adott egy h : U {,,..., m } közönséges hasító függvény, akkor a lineáris kipróbálás módszere az alábbi hasító függvényt használja (i=,,...,m): h(k, i) = ((h (k) + i ) mod m) +. ról általában Négyzetes kipróbálás módszere: ( ) h(k, i) = (h (k) + c (i ) + c (i ) ) mod m +. Dupla hasítás módszere: h(k, i) = ((h (k) + (i ) h (k)) mod m) +. Itt h (k)-nak relatív prímnek kell lennie m-hez képest. (Pl. m = k és h (k) = h (k) +.).0
yílt címzés módszere Theorem (Tankönyv:.. tétel.) Ha adott egy nyílt címzéses hasító az α = n/m < kitöltöttségi aránnyal, akkor a sikertelen keresés várható próbaszáma az egyenletes hasítási feltétel teljesülése esetén legfeljebb /( α). Corollary (Tankönyv:.. következmény.) Egy α kitöltési tényezőjű nyílt címzéses hasító ba való beszúrás várható próbaszáma az egyenletes hasítási feltétel teljesülése esetén legfeljebb /( α). Theorem (Tankönyv:.. tétel.) ról általában Legyen adott egy nyílt címzéses hasító az α < kitöltöttségi aránnyal. Tegyük fel az egyenletes hasítási feltételt és azt, hogy a minden elemét egyforma valószínűséggel keressük. Ekkor a sikeres keresés várható próbaszáma α ln α.
yílt címzés módszere Bizonyítás. Egy k kulcsot keresve ugyanazt a kipróbálási útvonalat követjük, mint amikor az azt tartalmazó elemet beszúrtuk. A.. következmény szerint ha k az (i + )-edik elemként került be a hasító ba, akkor a próbák várható száma a keresésnél legfeljebb /( i/m) = m/(m i). A hasító ban levő n kulcsra átlagolva azt kapjuk, hogy a sikeres keresés átlagos próbaszáma: n m n m i i=0 = m n = α n m i i=0 m k m α m n x dx k=m n+ = α ln m m n = α ln α Például: α = 0. = várható próbaszáma, α = 0. = várható próbaszáma, ról általában.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: ról általában h(k) = k mod + h(k) 0.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: h(k) h(k) = k mod + 0 0 ról általában.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: h(k) 0 h(k) = k mod + 0 0 ról általában.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: ról általában h(k) h(k) = k mod + 0 0 0.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: ról általában h(k) h(k) = k mod + 0 0 0 0.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: ról általában h(k) h(k) = k mod + 0 0 0 0.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: h(k) h(k) = k mod + 0 0 0 0 0 ról általában.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: h(k) 0 0 h(k) = k mod + 0 0 0 0 ról általában.
yílt címzés (belső) láncolással Egy tárhely státusza lehet: szabad (üres vagy logikailag törölt) (Itt tényleg mindegy.) foglalt bővítése: h(k) h(k) = k mod + 0 0 0 0 0 0 ról általában.
ulcstranszformációs tal végezhető műveletek Létrehozáskor a gyakorlatban előforduló kulcsértékek darabszámát megbecsüljük, kiválasztunk egy hash függvényt és (ha szükséges) egy szinonimakezelési módszert, majd lefoglaljuk a tárhelyeket a becslésnek megfelelően, és mindegyiket üresre állítjuk. Bővítés: az adatelem kulcsértéke alapján, a hash függvény segítségével. Törlés: szinte kizárólag logikai; fizikai csak a túlcsordulási listából. Csere: kulcs alapján a hozzá tartozó értéket lehet cserélni. Rendezés: nincs. Elérés: kvázi közvetlen, a hash függvény a közvetlen elérést szolgálja, a szinonimákat keresni kell. Keresés: általában nincs, csak szinonimákat kereshetünk, az pedig a szinonimakezelési módszertől függ. Bejárás: nincs, mivel csak közvetlen elérés van. A feldolgozás alapja a hash függvény, illetve a közvetlen elérés. ról általában.