510 likes | 626 Views
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
E N D
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 • 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
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
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
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
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
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 */ } }
Binääriset hakupuut • Lisäykset järjestettyyn taulukkoon olivat laskennallisesti raskaita • Käytetään ekplisiittistä puurakennetta solmu x A B alipuut pienempiä suurempia
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;
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); }
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); }
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K E U
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E S
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E I S
Binäärisen hakupuun rakentaminen • Lisätään avaimet: H A K U E S I M H A K U E I S M
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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