ערבול (ing) Lecture7 of Geiger & Itai s slide brochure www.cs.technion.ac.il/~dang/courseds חומר קריאה לשיעור זה: Chapter - tables (pages 9 43) Geiger & Itai, 00
ערבול (ing) Lecture7 of Geiger & Itai s slide brochure www.cs.technion.ac.il/~dang/courseds ראינו שלושה מימושים שונים למילון:,AVL עצי -3 ורשימת דילוגים הפעולות הבסיסיות )חיפוש, הכנסה, והוצאה( מתבצעות כל אחת ב-( n O(log האם אפשר לממש פעולות אלו בסיבוכיות זמן יותר טובה? 0 Data } לא למפתח כלשהו נניח שהמפתחות הם { 0,,,3,4,5,6,7,8,9 k Data k כן! תשובה: m- Geiger & Itai, 00 באמצעות מערך אפשר לממש כל פעולה ב-( O( איך?...
ערבול (ing) Lecture7 of Geiger & Itai s slide brochure www.cs.technion.ac.il/~dang/courseds } נניח שהמספרים הם { 0,,,3,4,5,6,7,8,9 0 3 4 5 6 7 8 9 Geiger & Itai, 00 0 3 7 9 Insert(3) Insert(7) Insert(0) Insert(9) Delete(7) Delete(0) Search(3) Search(0)
ערבול (ing) Lecture7 of Geiger & Itai s slide brochure www.cs.technion.ac.il/~dang/courseds 4 } נניח שהמספרים הם { 0,,,3,4,5,6,7,8,9 0 3 4 5 6 7 8 9 3 9 direct addressing גישה ישירה סבוכיות זמן סבוכיות מקום O(M) O() למספרים,...,3,,0, M אבחנה: אם נשתמש במערך, זמן של כל פעולה יהיה אמנם ()O, אך דרישות המקום הן O(M), כאשר M הוא גודל הטווח. ייתכן o(m).n =
ערבול (ing) 5 מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים? תשובה: ל ע ת ים גודל התחום של ערכי המפתחות גדול בהרבה ממספר המפתחות בהם משתמשים. דוגמא : מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות כלומר קיימים 0 9 מפתחות אך בישראל יש פחות מ 0 7 אנשים. לפיכך שימוש במערך ינצל פחות מ % בודד של הזיכרון המוקצה למערך. דוגמא : מספר המחרוזות של אותיות עבריות באורך 30 )באמצעותן ניתן לתאר שם פרטי, שם אמצעי, ושם משפחה של תושבי ישראל( הוא 30 בעוד מספר האנשים קטן מ 0. 7
ערבול (ing) 6 מימוש מילון באמצעות מערך נקרא גישה ישירה ) Addressing :(Direct המפתח עצמו משמש כאינדקס במערך. כאשר מרחב המפתחות גדול נחשב אינדקס h(k) מתוך המפתח k באמצעות פונקצית ערבול. h: key index מפתח k יכנס לתא h(k) במערך המטרה לממש את פעולות החיפוש,הכנסה, והוצאה בזמן ממוצע של ()O. לכן זמן חישוב h(k) חייב להיות ()O נגדיר פונקצית ערבול :(hash) h: U {0,,m-} בתחום U מחשבת אינדקס בטווח המתאים. אשר בהינתן מפתח
דוגמא }000 - נניח שהמספרים הם }0 0 3 4 5 6 7 8 9 60 43 57 39 h: {0 000} {0,,,,9} h(x) = x mod 0 Insert(43) h(43) = 3 Insert(57) h(57) = 7 Insert(60) h(60) = 0 Insert(39) h(39) = 9
פעולות מילון }000 - נניח שהמספרים הם }0 0 3 4 5 6 7 8 9 60 43 57 39 h: {0 000} {0,,,,9} h(x) = x mod 0 Delete(57) h(57) = 7 Delete(50) h(50) = 0 Search(43) h(43) = 3 Search(66) h(66) = 6 hash function פונקצית ערבול h
פעולות מילון }000 - נניח שהמספרים הם }0 0 3 4 5 6 7 8 9 60 43 57 39 h: {0 000} {0,,,,9} h(x) = x mod 0 Insert(73) h(73) = 3 התנגשות
0 בשיטת הערבול נוצרות התנגשויות כאשר x y אבל h(y).h(x) = 0 3 4 5 6 7 8 9 5 9 5 7 88 9 דוגמא: m = 0 h(k) = k mod 0 5, 7, 5, 9, 88, 9 h(8) = = h(5)
פתרון להתנגשויות באמצעות )chaining( "שרשראות" T X x x 3 x 4 X 4 X 3 X 5 X x x 5 הפעולות: ]T. h(x.key)] בראש הרשימה x הכנס את Insert(T,x) זמן במקרה הגרוע ביותר ()O. ]T h(k)] ברשימה k חפש איבר עם מפתח Search(T,k) זמן במקרה הגרוע ביותר )אורך הרשימה(..T[ h(x.key)] מהרשימה x סלק את Delete(T,x) זמן במקרה הגרוע ביותר )אורך הרשימה(.
0 3 4 5 6 7 8 9 Insert(73) h(73) = 3 Insert(67) h(67) = 7 60 Insert(87) h(87) = 7 43 73 57 39 67 87
0 3 4 5 6 7 8 9 60 Insert(77) 43 73 במקום הסידורי בסוף הרשימה בראש הרשימה 57 39 67 87 שיטת השרשראות Chaining
דוגמא להכנסה בראש הרשימה 4 m = 0 נניח: h(k) = k mod m 0 3 4 5 6 7 8 9 6 53 9 53, 6, 7, 9, 37,, 57 57 37 7 37 57 57 קלט:
0 3 4 5 6 7 8 9 60 43 57 39 73 67 87 Insert(37) Insert(47) Insert(77) Insert(97) Insert(07) נכניס... במקרה הגרוע ביותר כל האיברים נכנסו לאותה הרשימה ואז זמן חיפוש/הוצאה הוא.(n) הנחה: המפתחות מפוזרים באופן אחיד או h מפזרת את המפתחות באופן אחיד
הנחה הפיזור האחיד הפשוט h מפזרת את המפתחות באופן אחיד n אברים m n m אורך ממוצע של רשימה פקטור העומס
הנחה הפיזור האחיד הפשוט אורך ממוצע של רשימה h מפזרת את המפתחות באופן אחיד n m זמן ממוצע חיפוש כ וש ל m n m O() אם נבחר O(n) m
8 ניתוח זמנים )המשך( משפט )חיפוש כושל(: בשיטת השרשראות ותחת הנחת הפיזור האחיד הפשוט הזמן הממוצע לחיפוש כושל הוא.+=+n/m הוכחה: בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ- m הרשימות. הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופה. אורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא. = n / m לפיכך בממוצע יידרש זמן + )הכולל את זמן בדיקת המצביע בסוף הרשימה(. 0 3 4 5 6 7 8 9 6 53 7 37 57 9 ארבעה מצביעים
0 9 ניתוח זמנים )המשך( 3 4 5 6 7 8 9 t n משפט )חיפוש מוצלח(: בשיטת השרשראות ותחת הנחת הפיזור האחיד הפשוט הזמן הממוצע לחיפוש מוצלח הוא.+/=+n/(m) )הכנסה בראש הרשימש( הוכחה: נאמר שבזמן החיפוש ישנם n מפתחות שהוכנסו בסדר k. k,, n 6 53 אחרי k i לפני k i 7 37 57 9 n i n i m k i n m.(n-i)/m הוא k i k i הוא? מהו זמן חיפוש הממוצע של המפתח k i אחרי מפתח זה נוספו n-i מפתחות נוספים. לכן בממוצע גודל הרשימה משמאל למפתח מכאן שזמן החיפוש הממוצע של המפתח + (n-i)/m המפתח זמן החיפוש הממוצע t למפתח כלשהו יהיה לפיכך: n n ( n i) ( n ) n i m nm i0 nm m n i הממוצע לחיפוש מפתיח רנדומלי!!! ב ל וף
ניתוח זמנים )המשך( 0 לפיכך, כאשר סדר הגודל של מספר המפתחות n בהם משתמשים הוא כגודל המערך m, כלומר עבור O(m) n, = נקבל שגורם העומס קבוע כלומר ()O = כל הפעולות דורשות זמן ממוצע ()O. ולכן דוגמא עבור 00=n מפתחות מטווח כלשהו U של מספרים שלמים, נאמר עד 0, 6 נוכל להחזיק מערך ובו 700=m מקומות ובממוצע אורך כל שרשרת יהיה ()O. וזמני החיפוש יהיו n/m=3
ערבול (ing) - פונקציית ערבול. h: U {,,, m} h k O() Direct Addressing מערך עם מימוש שרשראות זמן חישוב חייב להיות פיזור אחיד של המפתחות פקטור העומס O() הנחה פיזור אחיד הנחה התנגשויות כאשר x y אבל h(y) h(x) = זמן חיפוש כושל זמן חיפוש מוצלח שרשראות chaining + n m + n m
שיטת Open addressing לא נשתמש בשרשראות, אלא כל האיברים יוכנסו לטבלה. התנגשות נניח שברשותנו סדרה אינסופית של פונקציות ערבול:, h 0,h,h.h 0 (x).h (x) x Rehashing - h ( x) 0 h ( x) h 3 ( x) h ( x) ערבול נ ש נ ה נבחן שלושה שיטות: סריקה ליניארית, ערבול נשנה, וערבול כפול. ננסה לשמור את במקום אם תפוס, ננסה במקום נמשיך עד שנצליח.. (n m) ברור שבשיטות open addressing פקטור העומס
0 3 4 5 6 7 8 9 שיטת Open addressing סריקה ליניארית Linear probing h 0 ( x) h ( x) h ( x) 0 h ( x) h ( x) h ( x) h ( x) 3 h ( x) h ( x) 4 3 סריקה ליניארית -- probing linear אם המקום המיועד h(k) תפוס, שים במקום הבא מודולו m.
4 דוגמא 0 3 4 5 6 7 8 9 7 6 53 57 37 9 m = 0 דוגמא: h(k) = k mod m קלט: 53, 6, 7, 9, 37,, 57
5 linear probing כיצד נוציא איברים? הוצאה בשיטת לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתק. m = 0 דוגמא: h(k) = k mod m קלט: 53, 6, 7, 9, 37,,57 חפש 7? 7 6 53 57 9 הוצא 37 7 6 53 57 37 9 0 3 4 5 6 7 8 9
הוצאה בשיטת linear probing 6 פתרון : בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא, כולם חזרה פרט לאיבר שרוצים להוציא. והכנס את חפש 7! 6 53 57 7 9 7 6 53 57 37 9 הוצא 37 7 6 53 57 37 9 0 3 4 5 6 7 8 9
7 הוצאה בשיטת ה מ צ יב ה כדי לא לנתק את שרשרת החיפוש נסמן את מקום האיבר שהוצא בסימן.deleted )שיטת המציבה( בזמן חיפוש x, במידה וניתקל בסימן,delete נמשיך את סריקת הרשימה עד למציאת x או עד שנגיע למקום ריק )המסומן ב-.)Null בזמן הכנסת x, במידה וניתקל בסימן,delete נשתמש במקום זה לשמירת x, אחרת נשמור את x במקום הריק בסוף הרשימה )המסומן ב-.)Null 0 3 4 5 6 7 8 9 7 6 53 57 delete 7 37 9 דוגמא: m = 0 h(k) = k mod m קלט: 53, 6, 7, 9, 37,, 57 הוצא 37, חפש 7, הכנס 7
דוגמא נוספת שיטת Open addressing סריקה ליניארית Linear probing 33 3 0 3 4 5 6 7 8 9 3D 43 7 Insert(3) Insert(7) Insert(3) Insert(33) Insert(43) Delete(3) Search(43) h(x) = x mod 0 Search(33) Search(73)
0 3 4 5 6 7 8 9 Open addressing Linear probing n m ( ) ( )3 m m מקום ראשון לא תפוס שני לא תפוס שלישי לא תפוס n אורך חיפוש ממוצע שיטת סריקה ליניארית מהו זמן הכנסה ממוצע? ההסתברות שמקום רנדומלי תפוס
יתרונות וחסרונות היתרון העיקרי של שיטת ה מ צ יב ה הוא פשטות. אבל 30 כאשר השימוש דורש הוצאות, אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק באיברים שכרגע במבנה. דוגמאות לשימוש במילון ללא הוצאות: טבלה של שמות משתנים בהרצת תוכנית Table).(Symbol מספרי תעודות זהות אינם ממוחזרים. נתאר כעת שיטות נוספות ל- addressing.open שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות. כאשר יש צורך בהוצאות, עדיפה שיטת הרשימות המקושרות.
ערבול - Rehashing נ ש נ ה 3 נניח שברשותנו סדרה אינסופית של פונקציות ערבול:, h 0 h, h, ננסה לשמור את x במקום (x) h. 0 אם תפוס, ננסה במקום (x) h. נמשיך עד שנצליח..h i (x) = h(x) + i סריקה ליניארית probing( )linear היא מקרה פרטי בו:
ערבול כפול -- ing Double 3 נגיע לתוצאות דומות לערבול נשנה ע"י שתי פונקציות בלבד,d. h כאשר: d(x) h i (x) = h(x) + i הפונקציות,d h נבחרות באופן בלתי תלוי. מהו היחס הרצוי בין d(x) לגודל הטבלה? m גודל הטבלה ו- d(x) צריכים להיות מספרים זרים כך ש (x) h 0 (x),,h -m תכסה את כל האינדקסים האפשריים בתחום {-m,,0}. לפיכך נוח לבחור את m להיות מספר ראשוני. הוצאות נעשות ע"י שימוש בסימון.delete
ניתוח זמנים עבור Rehashing 33 הנחת הפיזור האחיד: הסדרה (x)) (h 0 (x),h (x),h (x), h m- היא פרמוטציה אקראית של (-m,,0). משפט: בהנחת הפיזור האחיד, בשיטת ערבול rehashing מתקיים: זמן ממוצע של חיפוש כושל קטן מ- ( - )/ ln גורם העומס חיפוש כושל חיפוש מוצלח 0.5 3.386 0.8 5 3. 6 0.9 0 3.669 זמן ממוצע של חיפוש מוצלח קטן מ- הוכחה בספר הלימוד: Introduction to algorithms, Cormen et al., pp 38-39
ניתוח זמנים עבור סריקה ליניארית משפט: בהנחת הפיזור האחיד הפשוט, בשיטת ערבול open addressing זמן ממוצע של חיפוש כושל קטן מ- זמן ממוצע של חיפוש מוצלח קטן מ- בסריקה ליניארית מתקיים: /( ) /( ) 34 סריקה ליניארית חיפוש מוצלח סריקה ליניארית חיפוש כ וש ל ערבול נשנה חיפוש מוצלח ערבול נשנה חיפוש כ ו של גורם העומס 0.5.836.5.5 0.8 5 3.6 3.0 3.0 0.9 0 3.669 50.5 5.5 הוכחה בספר : 973 Knuth, The art of computer programming, Vol 3, מסקנה: המשפט מראה שאפשר להשתמש בסריקה ליניארית, כל עוד הטבלה לא מלאה מדי )80%(.
ערבול (ing) 35 - פונקציית ערבול. h: U {,,, m} h k O() Direct Addressing מערך עם מימוש שרשראות Open Addressing מערך זמן חישוב חייב להיות O() הנחה O() הנחה O() הנחה פיזור אחיד הנחה פיזור אחיד הנחה פיזור אחיד הנחה פיזור אחיד של המפתחות פקטור העומס α = n/m התנגשויות כאשר x y אבל h(y) h(x) = שרשראות chaining Rehash Linear probing Double ing Rehash פיזור אחיד + α זמן חיפוש כושל + α α + α זמן חיפוש מוצלח + α α ln α + α
36 פונקציות ערבול דרישות מפונקציות ערבול: מפזרת היטב וקלה לחישוב. שיטת החילוק מודולו m: רצוי ש- m : h(x) = x mod m לא יהיה חזקה של או 0. בחזקות של פונקצית הערבול מסתמכת רק על (m) log הביטים הראשונים.(LSB) בחזקות של עשר, פונקצית הערבול מסתמכת רק על (m) log 0 הספרות הראשונות. רצוי שפונקציות הערבול ישתמשו בכל האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור האחיד. יהיה ראשוני שאינו קרוב לחזקה של. חזקות קרובות של גורמות לפיזור לא אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של, למשל מחרוזות תווים נכתבות בבסיס = 56 8. הערה:רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות "אמיתיים" וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב.
פונקציות ערבול )המשך( 37 0 > a שיטת הכפל בקבוע >.a הכפל את המפתח k בקבוע מצא את החלק השבור של התוצאה. h(k) = m (ak mod ) הכפל את החלק השבור ב- m הערך של m אינו קריטי. ועגל כלפי מטה: a 5 / 0.6803... ערך של a הגורם לפיזור טוב הוא : דוגמא: = 3456 k m = 0000 h(k) = 0000 (3456 0.6803 mod ) = 0000 (76300.0045 mod ) = 0000 0.0045 = 4.5 = 4
ערבול (ing) 38 - פונקציית ערבול. h: U {,,, m} h k O() Direct Addressing מערך עם מימוש שרשראות Open Addressing מערך זמן חישוב חייב להיות פיזור אחיד של המפתחות פקטור העומס α = n/m O() O() O() שיטת החילוק שיטת הכפל שיטת החילוק שיטת הכפל שיטת החילוק שיטת הכפל התנגשויות כאשר x y אבל h(y) h(x) = שרשראות chaining Rehash Linear probing Double ing Rehash פיזור אחיד + α זמן חיפוש כושל + α α + α זמן חיפוש מוצלח + α α ln α + α
פונקציות ערבול למחרוזות ארוכות a = 97 = 00 000 :ascii b = 98 = 00 000 39 נשתמש בקוד וכך הלאה פתרון נאיבי: בצע xor ביט ביט. לדוגמא: = 3 00) (0000 = 000)) (00 xor h( ab ) = h( (00 000) h(s 0,, s k ( =ascii(s 0 ) xor xor ascii(s k ) בהינתו מחרוזת s 0,, s k בצע: h( aa ) = h( (00 000) xor (00 000)) = (0000 0000) = 0 h{ bb ) = h( (00 000) xor (00 000)) = (0000 0000) = 0 חסרון ראשון: התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים: = 0 h{ abccba ) h(x) 55 חסרון שני: טווח הערכים מוגבל.
פונקציות ערבול למחרוזות ארוכות )המשך( 40 פתרון עדיף: בחר פרמוטציה אקראית ) 55 ( 0,, של 0 55 ואחסן אותה במערך.T.T[0] בצע xor בין האות הראשונה s 0 של המפתח והערך T 0 3 ] i T[aכאשר התוצאה a נמצאת בתחום 55 0. בשלב ה- i בצע xor בין האות s i של המפתח והערך xor בשלב הקודם. a i היא תוצאת ה- תוצאת פונקצית הערבול היא תוצאת ה- xor עם האות האחרונה של המפתח כלומר 8 38.hash(key) = s n xor T[a n ] דוגמא: hash(aa) hash(a) = T[0] xor 97 = 000 0 xor 00 000 = 0 00 = 8 hash(aa) = T[ hash(a) ] xor a = T[8] xor 97 = 000 00 xor 00 000 = 7 הערה: בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים.
0000 000 000 00 000 00 00 0 000 00 00 0 00 0 0 0000 07 96 6 6 97 94 3 04 50 0 84 03 99 33 000 3 58 4 57 3 8 5 0 37 48 8 53 63 86 35 000 69 4 60 34 79 70 80 4 0 9 33 7 9 39 96 00 85 0 0 4 6 78 30 93 0 9 66 65 4 77 43 5 000 30 8 9 06 09 57 46 65 38 7 36 6 00 35 55 87 08 7 3 93 30 7 0 40 98 45 3 00 5 00 7 4 6 4 74 74 9 4 47 0 5 5 73 36 44 0 45 98 49 8 34 66 45 03 64 54 8 5 55 4 46 000 3 35 34 3 47 44 97 64 43 83 88 75 53 56 5 89 00 9 58 63 7 9 6 79 3 54 87 8 6 67 6 38 6 00 0 07 54 8 77 8 78 39 59 4 53 50 68 5 37 0 90 99 9 43 4 0 70 75 36 06 48 44 49 46 95 00 9 3 37 69 85 3 6 7 7 73 83 44 5 4 3 0 08 49 56 90 6 39 40 60 94 38 76 4 84 55 04 0 9 7 80 47 3 09 67 05 76 33 59 5 50 8 89 00 5 7 0 5 3 7 8 9 40 8 05 95 86 68 48 5 T[00000] 97 00000 hash(dat) דוגמא T[0000000] 6 0000 T[00000000] 07 00 T[000] 53 0000 T[000] 40 00000 ascii 00 000 a 00 000 b 00 00 c 00 000 d symbol דוגמא: 4 hash( d) T[00000000] xor ascii( d) 00 xor 00000 000 hash( da) T[ hash( d)] xor ascii( a) 0000 xor 00000 000 hash( dat) T[ hash( da)] xor ascii( t) 00000 xor 0000 000 hash( dat) 000 48
פונקציות ערבול למחרוזות ארוכות )המשך( 4 מימוש של פונקצית הערבול: int hash(char *s) { int h = 0; char *p; for (p=s; *p; p++) h = T[h]^ *p; /* Xor */ return h; }
פונקציות ערבול למחרוזות ארוכות )המשך( 43 כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות T, T ולשרשר את התוצאות. hash(k) = [hash (k), hash (k)] = hash (k) * 56 + hash (k) גודל הטווח החדש, כלומר גודל טבלת הערבול, הוא 65,536= 6 = 56. )בעוד גודל כל T i הוא 56(. ניתן להגיע לטווח הרצוי ע"י שימוש במספר קטן של פרמוטציות נוספות. תוצאה דומה מתקבלת אם במקום hash נוסיף לאות הראשונה של המחרוזת ונשתמש שוב בפונקצית הערבול.hash לדוגמא: (bcb) hash(acb) = hash (acb) * 56 + hash
44 ערבול אוניברסלי לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי. תכונה זו יכולה ליצור בעיה. דוגמא: יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו פונקצית הערבול הבונה את ה- table symbol ממפה את כל השמות הנ"ל לאותו המקום בטבלת הערבול. לפיכך כל תוכנית מחשב של משתמש זה אינה יעילה כפי שיכולה הייתה להיות! הפתרון: לבחור באקראי, בזמן יצירת טבלת ערבול, פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה מראש. נרצה שקבוצת הפונקציות תהיה כזו, שעבור כל סדרת מפתחות, בחירה אקראית של אחת הפונקציות תיצור פיזור טוב. הגדרה: תהי H קבוצת פונקציות ערבול מתחום U לקבוצה {-m,,0}. הקבוצה H נקראת אוניברסלית אם לכל זוג מפתחות שונים x,y U מספר הפונקציות עבורן h(y) h(x) = הוא. H /m אבחנה: לכל זוג מפתחות x ו- y,ההסתברות p שבבחירה אקראית של פונקצית ערבול מתוך H, תהיה התנגשות בין x ו- y היא. p = ( H /m)/ H = /m נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב. אח"כ נראה כיצד לבנות קבוצה כזו.
ערבול אוניברסלי )המשך( 45 משפט: תהי H קבוצה אוניברסלית של פונקציות ערבול לתוך טבלה T בגודל m. אם h נבחרה באקראי מתוך H, ונשתמש בה לערבול n מפתחות כלשהם, אזי לכל מפתח, המספר הצפוי של התנגשויות בשיטת הרשימות המקושרות שווה ל-.(n-)/m = α-/m הוכחה: ראינו שההסתברות להתנגשות של מפתח מסוים x עם מפתח מסוים y היא p. = m/ המספר הצפוי של התנגשויות של מפתח מסוים x עם מפתח כלשהו נתון לפיכך ע"י: L { yt yx} m n m m מסקנה: מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס.
בניית קבוצה אוניברסלית נבחר את גודל הטבלה להיות מספר ראשוני m. נשבור כל מפתח x ל- + r חלקים באורך קבוע ] r.x = [ x 0,,x )למשל באורך בייט = 8 ביטים(. מספר הביטים יבחר כך שהערך של x i יהיה לכל היותר m. r+ h {0,..,m-} בצורה הבאה: נגדיר פונקצית ערבול (x) a לכל סדרה ] r a = [a 0,,a מהתחום.m r+ h a ( x) r a i0 i x i mod m קבוצת הפונקציות H מוגדרת להיות } a a h} ומספר הפונקציות בקבוצה זו הוא: 46 דרך השימוש בשיטה זו: נקצה טבלת ערבול T בגודל m, נגריל מספר a ונשתמש בפונקצית הערבול h a לכל הפעולות דוגמא: 57=m, טווח המפתחות 0-. 4 נשבור כל מפתח לשלושה חלקים באורך 8 ביטים. נניח שהוגרלו המספרים [0,48,3]=a. בהינתן המפתח [0,4,] = 0 + 4 8 = 0000000 =00000000 0000000 05 = x נחשב (480 + 34 + 0) mod 57 = 993 mod 57 =
בניית קבוצה אוניברסלית )המשך( 47 משפט: קבוצת הפונקציות } a H = h} שהוגדרה בשקף הקודם היא קבוצה אוניברסלית. הוכחה: יהיו ] r x = [x 0,,x ו- ] r y = [y 0,,y מפתחות שונים. ללא הגבלת הכלליות נניח.x 0 y 0 אנו טוענים שלכל בחירה של a a,, r קיים ערך יחיד ל- a 0 כך שמתקיים (y) h. a (x)=h a הערך a מתקבל מהפתרון היחיד למשוואה: a h a ( x ( x) h a ( y) r i0 r a ( x i i y ) 0 (mod m) i הניתנת ל ש כ ת וב כדלקמן: ) (mod y ) a ( x y ) 0 0 0 i i i m i בהנחה שהטענה נכונה, נובע שכל זוג מפתחות x,y מתנגשים עבור m r נזכור שמספר הפונקציות ב- H הוא +r m. עבורו x,y מתנגשים. ערכים של a שכן לכל ערך של ) r (a,,a קיים ערך אחד לפיכך, ההסתברות ש- x ו- y יתנגשו היא m r m/ +r = m/ כנדרש מקבוצה אוניברסלית. a 0
בניית קבוצה אוניברסלית )המשך( 48 טענה: למשוואה הבאה יש פתרון והפתרון יחיד. a ( x y ) r a ( x ) (mod 0 0 0 i i i m i y עבור כל מספר z )שאינו 0( קיים מספר w יחיד נזכר שכאשר m ראשוני מתקיים: במילים אחרות: לכל מספר הופכי )כפלי( יחיד! (m. z w = (mod כך ש = (mod 3) 3) = (mod למשל z = x 0 y 0 0 במשוואה הנתונה נכפיל את המשוואה בהופכי של z ונקבל את הפתרון היחיד ל- a. 0 r a0 ai ( xi yi ) ( x0 y0) (mod m) i )
מגבלות לערבול 49 צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה )n(. פתרון חלקי: כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול, להכניס את כל האיברים לטבלה החדשה, ולהיפטר מהטבלה הישנה. n n 4n הזמן המשוערך הממוצע יהיה ()O למרות שמדי פעם תתבצע פעולה יקרה.
Element Uniqueness שימוש: בעיית היחידות 50 נתונים מספרים 0 x 0,,x n- < T.x i = x j מצא אם קיים ij עבורו פתרון ראשון מיון: זמן (n O(n log O(n) פתרון שני ערבול: הכנס את המספרים לטבלת ערבול בגודל )שיתכן וקטנה בהרבה מ- T(. בזמן התנגשות, בדוק שוויון. זמן ממוצע.O(n)
מיון
מערך ששומר בכל A[i] כמה איברים מופיעים יותר או שווה ל- i אתחול A ב- ()O אם אבר x היה מופיע i פעמים והופיע פעם נוספת A[i+]=A[i+]+ HowMany(i,j)=A[i]-A[j+] פעמים