Övning 5 www.nada.kth.se/~mhj/tilda
Hashning Textsökning Hemtal KMP-automat Hemtal Bilarna
Hashning
Iden med hashning hash betyder: hackmat, röra first Björn Agnetha Benny Anni-Frid firstA Agneta Anni-Frid firstB Björn Benny table [ ] Agneta hash betyder: hackmat, röra Björn 1 Benny 2 Anni-Frid 3
Insättning (put) f( ) = 2 + 10 + 29 + 18 + 14 = 73 Björn 1 hashfunktion tabellstorlek f( ) = 2 + 10 + 29 + 18 + 14 = 73 Björn mod 4 1 f( ) = 1 + 7 + 14 + 5 + 20 + 7 + 1 = 55 Agnetha mod 4 3 f( ) = 2 + 5 + 14 + 14 + 25 = 60 Benny mod 4 f( ) = 1 + 14 + 14 + 9 + 30 + 6 + 18 + 9 + 4 = 105 Anni-Frid mod 4 1 table [ ] Benny Anni-Frid Björn Björn 1 2 Agnetha 3
Sökning (get) f( ) = 2 + 5 + 14 + 14 + 25 = 60 Benny mod 4 f( ) = 2 + 10 + 29 + 18 + 14 = 73 Björn mod 4 1 f( ) = 13 + 1 + 18 + 9 + 5 = 46 Marie mod 4 2 f( ) = 2 + 15 = 17 Bo mod 4 1 table [ ] Benny Benny Anni-Frid Björn Anni-Frid Björn Björn 1 2 Agnetha 3
Tabellstorlek 73 f(Björn) = 73 55 f(Agnetha) = 55 60 f(Benny) = 60 105 table [ ] ….. Agnetha 55 ….. mod 10000 73 f(Björn) = 73 Benny 60 mod 10000 55 f(Agnetha) = 55 ….. mod 10000 60 f(Benny) = 60 Björn 73 mod 10000 105 f(Anni-Frid) = 105 ….. Anni-Frid 105 ….. 9999
Tabellstorlek 1 f(Björn) = 73 7 f(Agnetha) = 55 4 f(Benny) = 60 1 table [ ] 1 Anni-Frid Björn 2 mod 8 3 1 f(Björn) = 73 Benny 4 mod 8 7 f(Agnetha) = 55 5 mod 8 4 f(Benny) = 60 6 mod 8 1 f(Anni-Frid) = 105 7 Agnetha Tumregel: 50% luft
Tabellstorlek table [ ] Agnetha Benny Björn Anni-Frid ….. ….. ….. ….. ….. Agnetha 55 ….. Benny 60 ….. Björn 73 ….. Anni-Frid 105 ….. 9999
Hashfunktion god spridning snabb att beräkna Hashning av strängar i Java: public static void main(String [] args) { String s1 = ”hej”; int code = s1.hashCode(); System.out.println(code); } 103181 f(s) = s[0] * 31(n-1) + s[1] * 31(n-2) + ... + s[n-1] f(s1) = 104 * 312 + 101 * 31 + 106 = 103181
Krockhantering med ”linear probing” table [ ] Björn 1 kluster Anni-Frid 2 mod 8 3 1 f(Björn) = 73 Benny 4 mod 8 7 f(Agnetha) = 55 5 mod 8 4 f(Benny) = 60 6 mod 8 f(Anni-Frid) = 105 1 Krock! 7 Agnetha 2
Krockhantering med ”quadratic probing” table [ ] Anni-Frid Björn 1 2 mod 8 3 1 f(Björn) = 73 Benny 4 mod 8 7 f(Agnetha) = 55 5 mod 8 4 f(Benny) = 60 6 mod 8 f(Anni-Frid) = 105 1 Krock! 7 Agnetha 22 = 4 Krock! mod 8 32 = 9 1 Krock! mod 8 42 = 16
Perfekt hashfunktion f(färg, nr) = 13 * färg + nr-1 false Spara kort som dragits ur en kortlek. false 1 ….. true false 7 klöver = 0, ruter = 1, hjärter = 2, spader = 3 ess = 1, knekt = 11, dam = 12, kung = 13 ….. false true 23 f(färg, nr) = 13 * färg + nr-1 ….. true false 32 klöver 8: f(klöver, 8) = 13 * 0 + 8-1 = 7 ….. hjärter 7: f(hjärter, 7) = 13 * 2 + 7-1 = 32 false ruter knekt: 50 f(ruter, knekt) = 13 * 1 + 11-1 = 23 false 51
Bloomfilter true false Stavningskontrollprogram: true false true false Stavningskontrollprogram: true false 1 ….. mod 60000 f(”hej”) = 103181 43181 70012 true false fortsätt med samtliga ord… …………… ….. 50 % att ett felstavat ord, t.ex. ”heej”, godkänns. 103181 43181 false true mod 180000 f1(”hej”) = 103181 103181 ….. mod 180000 f2(”hej”) = 430012 70012 143229 false true …………… mod 180000 f3(”hej”) = 1043229 143229 ….. fortsätt med samtliga ord… 179999 59999 false 12.5 % att ett felstavat ord, t.ex. ”heej”, godkänns. 180000 false true 60000 I Viggos Stava används 14 hashfunktioner 0.006 %
Textsökning KMP-automat
F F Y Y R R T T I I O O T T V V Å Å , S A D J U P A T A N K E N T T T m Komplexitet: O(nm)
A A G A A T A A C A T C A A A A G C T A A G A A T T A A A C A A C A A C A A A A A C A C C A A C A A C
KMP automat: O(n) Morris Pratt Knuth
F Y R T I O T V Å , S A D J U P A T A N K E N i 1 2 3 next[i] 1 1 T T 1 2 3 next[i] 1 1
A D A D A M A A D D A A M M i 1 2 3 4 next[i] 1 2
i 1 2 3 4 next[i] 1 2 A A D D A A M M 1. next[1] = 0 2. Om ingen upprepning: next[i] = 1 Optimering: Men om bokstav i är samma som första bokstaven: next[i]=0 3. Om j>0 bokstäver är upprepade: next[i] = j+1 Optimering: Men om dessutom bokstav i och j+1 är samma: next[i]=next[j+1] A A D D A A M M i 1 2 3 4 next[i] 1 2