Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 10 / 15 Maišos lentelės ~50 min
Teorija

Klausimas, į kurį indeksas neatsako

Turi indeksą, kuris atsako per 1.3 palyginimo. Paklausk jo paprasčiausio dalyko, kokio tik gali paprašyti bibliotekos: išvardyk knygas abėcėlės tvarka.

$ algo gen -n 1000 -seed 3
$ algo ordered -n 6
the first 6 titles, as the index stores them:
  Lažižo
  Rūdovi
  Bąkėbėra Mąbą
  Lėpubė
  Žąčąva Šomū
  Medošibe

the first 6 in alphabetical order:
  Bagogū Guže
  Bamežanė Pako
  Bamila
  Basėrūno
  Batalu
  Batėvovu Sūvi

getting the second list from the index cost a full sort of all 1000 keys.
the index itself could not answer the question at all.

Pirmasis sąrašas nėra netvarkingas dėl klaidos. Jis yra kibirų tvarka — tai yra hashKey(pavadinimas) % kibirų skaičius tvarka, o maišos funkcijos paskirtis yra sunaikinti bet kokį ryšį tarp rakto ir jo skaičiaus. Būtent todėl grandinėlės lieka trumpos. Tvarka nebuvo pamesta — ji buvo sunaikinta tyčia, ir tai ir yra tai, už ką sumokėta.

Antrasis sąrašas gautas surikiavus visus 1 000 raktų. Tai O(n log n) kiekvienam tokiam klausimui — brangiau nei viskas, ką indeksas kada nors sutaupė.

Ko maišos lentelė negali

Ne „daro lėtai". Negali.

klausimas maišos lentelė
ar yra „Bamila"? 1.3 palyginimo
kokia pirma abėcėlėje? tik surikiavus viską
kurios prasideda „Ba"? tik peržiūrėjus viską
kokios 20 eina po „Bamila"? nėra tokios sąvokos
kokia knyga prieš šitą? nėra tokios sąvokos
aukščiausias įvertinimas? tik peržiūrėjus viską

Kiekvienam iš šių klausimų atsakymas yra tas pats: grįžk prie visos aibės. Indeksas nepadeda, nes jis nieko nežino apie tai, kas eina po ko.

Tai nėra trūkumas

Pirmame žingsnyje buvo parašyta: struktūra nusiperka viena, sumoka kita. Čia sandoris matomas iš abiejų pusių:

Maišos lentelė yra geriausia, ką turi vienam klausimui — „ar šis tikslus raktas yra" — ir ji neatsako į jokį kitą.

Nesirinktum jos bibliotekos katalogui, kurį reikia rodyti puslapiais. Rinktumeisi sesijų saugyklai, žodžių dažnių skaičiuoklei, „ar šis vartotojo vardas užimtas".

Klausimas, kuriuo prasideda vienuolikta pamoka

Vienuolikta pamoka pradedama nuo antrojo šio žingsnio sąrašo — bet gauna jį nerikiuodama nieko.

Dvejetainės paieškos medis atsisako O(1): jo paieška kainuoja O(log n), taigi lėčiau nei tavo indeksas. Mainais jis išlaiko tvarką savo struktūroje, o perėjimas nuo mažiausio iki didžiausio yra tiesiog vienas medžio apėjimas.

Tas pats klausimas, į kurį šis indeksas negali atsakyti nė už kokią kainą, vienuoliktoje pamokoje kainuos O(n) ir nė vieno palyginimo daugiau nei reikia kiekvienam elementui aplankyti.

Tai ne „geriau". Tai kita sandorio pusė.