Lataa esitys
Esittely latautuu. Ole hyvä ja odota
JulkaistuNoora Turunen Muutettu yli 8 vuotta sitten
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. 145723 avain = alkio = int 8 145723 HAKU: Jokaista taulukon avainta verrataan hakuavaimeen kunnes haluttu sana löytyy tai taulukko on käyty läpi. 8 145723
5
Symbolitaulu: toteutus lajittellulla taulukolla LISÄÄ: Etsitään lisäyskohta ja siirretään alkioita oikealle 173452 avain = alkio = int 7 13452 BINÄÄRIHAKU: Verrataan taulukon keskimmäiseen avaimeen Mikäli samat => haku päättyy Muussa tapauksessa etsitään joko vasemmalta tai oikealta 6
6
Binäärihaun eteneminen AAACEEEGHILMNPR HILMNPR HIL L Tarvitaan kolme iteraatiota L:n löytämiseksi 1. Verrataan hakuavainta L keskimmäiseen alkioon G, koska L on isompi seuraava iteraatio käyttää G:n oikean puoleisia arvoja 2. 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 alkio hae(int l, int r, Avain v) { int m = (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 */ } } #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;
8
Symbolitaulu: toteutus kustannukset HakuLisäysPoistoHakuLisäysPoisto N11N/211 lg NNN N/2 Toteutus Lajittelematon taulukko Lajiteltu taulukko, binäärihaku Huonoin tapausKeskimääräinen tapaus
9
Binääriset hakupuut Lisäykset järjestettyyn taulukkoon olivat laskennallisesti raskaita Käytetään ekplisiittistä puurakennetta x solmu AB 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; 51 1468 125479
11
Haku binäärisestä hakupuusta alkio haeR(linkki h, Avain v) { avain t = AVAIN(h->item); if(h == z) { return NULLalkio; } if(YHTASUURI(v, t)) { return h->item; } if(PIENEMPI(v, t)) { return haeR(h->l, v); } else { return haeR(h->r, v); } } alkio SThae(Avain v) { return haeR(paa, v); } Etsitään avainta v Koodi seuraa suoraan binääripuun määritelmästä
12
Lisäys binääriseen hakupuuhun 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 */ return h; } void STlisaa(alkio item) { paa = lisaaR(paa, item); } Lisätään alkio Ensin etsitään, sitten lisätään
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 AK
16
Binäärisen hakupuun rakentaminen Lisätään avaimet: H A K U E S I M H AK U
17
Binäärisen hakupuun rakentaminen Lisätään avaimet: H A K U E S I M H AK UE
18
Binäärisen hakupuun rakentaminen Lisätään avaimet: H A K U E S I M H AK U E S
19
Binäärisen hakupuun rakentaminen Lisätään avaimet: H A K U E S I M H AK U EI S
20
Binäärisen hakupuun rakentaminen Lisätään avaimet: H A K U E S I M H AK U EI 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 T W YV H M E B F P 111 1 4 10 13 5 2
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 nyt 0 tai 1 lasta H AK U EI S M
23
Kierto vasemmalle, kierto oikealle Perustava operaatio solmujen uudelleenjärjestämiseksi puussa Säilyttää binääripuu ominaisuuden Paikallisia muunnoksia, vaihdetaan 3 osoitinta x A CB y y A C B x juuri kierto vasemmalle
24
Kierto vasemmalle, kierto oikealle Perustava operaatio solmujen uudelleenjärjestämiseksi puussa Säilyttää binääripuu ominaisuuden Paikallisia muunnoksia, vaihdetaan 3 osoitinta x A CB y y A C B x juuri kierto oikealle
25
Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; return x; } A E C S X R H GI Kierto oikealle solmun S suhteen
26
Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; return x; } A E C S X R H GI Kierto oikealle solmun S suhteen
27
Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; return x; } A E C S X R H GI Kierto oikealle solmun S suhteen
28
Kierto oikealle linkki kiertoO(linkki h) { linkki x = h->l; /* kiertosolmun vasen lapsi */ h->l = x->r; x->r = h; return x; } A E C S X R H GI Kierto oikealle solmun S suhteen
29
Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; return x; } A E C S X R H GI Kierto vasemmalle solmun A suhteen
30
Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; return x; } A C S X R H GI Kierto vasemmalle solmun A suhteen E
31
Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; return x; } A C S X R H GI Kierto vasemmalle solmun A suhteen E
32
Kierto vasemmalle linkki kiertoV(linkki h) { linkki x = h->r; /* kiertosolmun oikea lapsi */ h->r = x->l; x->l = h; return x; } A C S X R H GI Kierto vasemmalle solmun A suhteen E
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 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g
35
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g
36
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g
37
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g
38
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g
39
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g G
40
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g G
41
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R H lisätään g G BA C x y B A C y x
42
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R G lisätään g H BA C x y B A C y x
43
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C R G lisätään g H BA C x y B A C y x
44
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
45
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
46
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
47
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
48
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
49
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
50
Lisäys binäärisen hakupuun juureen 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 */ } return h; } void STlisaa(alkio item) { paa = lisaaT(paa, item); } A S X E C G R lisätään g H BA C x y B A C y x
51
Symbolitaulu: toteutus kustannukset HakuLisäysPoistoHakuLisäysPoisto N11N/211 lg NNN N/2 NNNlog N NN Toteutus Lajittelematon taulukko Lajiteltu taulukko, binäärihaku Binääripuu Huonoin tapausKeskimääräinen tapaus
Samankaltaiset esitykset
© 2024 SlidePlayer.fi Inc.
All rights reserved.