Duomenų struktūros: praktiniai klausimai su paaiškinimais
Nemokami testo klausimai tema Duomenų struktūros su užuominomis ir paaiškinimais, trijų lygių: pagrindinės sąvokos ir faktai, sąvokų taikymas, atvejai ir analizė.
Duomenų struktūra yra duomenų atmintyje organizavimo būdas, kad tam tikros operacijos būtų greitos: elemento radimas, įterpimas, pašalinimas.
Nėra struktūros, kuri būtų greita viskam. Rinktis struktūrą reiškia rinktis, kurios operacijos turi būti pigios. Jų kaina užrašoma O didžiuoju, kur n yra elementų skaičius.
Du pagrindiniai statybiniai blokai yra masyvas ir susietasis sąrašas.
Masyvas saugo elementus viename atminties bloke, vieną po kito. Kompiuteris gali apskaičiuoti, kur yra elementas i, todėl a[i] skaitymas trunka O(1). Įterpimas pradžioje reiškia visų elementų postūmį: O(n).
Susietasis sąrašas saugo kiekvieną elementą mazge su rodykle į kitą mazgą. Paskutinė rodyklė yra null. Įterpimas į pradžią (h) pakeičia tik vieną rodyklę: O(1). Bet norint pasiekti elementą i, reikia sekti i rodyklių: O(n).
Dvikryptis susietasis sąrašas turi ir rodyklę į ankstesnį mazgą, todėl galima eiti abiem kryptimis.
Savikontrolė Kuri operacija masyvui yra O(1), o vienakryptis susietajam sąrašui – O(n)?
Elemento skaitymas pagal indeksą i
Elementų skaičiavimas po vieną
Kiekvieno elemento aplankymas po kartą
Naujo elemento įterpimas pradžioje
Atsakymas: Elemento skaitymas pagal indeksą i. Masyvas tiesiogiai apskaičiuoja elemento i adresą. Susietasis sąrašas turi sekti i rodyklių nuo pradžios. Įterpimas pradžioje yra priešingas atvejis: sąrašui pigus, masyvui brangus.
2Dėklai ir eilės
Dėklas (stekas) yra kaip lėkščių krūva: pridedate ir šalinate tik viršuje. Paskutinis įdėtas elementas išimamas pirmas: LIFO.
push uždeda elementą viršuje, pop pašalina viršutinį elementą, peek perskaito viršutinį jo nešalindamas. Visos yra O(1).
Dviguba eilė (deque) leidžia pridėti ir šalinti abiejuose galuose. Prioritetinė eilė visada pirmiausia pašalina didžiausią prioritetą turintį elementą; ji dažniausiai kuriama kaip krūva.
Savikontrolė Kuri duomenų struktūra geriausiai tinka teksto redaktoriaus mygtukui „atšaukti“?
Dėklas
Eilė
Grafas
Maišos lentelė
Atsakymas: Dėklas. Atšaukimas turi pirmiausia panaikinti naujausią veiksmą: paskutinis įėjo, pirmas išeina. Eilė pirmiausia atšauktų seniausią veiksmą.
3Medžiai, krūvos, maišos lentelės ir grafai
Medis turi vieną viršutinį mazgą, šaknį. Kiekvienas kitas mazgas turi lygiai vieną tėvą. Mazgai be vaikų yra lapai. Medis su n mazgų turi n − 1 briauną.
Dvejetainiame medyje kiekvienas mazgas turi ne daugiau kaip du vaikus. Dvejetainis paieškos medis (BST) prideda taisyklę: kairiojo pomedžio raktai mažesni už mazgą, dešiniojo pomedžio – didesni.
Paieška BST seka vienu keliu žemyn, todėl kainuoja O(aukštis). Subalansuotas medis (AVL, raudonai juodas) išlaiko aukštį apie log₂ n. Raktai, įterpti surūšiuota tvarka, sudaro n aukščio grandinę.
Krūva yra dvejetainis medis, kuriame kiekvienas tėvas mažesnis už savo vaikus (min-krūva) arba didesnis (maks-krūva). Minimumas ar maksimumas yra šaknyje, o įterpimas ir šalinimas kainuoja O(log n).
Maišos lentelė saugo raktų ir reikšmių poras. Maišos funkcija paverčia raktą indeksu, todėl įterpimas ir paieška vidutiniškai trunka O(1). Du raktai su tuo pačiu indeksu yra kolizija, sprendžiama grandinėmis (sąrašas kiekvienai vietai) arba atvira adresacija (bandoma kita vieta).
Grafas turi viršūnes, sujungtas briaunomis, kurios gali turėti kryptį ar svorį. Jis saugomas kaip gretimumo matrica, O(V²) atminties, arba kaip gretimumo sąrašai, O(V + E).
Savikontrolė Raktai 50, 30, 70, 20 ir 40 šia tvarka įterpiami į tuščią dvejetainį paieškos medį. Koks yra 30 kairysis vaikas?
20
40
70
Jis neturi kairiojo vaiko
Atsakymas: 20. 20 mažesnis už 50, todėl eina į kairę iki 30. Jis taip pat mažesnis už 30, todėl vėl eina į kairę. 40 didesnis už 30 ir tampa jo dešiniuoju vaiku.
4Metodas žingsnis po žingsnio
Klausimai dažnai aprašo užduotį ir klausia, kuri struktūra tinka, arba klausia, kaip struktūra atrodo po kelių operacijų.
Raskite operaciją, kuri turi būti greita: prieiga pagal poziciją, pagal raktą, naujausias elementas, seniausias elementas, mažiausias elementas ar intervalas.
Priskirkite ją struktūrai: indeksas → masyvas, raktas → maišos lentelė, naujausias → dėklas, seniausias → eilė, mažiausias ar didžiausias → krūva, surūšiuota tvarka ar intervalai → subalansuotas paieškos medis.
Patikrinkite kitų užduočiai reikalingų operacijų kainą O didžiuoju.
Sekimo klausimui atlikite operacijas po vieną ir po kiekvienos užsirašykite būseną.
Galutinę būseną patikrinkite pagal struktūros taisyklę: LIFO, FIFO, BST tvarką ar krūvos tvarką.
5Išspręstas pavyzdys
Sekite kiekvieną žingsnį. Pabandykite nuspėti kitą, prieš jį atidarydami.
Išspręstas pavyzdys
Raktai 50, 30, 70, 20, 40 ir 60 šia tvarka įterpiami į tuščią dvejetainį paieškos medį. Kokia yra vidinė (in-order) apėjimo seka ir kiek palyginimų reikia ieškant 60?
1
Įterpkite šaknį
Pirmasis raktas, 50, tampa šaknimi.
2
Įterpkite 30 ir 70
30 mažesnis už 50, todėl eina į kairę. 70 didesnis už 50, todėl eina į dešinę.
3
Įterpkite 20, 40 ir 60
20: mažesnis už 50, mažesnis už 30, todėl 30 kairėje. 40: mažesnis už 50, didesnis už 30, todėl 30 dešinėje. 60: didesnis už 50, mažesnis už 70, todėl 70 kairėje.
4
Apeikite vidine (in-order) tvarka
Vidinis (in-order) apėjimas aplanko kairįjį pomedį, tada mazgą, tada dešinįjį pomedį.
Gaunama 20, 30, 40, 50, 60, 70: raktai surūšiuota tvarka, kaip visada BST.
5
Ieškokite 60
Palyginkite su 50: didesnis, eikite į dešinę. Palyginkite su 70: mažesnis, eikite į kairę. Palyginkite su 60: rastas.
Paieškai reikia 3 palyginimų, po vieną kiekviename lygyje.
Manoma, kad susietasis sąrašas suteikia greitą prieigą pagal indeksą. Jis turi eiti nuo pradžios.
Manoma, kad BST visada yra O(log n). Tik subalansuotas medis toks; surūšiuoti įterpimai duoda O(n).
Pamirštamos maišos lentelės kolizijos. O(1) yra vidurkis, o ne blogiausias atvejis.
Painiojami apėjimai. Prieš tai (preorder): pirmiausia mazgas. Vidinis (in-order): mazgas viduryje. Po to (postorder): mazgas paskutinis.
Gretimumo matrica naudojama dideliam retam grafui. Ji eikvoja O(V²) atminties.
Savikontrolė Į tuščią eilę šia tvarka įdedate 1, 2 ir 3. Kurį elementą grąžina pirmasis dequeue?
1, 2 ir 3 kartu
1
2
3
Atsakymas: 1. Eilė yra pirmas įėjo, pirmas išėjo, todėl 1 išeina pirmas. 3 būtų atsakymas dėklui (pop), kuris grąžina naujausią elementą.
7Kaip atrodo egzamino uždaviniai
Lengvi: pagrindinės sąvokos ir faktai. LIFO ir FIFO, kas yra mazgas, šaknis ar lapas, BST taisyklė, ką daro maišos funkcija.
Vidutiniai: sąvokų taikymas. Kuri struktūra tinka užduočiai, push ir pop arba BST įterpimų rezultatas, medžių apėjimai, maišos lentelė su tiesiniu zondavimu, kainos O didžiuoju.
Sunkūs: atvejai ir analizė. Subalansuoti medžiai, krūvos masyvuose, B-medžiai, prefiksų medžiai (trie), union-find, Bloom filtrai ir sprendimai, tokie kaip LRU talpykla.
Krūvai, saugomai masyve nuo indekso 0, indekso i vaikai yra ties 2i + 1 ir 2i + 2, o jo tėvas – ties ⌊(i − 1) / 2⌋.
Koks pagrindinis skirtumas tarp statinio ir dinaminio masyvo?
AStatinis masyvas leidžia lėtesnę prieigą pagal indeksą
BDinaminis masyvas gali augti persikeldamas į didesnį atminties bloką
CDinaminis masyvas saugo elementus susietuose mazguose, kad galėtų augti po vieną
DStatinis masyvas gali saugoti tik skaičius
Rodyti užuominas
Python sąrašai ir Java ArrayList yra vieno iš jų pavyzdžiai.
Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą
Kodėl tai yra atsakymas
Statinis masyvas turi fiksuotą dydį; dinaminis masyvas, kai užsipildo, išskiria didesnį masyvą ir nukopijuoja elementus.
Atsakymas
B · Dinaminis masyvas gali augti persikeldamas į didesnį atminties bloką
Pavyzdys 2Vidutinis
Kaip dvejetainėje min krūvoje veikia extract-min?
APašalinamas paskutinis masyvo elementas
BPaskutinis elementas perkeliamas į šaknį ir leidžiamas žemyn (sift down)
CPašalinama šaknis, o visi elementai pastumiami viena vieta į kairę
DNaujo minimumo ieškoma visuose lapuose
Rodyti užuominas
Išlaikykite medį pilną, tada sutvarkykite tvarką.
Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą
Kodėl tai yra atsakymas
Paskutinis elementas užpildo tuščią vietą šaknyje ir keičiamas vietomis su mažesniuoju vaiku, kol galioja krūvos savybė; tai užtrunka O(log n).
Atsakymas
B · Paskutinis elementas perkeliamas į šaknį ir leidžiamas žemyn (sift down)
Pavyzdys 3Sunkus
Kokia blogiausio atvejo vienos find operacijos kaina union-find struktūroje su n elementų, nenaudojant jungimo pagal rangą ir kelio suspaudimo?
AO(1)
BO(α(n))
CO(log n)
DO(n)
Rodyti užuominas
Medžiai gali išsigimti.
Du neteisingi atsakymai dabar išbraukti. Vienas iš likusių dviejų yra teisingas.
Rodyti atsakymą ir paaiškinimą
Kodėl tai yra atsakymas
Naivūs sujungimai gali sudėti medžius į ilgą grandinę, todėl find gali tekti pereiti n − 1 tėvo rodyklių; abi euristikos tai priartina prie konstantos.
Atsakymas
D · O(n)
Klausimai ir atsakymai
Duomenų struktūros: kas tai?
Nėra struktūros, kuri būtų greita viskam. Rinktis struktūrą reiškia rinktis, kurios operacijos turi būti pigios. Jų kaina užrašoma O didžiuoju, kur n yra elementų skaičius.
Du pagrindiniai statybiniai blokai yra masyvas ir susietasis sąrašas.
Duomenų struktūros: kaip išmokti žingsnis po žingsnio?
Kas yra duomenų struktūra
Dėklai ir eilės
Medžiai, krūvos, maišos lentelės ir grafai
Metodas žingsnis po žingsnio
Išspręstas pavyzdys
Dažnos klaidos
Kaip atrodo egzamino uždaviniai
Duomenų struktūros: ką lavinsite?
Lengvas: pagrindinės sąvokos ir faktai
Vidutinis: sąvokų taikymas
Sunkus: atvejai ir analizė
Kiekvienas klausimas turi keturis atsakymų variantus, ir tik vienas yra teisingas. Strigote? Pirmiausia atverkite nedidelę užuominą, o visą paaiškinimą – tik kai jo prireiks.
Kaip vyksta praktika
Kiekvienas klausimas turi keturis atsakymų variantus, ir tik vienas yra teisingas.
Strigote? Pirmiausia atverkite nedidelę užuominą, o visą paaiškinimą – tik kai jo prireiks.
Jūsų pažanga, klaidos ir išsaugoti uždaviniai išlieka, todėl prieš egzaminą galite viską pakartoti.