1 / 51

Symbolitaulut

Symbolitaulut. Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta Kääntäjä etsii muuttujien nimet Internet domain server etsii IP osoitteen. Symbolitaulun operaatiot. Tietueen lisääminen

Download Presentation

Symbolitaulut

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Symbolitaulut • Joukko hakuavaimen omaavia tietueita • LISÄÄ uusi tietue • ETSI tietue hakuavaimen perusteella Sovelluksia: • Spell checker etsii sanoja sanakirjasta • Kääntäjä etsii muuttujien nimet • Internet domain server etsii IP osoitteen

  2. Symbolitaulun operaatiot • Tietueen lisääminen • Tietueen hakeminen avaimen perusteella • Symbolitaulun alustaminen • Tietueen poisto symbolitaulusta • k:nen alkion valinta • Symbolitaulun lajittelu • Kahden symbolitaulun liittäminen yhteen typedef int avain; typedef struct { avain ID; char nimi[30]; } alkio; avain = opiskelijanumero alkio = op.no + nimi

  3. Symbolitaulun operaatiot • Tietueen lisääminen • Tietueen hakeminen avaimen perusteella • Symbolitaulun alustaminen • Tietueen poisto symbolitaulusta • k:nen alkion valinta • Symbolitaulun lajittelu • Kahden symbolitaulun liittäminen yhteen typedef char *avain; typedef struct { avain url; int laskuri; } alkio; avain = URL alkio = URL + laskuri

  4. Symbolitaulu: toteutus lajittemattomalla taulukolla • LISÄÄ: Tietue lisätään taulukon loppuun. 1 3 5 7 2 4 avain = alkio = int 1 3 5 7 2 4 • HAKU: Jokaista taulukon avainta verrataan hakuavaimeen kunnes haluttu sana löytyy tai taulukko on käyty läpi. 1 3 5 7 2 4

  5. Symbolitaulu: toteutus lajittellulla taulukolla • LISÄÄ: Etsitään lisäyskohta ja siirretään alkioita oikealle 1 2 3 4 5 7 avain = alkio = int 1 2 3 4 5 6 • BINÄÄRIHAKU: Verrataan taulukon keskimmäiseen avaimeen • Mikäli samat => haku päättyy • Muussa tapauksessa etsitään joko vasemmalta tai oikealta

  6. Binäärihaun eteneminen • Tarvitaan kolme iteraatiota L:n löytämiseksi Verrataan hakuavainta L keskimmäiseen alkioon G, koska L on isompi seuraava iteraatio käyttää G:n oikean puoleisia arvoja L on pienempi kuin M => kolmas iteraatio suoritetaan H,I,L alkioille • Yhden lisäiteraation jälkeen koko on 1 ja L löytyy

  7. Binäärihaku #define NULLalkio -1 typedef int alkio; typedef int avain; #define AVAIN(A) (A) #define YHTASUURI(A, B) (!PIENEMPI(A, B) && !PIENEMPI(B, A)) #define PIENEMPI(A, B) (AVAIN(A) < AVAIN(B)) static alkio *st; alkio hae(intl, intr, Avain v) { intm = (l + r) / 2; /* puolivälin laskenta */ if(l > r) /* jos ei voi enää löytyä */ { return NULLalkio; } if(YHTASUURI(v, AVAIN(st[m]))) { return st[m]; } if(l == r) /* jos ei voi enää löytyä */ { return NULLalkio; } if(PIENEMPI(v, AVAIN(st[m]))) /* jos haettava pienempi */ { return hae(l, m – 1,v); /* haetaan alkupuolikkaasta */ } else { return hae(m + 1, r, v); /* haetaan loppupuolikkaasta */ } }

  8. Symbolitaulu: toteutus kustannukset

  9. Binääriset hakupuut • Lisäykset järjestettyyn taulukkoon olivat laskennallisesti raskaita • Käytetään ekplisiittistä puurakennetta solmu x A B alipuut pienempiä suurempia

  10. Binäärinen hakupuu C-kielellä • linkki on osoitin solmuun Solmu koostuu kolmesta kentästä • Avaimellisesta solmusta • Vasen linkki (binääripuu, jossa pienemmät avaimet) • Oikea linkki (binääripuu, jossa suuremmat avaimet) typedef struct STsolmu* linkki; struct STsolmu { alkio item; linkki l, r; }; static linkki paa, z;

  11. Haku binäärisestä hakupuusta • Etsitään avainta v • Koodi seuraa suoraan binääripuun määritelmästä alkio haeR(linkki h, Avain v) { avain t = AVAIN(h->item); if(h == z) { returnNULLalkio; } if(YHTASUURI(v, t)) { returnh->item; } if(PIENEMPI(v, t)) { return haeR(h->l, v); } else { return haeR(h->r, v); } } alkio SThae(Avain v) { return haeR(paa, v); }

  12. Lisäys binääriseen hakupuuhun • Lisätään alkio • Ensin etsitään, sitten lisätään linkki lisaaR(linkki h, alkio item) { Avain v = AVAIN(item), t = AVAIN(h->item); if(h == z) { return uusi(item,z, z, 1); } if(PIENEMPI(v, t)) { h->l = lisaaR(h->l, item); } else { h->r = lisaaR(h->r, item); } (h->n)++; /* solmujen lukumäärä alipuussa */ returnh; } void STlisaa(alkio item) { paa = lisaaR(paa, item); }

  13. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H

  14. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A

  15. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K

  16. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U

  17. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K E U

  18. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E S

  19. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E I S

  20. Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E I S M

  21. Muita symbolitaulun operaatioita LAJITTELU: käydään puu läpi sisäjärjestyksessä • Linkit vievät muistia ETSI K:S alkio: • Lisätään alipuun koko jokaiseen solmuun M 10 E T 5 4 B H P W 1 2 1 3 F V Y 1 1 1

  22. Muita symbolitaulun operaatioita: poistaminen • Ei lapsia E I M => poista • Yksi lapsi A U S => lapsi ylöspäin • Kaksi lasta H K - etsi seuraavaksi suurin lapsi- vaihda - poista kuten yllä, koska sillä on nyt0 tai 1 lasta H A K U E I S M

  23. Kierto vasemmalle, kierto oikealle Perustava operaatio solmujen uudelleenjärjestämiseksi puussa • Säilyttää binääripuu ominaisuuden • Paikallisia muunnoksia, vaihdetaan 3 osoitinta juuri y x kierto vasemmalle x y C A B C A B

  24. Kierto vasemmalle, kierto oikealle Perustava operaatio solmujen uudelleenjärjestämiseksi puussa • Säilyttää binääripuu ominaisuuden • Paikallisia muunnoksia, vaihdetaan 3 osoitinta juuri y x kierto oikealle x y C A B C A B

  25. Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; returnx; } A S E R X H C Kierto oikealle solmun S suhteen G I

  26. Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; returnx; } A E S R X H C Kierto oikealle solmun S suhteen G I

  27. Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; returnx; } A E S R X H C Kierto oikealle solmun S suhteen G I

  28. Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; returnx; } A E S R X H C Kierto oikealle solmun S suhteen G I

  29. Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; returnx; } A E S R C X H Kierto vasemmalle solmun A suhteen G I

  30. Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; returnx; } E A S R C X H Kierto vasemmalle solmun A suhteen G I

  31. Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; returnx; } E A S R C X H Kierto vasemmalle solmun A suhteen G I

  32. Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; returnx; } E A S R C X H Kierto vasemmalle solmun A suhteen G I

  33. Lisäys binäärisen hakupuun juureen Lisäys juureen: lisää solmu ja tee siitä juurisolmu • Lisää solmu kuten tavallisessa binäärihakupuussa • Käytä kiertoja sen tuomiseksi juureen Miksi vaivautua ? • Nopeampi jos haut tapahtuvat viimeksi lisättyihin avaimiin • Muodostaa pohjan edistyneimmille algoritmeille

  34. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H

  35. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H

  36. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H

  37. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H

  38. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H

  39. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H G

  40. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H G

  41. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R H G y x x C A y A B B C

  42. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R G H y x x C A y A B B C

  43. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C R G H y x x C A y A B B C

  44. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C G R H y x x C A y A B B C

  45. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S E X C G R H y x x C A y A B B C

  46. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S G X R E H C y x x C A y A B B C

  47. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } S G X R E H C y x x C A y A B B C

  48. Lisäys binäärisen hakupuun juureen lisätään g A linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } G E S C R X H y x x C A y A B B C

  49. Lisäys binäärisen hakupuun juureen lisätään g linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } G A S E R X C H y x x C A y A B B C

  50. Lisäys binäärisen hakupuun juureen lisätään g linkki lisaaT(linkki h, alkio item) { Avain v = AVAIN(item); if(h == z) /* jos lehtisolmu */ { return uusi(item, z, z, 1); } if(PIENEMPI(v, AVAIN(h->item))) { h->l = lisaaT(h->l, item); /* vasemmalle */ h = kiertoO(h); /* kierto oikealle */ } else { h->r = lisaaT(h->r, item); /* oikealle */ h = kiertoV(h); /* kierto vasemmalle */ } returnh; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } G A S E R X C H y x x C A y A B B C

More Related