500 likes | 818 Views
ערבול (Hashing). Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS. חומר קריאה לשיעור זה:. Chapter 12- Hash tables (pages 219—243). Geiger & Itai, 2001. ערבול (Hashing). Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS. 0.
E N D
ערבול (Hashing) Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS חומר קריאה לשיעור זה: Chapter 12- Hash tables (pages 219—243) Geiger & Itai, 2001
ערבול (Hashing) Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS 0 1 2 Data 2 k Data k m-1 ראינו שלושה מימושים שונים למילון: AVL, עצי 2-3 ורשימת דילוגים הפעולות הבסיסיות (חיפוש, הכנסה, והוצאה) מתבצעות כל אחת ב-O(log n) האם אפשר לממש פעולות אלו בסיבוכיות זמן יותר טובה? לא למפתח כלשהו נניח שהמפתחות הם { 0,1,2,3,4,5,6,7,8,9 } תשובה: כן! באמצעות מערך אפשר לממש כל פעולה ב-O(1) איך?........ Geiger & Itai, 2001
ערבול (Hashing) Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS נניח שהמספרים הם { 0,1,2,3,4,5,6,7,8,9 } 0 Insert(3) Insert(7) 3 Insert(0) Insert(9) Delete(7) Delete(0) 7 Search(3) Search(0) 9 Geiger & Itai, 2001
ערבול (Hashing) Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS נניח שהמספרים הם { 0,1,2,3,4,5,6,7,8,9 } גישה ישירה direct addressing סבוכיות מקום סבוכיות זמן O(M) O(1) 3 למספרים 0,1,2,3,..., M אבחנה: אם נשתמש במערך, זמן של כל פעולה יהיה אמנם O(1), אך דרישות המקום הן O(M) , כאשר M הוא גודל הטווח. ייתכן n = o(M). 9 cs,Technion
ערבול (Hashing) מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים? תשובה: לְעִתִּיםגודל התחום של ערכי המפתחות גדול בהרבה ממספר המפתחות בהם משתמשים. דוגמא 1: מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות כלומר קיימים 109 מפתחות אך בישראל יש פחות מ 107 אנשים. לפיכך שימוש במערך ינצל פחות מ 1% בודד של הזיכרון המוקצה למערך. דוגמא 2: מספר המחרוזות של אותיות עבריות באורך 30 (באמצעותן ניתן לתאר שם פרטי, שם אמצעי, ושם משפחה של תושבי ישראל) הוא 2230 בעוד מספר האנשים קטן מ 107. cs,Technion
ערבול (Hashing) מימוש מילון באמצעות מערך נקרא גישה ישירה (Direct Addressing ): המפתח עצמו משמש כאינדקס במערך. כאשר מרחב המפתחות גדול נחשבאינדקס h(k)מתוך המפתח kבאמצעות פונקציתערבול. h: key index המטרה לממש את פעולות החיפוש,הכנסה, והוצאה בזמן ממוצע של O(1) . מפתח k יכנס לתא h(k) במערך לכן זמן חישוב h(k) חייב להיות O(1) נגדיר פונקצית ערבול (hash):h: U {0,…,m-1} אשר בהינתן מפתח בתחום U מחשבת אינדקס בטווח המתאים. cs,Technion
דוגמא נניח שהמספרים הם {0 - 1000} 60 h: {0 – 1000} {0,1,2,…,9} h(x) = x mod 10 Insert(43) h(43) = 3 43 Insert(57) h(57) = 7 Insert(60) h(60) = 0 Insert(39) h(39) = 9 57 39
פעולות מילון נניח שהמספרים הם {0 - 1000} 60 h: {0 – 1000} {0,1,2,…,9} h(x) = x mod 10 Delete(57) h(57) = 7 43 Delete(50) h(50) = 0 Search(43) h(43) = 3 Search(66) h(66) = 6 57 h פונקצית ערבול hash function 39
פעולות מילון נניח שהמספרים הם {0 - 1000} 60 h: {0 – 1000} {0,1,2,…,9} h(x) = x mod 10 Insert(73) h(73) = 3 43 התנגשות 57 39
0 1 51 2 92 3 4 5 15 6 7 17 8 88 9 29 דוגמא:m = 10 h(k) = k mod 10 51, 17, 15, 92, 88, 29 בשיטת הערבול נוצרות התנגשויות כאשר x y אבל h(x) = h(y). h(81) = 1 = h(51) cs,Technion
פתרון להתנגשויות באמצעות "שרשראות" (chaining) T x3 x4 x1 X1 X4 X5 X3 x5 x2 X2 הפעולות: Insert(T,x) הכנס את x בראש הרשימה T[ h(x.key)]. זמן במקרה הגרוע ביותר O(1). Search(T,k) חפש איבר עם מפתח k ברשימה T[ h(k)] זמן במקרה הגרוע ביותר (אורך הרשימה). Delete(T,x) סלק את x מהרשימה T[ h(x.key)]. זמן במקרה הגרוע ביותר (אורך הרשימה) . cs,Technion
Insert(73) h(73) = 3 Insert(67) h(67) = 7 60 Insert(87) h(87) = 7 43 73 57 67 87 39
60 Insert(77) 43 73 במקום הסידורי בראש הרשימה בסוף הרשימה 57 67 87 Chaining שיטת השרשראות 39
דוגמא להכנסה בראש הרשימה 0 1 2 3 4 5 6 7 8 9 12 62 12 53 37 57 17 57 37 57 19 נניח: m = 10 h(k) = k mod m קלט: 53, 62, 17, 19, 37, 12, 57 cs,Technion
נכניס.... 60 Insert(37)Insert(47) Insert(77)Insert(97) Insert(107) 43 73 במקרה הגרוע ביותר כל האיברים נכנסו לאותה הרשימה ואז זמן חיפוש/הוצאה הוא (n). 57 67 87 הנחה: המפתחות מפוזרים באופן אחיד או h מפזרת את המפתחות באופן אחיד 39
הנחה הפיזור האחיד הפשוט h מפזרת את המפתחות באופן אחיד אבריםn אורך ממוצע של רשימה m פקטור העומס
הנחה הפיזור האחיד הפשוט h מפזרת את המפתחות באופן אחיד אורך ממוצע של רשימה זמן ממוצעחיפוש כּוֹשֵׁל m אם נבחר
ניתוח זמנים (המשך) 2 9 4 6 3 5 8 0 1 7 12 62 53 ארבעה מצביעים 37 57 17 19 משפט (חיפוש כושל): בשיטת השרשראות ותחת הנחת הפיזור האחיד הפשוט הזמן הממוצע לחיפוש כושל הוא 1+=1+n/m. • הוכחה: בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ-m הרשימות. • הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופה. • אורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא = n / m . • לפיכך בממוצע יידרש זמן 1+ (הכולל את זמן בדיקת המצביע בסוף הרשימה). cs,Technion
ניתוח זמנים (המשך) 9 2 6 4 8 5 0 3 1 7 12 62 53 אחרי ki לפני ki 37 57 17 19 המפתח ki משפט (חיפוש מוצלח): בשיטת השרשראות ותחת הנחת הפיזור האחיד הפשוט הזמן הממוצע לחיפוש מוצלח הוא 1+/2=1+n/(2m). (הכנסה בראש הרשימש) • הוכחה: נאמר שבזמן החיפוש ישנם n מפתחות שהוכנסו בסדר k1,…,kn. • מהו זמן חיפוש הממוצע של המפתח ki ? • אחרי מפתח זה נוספו n-i מפתחות נוספים. • לכן בממוצע גודל הרשימה משמאל למפתח ki הוא (n-i)/m. • מכאן שזמן החיפוש הממוצע של המפתח ki הוא • (n-i)/m1+ • זמן החיפוש הממוצע t למפתח כלשהו יהיה לפיכך: הממוצע לחיפוש מפתיח רנדומלי!!! בְּלוֹף
ניתוח זמנים (המשך) לפיכך, כאשר סדר הגודל של מספר המפתחות n בהם משתמשים הוא כגודל המערך m, כלומר עבור n = O(m), נקבל שגורם העומס קבוע כלומר = O(1) ולכן כל הפעולות דורשות זמן ממוצע O(1). דוגמא עבור 2100n= מפתחות מטווח כלשהו U של מספרים שלמים, נאמר עד 106, נוכל להחזיק מערך ובו 700m= מקומות ובממוצע אורך כל שרשרת יהיה 3n/m= וזמני החיפוש יהיו O(1). cs,Technion
ערבול (Hashing) cs,Technion
שיטת Open addressing לא נשתמש בשרשראות, אלא כל האיברים יוכנסו לטבלה. התנגשות ערבול נִשְׁנָהRehashing - נניח שברשותנו סדרה אינסופית של פונקציות ערבול: h0,h1,h2,… ננסה לשמור את x במקום h0(x). אם תפוס, ננסה במקום h1(x). נמשיך עד שנצליח. נבחן שלושה שיטות: סריקה ליניארית, ערבול נשנה, וערבול כפול. ברור שבשיטות open addressing פקטור העומס 1 ≥(n m) .
שיטת Open addressing סריקה ליניארית Linear probing סריקה ליניארית linear probing -- אם המקום המיועד h(k) תפוס, שים במקום הבא מודולו m.
דוגמא 17 17 0 17 דוגמא: m = 10 h(k) = k mod m 1 12 12 12 2 12 12 12 קלט: 62 53, 62, 17, 19, 37, 12, 57 62 3 53 4 5 6 57 57 57 7 57 57 57 37 37 37 8 37 37 19 19 19 9 19
הוצאה בשיטת linear probing 17 12 62 0 17 53 1 2 12 3 62 57 4 53 37 5 19 6 7 57 8 9 19 כיצד נוציא איברים ? • לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתק. דוגמא: m = 10 h(k) = k mod m קלט: 53, 62, 17, 19, 37, 12 ,57 הוצא37 חפש17?
פתרון 1: בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא, והכנס את כולם חזרה פרט לאיבר שרוצים להוציא. הוצאה בשיטת linear probing 17 12 62 17 0 53 1 12 12 2 62 62 3 57 53 הוצא37 53 4 37 5 19 6 57 57 7 17 37 8 19 19 9 חפש17! cs,Technion
הוצאה בשיטת הַמַּצִּיבָה 17 דוגמא: m = 10 h(k) = k mod m 12 קלט: 53, 62, 17, 19, 37, 12, 57 62 0 17 17 53 1 2 12 12 3 62 62 57 4 53 53 37 5 19 6 7 57 57 8 delete 27 9 19 19 • כדי לא לנתק את שרשרת החיפוש נסמן את מקום האיבר שהוצא בסימן deleted . (שיטת המציבה) • בזמן חיפושx, במידה וניתקל בסימן delete, נמשיך את סריקת הרשימה עד למציאת x או עד שנגיע למקום ריק (המסומן ב- Null). • בזמן הכנסתx, במידה וניתקל בסימן delete, נשתמש במקום זה לשמירת x, אחרת נשמור את x במקום הריק בסוף הרשימה (המסומן ב-Null ). הוצא37, חפש17, הכנס27
שיטת Open addressing דוגמא נוספת סריקה ליניארית Linear probing Insert(3) h(x) = x mod 10 Insert(7) 33 Insert(13) 13 3 D Insert(33) Search(33) Insert(43) Search(73) 43 Delete(3) 7 Search(43)
שיטת Open addressing סריקה ליניארית Linear probing מהו זמן הכנסה ממוצע? ההסתברות שמקום רנדומלי תפוס מקום ראשון לא תפוס שני לא תפוס שלישי לא תפוס אורך חיפוש ממוצע
יתרונות וחסרונות • היתרון העיקרי של שיטת הַמַּצִּיבָה הוא פשטות. אבל … • כאשר השימוש דורש הוצאות, אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק באיברים שכרגע במבנה. • דוגמאות לשימוש במילון ללא הוצאות: • טבלה של שמות משתנים בהרצת תוכנית (Symbol Table). • מספרי תעודות זהות אינם ממוחזרים. נתאר כעת שיטות נוספות ל-open addressing. שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות. כאשר יש צורך בהוצאות, עדיפה שיטתהרשימות המקושרות. cs,Technion
ערבול נִשְׁנָהRehashing - נניח שברשותנו סדרה אינסופית של פונקציות ערבול: h0,h1,h2,… ננסה לשמור את x במקום h0(x). אם תפוס, ננסה במקום h1(x). נמשיך עד שנצליח. סריקה ליניארית (linear probing) היא מקרה פרטי בו: hi(x) = h(x) + i . cs,Technion
ערבול כפול Double Hashing -- נגיע לתוצאות דומות לערבול נשנה ע"י שתי פונקציות בלבד d, h. כאשר: hi(x) = h(x) + i d(x) הפונקציות d, h נבחרות באופן בלתי תלוי. מהו היחס הרצוי בין d(x) לגודל הטבלה m ? גודל הטבלה ו- d(x) צריכים להיות מספרים זרים כך ש ,hm-1(x) …h0(x), תכסה את כלהאינדקסים האפשריים בתחום {0,…,m-1}. לפיכך נוח לבחור את m להיות מספר ראשוני. הוצאות נעשות ע"י שימוש בסימון delete . cs,Technion
ניתוח זמנים עבור Rehashing משפט: בהנחת הפיזור האחיד, בשיטת ערבול rehashingמתקיים: זמן ממוצע של חיפוש כושל קטן מ- 1/(1 - ) זמן ממוצע של חיפוש מוצלח קטן מ- הנחת הפיזור האחיד:הסדרה (h0(x),h1(x),h2(x),…hm-1(x)) היא פרמוטציה אקראית של (0,…,m-1). הוכחה בספר הלימוד: Introduction to algorithms, Cormen et al., pp 238-239 cs,Technion
ניתוח זמנים עבור סריקה ליניארית משפט: בהנחת הפיזור האחיד הפשוט, בשיטת ערבול open addressing בסריקה ליניארית מתקיים: זמן ממוצע של חיפוש כושל קטן מ- זמן ממוצע של חיפוש מוצלח קטן מ- הוכחה בספר : Knuth, The art of computer programming, Vol 3, 1973 מסקנה: המשפט מראה שאפשר להשתמש בסריקה ליניארית, כל עוד הטבלה לא מלאה מדי (80%). cs,Technion
ערבול (Hashing) cs,Technion
פונקציות ערבול דרישות מפונקציות ערבול: מפזרת היטב וקלה לחישוב. שיטת החילוק מודולו m: h(x) = x mod m רצוי ש-m: לא יהיה חזקה של 2 או 10. בחזקות של 2 פונקצית הערבול מסתמכת רק על log2(m) הביטים הראשונים (LSB). בחזקות של עשר, פונקצית הערבול מסתמכת רק על log10(m) הספרות הראשונות. רצוי שפונקציות הערבול ישתמשו בכל האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור האחיד. יהיה ראשוני שאינו קרוב לחזקה של 2. חזקות קרובות של 2 גורמות לפיזור לא אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של 2, למשל מחרוזות תווים נכתבות בבסיס 28 = 256 . הערה:רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות "אמיתיים" וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב. cs,Technion
פונקציות ערבול (המשך) • שיטת הכפל בקבוע 1 > a > 0 • הכפל את המפתח k בקבוע a. • מצא את החלק השבור של התוצאה. • הכפל את החלק השבור ב- m ועגל כלפי מטה: h(k) = m (ak mod 1) הערך של m אינו קריטי. ערך של a הגורם לפיזור טוב הוא : דוגמא:m = 10000 k = 123456 h(k) = 10000 (123456 0.61803 mod 1) = 10000 (76300.0041151 mod 1) = 10000 0.0041151 = 41.151 … = 41 cs,Technion
ערבול (Hashing) cs,Technion
פונקציות ערבול למחרוזות ארוכות נשתמש בקוד ”a” = 97 = 0110 0001 :ascii ”b” = 98 = 0110 0010 וכך הלאה … פתרון נאיבי: בצע xor ביט ביט. לדוגמא: h(“ab”) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 בהינתו מחרוזת s0,…, sk בצע: =ascii(s0) xor … xor ascii(sk) (h(s0,…, sk חסרון ראשון: h(“aa”) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 h{“bb”) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0 התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים:h{“abccba”) = 0 חסרון שני: טווח הערכים מוגבל.h(x) 255 cs,Technion
פונקציות ערבול למחרוזות ארוכות (המשך) T 0 23 דוגמא: hash(aa) 118 38 hash(a) = T[0] xor 97 = פתרון עדיף: בחר פרמוטציה אקראית (0,…, 255) של 0…255 ואחסן אותה במערךT . בצע xor בין האות הראשונה s0 של המפתח והערך T[0]. התוצאה a1 נמצאת בתחום0…255 . בשלב ה-i בצע xor בין האות si של המפתח והערך T[ai]כאשר ai היא תוצאת ה-xor בשלב הקודם. תוצאת פונקצית הערבול היא תוצאת ה-xor עם האות האחרונה של המפתח כלומר hash(key) = sn xor T[an]. 0001 01111 xor 0110 0001 = 0111 0110 = 118 hash(aa) = T[ hash(a) ] xor a = T[118] xor 97 = 0010 0110 xor 0110 0001 = 71 הערה: בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים. cs,Technion
דוגמא דוגמא: hash(dat) cs,Technion
פונקציות ערבול למחרוזות ארוכות (המשך) מימוש של פונקצית הערבול: int hash(char *s) { int h = 0; char *p; for (p=s; *p; p++) h = T[h]^ *p; /* Xor */ return h; } cs,Technion
פונקציות ערבול למחרוזות ארוכות (המשך) כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות T1, T2 ולשרשר את התוצאות. hash(k) = [hash1(k), hash2(k)] = hash1(k) * 256 + hash2(k) גודל הטווח החדש, כלומר גודל טבלת הערבול, הוא=65,536 2562 = 216. (בעוד גודל כל Ti הוא 256). ניתן להגיע לטווח הרצוי ע"י שימוש במספר קטן של פרמוטציות נוספות. תוצאה דומה מתקבלת אם במקום hash2 נוסיף 1 לאות הראשונה של המחרוזת ונשתמש שובבפונקצית הערבול hash1. לדוגמא: hash(acb) = hash1(acb) * 256 + hash1(bcb) cs,Technion
ערבול אוניברסלי אבחנה: לכל זוג מפתחות x ו-y,ההסתברותpשבבחירהאקראית של פונקצית ערבול מתוךH, תהיה התנגשות ביןx ו-y היא p = (|H|/m)/|H| = 1/m. נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב. אח"כ נראה כיצד לבנות קבוצה כזו. לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי. תכונה זו יכולה ליצור בעיה. דוגמא: יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו פונקצית הערבול הבונה את ה-symbol table ממפה את כל השמות הנ"ל לאותו המקום בטבלת הערבול. לפיכך כל תוכנית מחשב של משתמש זה אינה יעילה כפי שיכולה הייתה להיות ! הפתרון: לבחור באקראי, בזמן יצירת טבלת ערבול, פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה מראש. נרצה שקבוצת הפונקציות תהיה כזו, שעבור כל סדרת מפתחות, בחירה אקראית של אחת הפונקציות תיצור פיזור טוב. הגדרה: תהי H קבוצת פונקציות ערבול מתחום U לקבוצה .{0,…,m-1} הקבוצה H נקראת אוניברסלית אם לכל זוג מפתחות שונים x,y U מספר הפונקציות עבורן h(x) = h(y) הוא |H|/m .
ערבול אוניברסלי (המשך) משפט: תהיHקבוצה אוניברסלית של פונקציות ערבול לתוך טבלהT בגודלm. אםhנבחרהבאקראי מתוךH, ונשתמש בה לערבולnמפתחות כלשהם, אזי לכל מפתח,המספר הצפוי שלהתנגשויות בשיטת הרשימות המקושרות שווה ל-(n-1)/m = α-1/m . הוכחה:ראינו שההסתברות להתנגשות של מפתח מסויםxעם מפתח מסויםyהיאp = 1/m. המספר הצפוי של התנגשויות של מפתח מסויםxעם מפתח כלשהו נתון לפיכך ע"י: מסקנה: מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס. cs,Technion
בניית קבוצה אוניברסלית נבחר את גודל הטבלה להיות מספר ראשוניm. נשבור כל מפתחxל-r + 1חלקים באורך קבועx = [ x0,…,xr]. (למשל באורך בייט = 8 ביטים). מספר הביטים יבחר כך שהערך שלxiיהיה לכל היותרm. לכל סדרהa = [a0,…,ar]מהתחום{0,..,m-1} r+1נגדיר פונקצית ערבול ha(x) בצורההבאה: קבוצת הפונקציותHמוגדרת להיותa {ha}ומספר הפונקציות בקבוצה זו הוא:mr+1. דרך השימוש בשיטה זו: נקצה טבלת ערבולTבגודלm, נגריל מספרa ונשתמש בפונקצית הערבולhaלכל הפעולות דוגמא: m=257, טווח המפתחות0-224. נשבור כל מפתח לשלושה חלקים באורך 8 ביטים.נניח שהוגרלו המספרים a=[248,223, 101]. בהינתן המפתח x = 1025 =00000000 00000100 00000001 = 4·28 +1·20 = [0,4,1] נחשב (2480+ 2234 + 1011) mod 257 = 993 mod 257 = 222 cs,Technion
בניית קבוצה אוניברסלית (המשך) הניתנת לַשִּׁכְתּוּב כדלקמן: משפט: קבוצת הפונקציותH = {ha}שהוגדרה בשקף הקודם היא קבוצה אוניברסלית. הוכחה: יהיוx = [x0,…,xr] ו- y = [y0,…,yr]מפתחות שונים. ללא הגבלת הכלליות נניחx0y0. אנו טוענים שלכל בחירה שלa1,…,arקיים ערך יחיד ל-a0כך שמתקייםha(x)=ha(y). הערךaמתקבל מהפתרון היחיד למשוואה: בהנחה שהטענה נכונה, נובע שכל זוג מפתחותx,yמתנגשיםעבורmrערכים שלaשכן לכל ערך של (a1,…,ar)קיים ערך אחדa0עבורוx,yמתנגשים. נזכור שמספר הפונקציות ב-H הוא mr+1. לפיכך, ההסתברות ש-x ו-y יתנגשו היאmr/mr+1 = 1/m כנדרש מקבוצה אוניברסלית. cs,Technion
בניית קבוצה אוניברסלית (המשך) במשוואה הנתונה z = x0 – y0 0 נכפיל את המשוואה בהופכי של z ונקבל את הפתרון היחיד ל-a0. טענה: למשוואה הבאה יש פתרון והפתרון יחיד. נזכר שכאשרmראשוני מתקיים:עבור כל מספרz(שאינו 0) קיים מספרwיחיד כךשz w = 1 (mod m) . במילים אחרות: לכל מספר הופכי (כפלי) יחיד! למשל 2 2 = 1 (mod 3) 1 1 = 1 (mod 3) cs,Technion
מגבלות לערבול צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה (n). פתרון חלקי: כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול,להכניס את כל האיברים לטבלה החדשה, ולהיפטר מהטבלה הישנה. 4n 2n n הזמן המשוערך הממוצע יהיהO(1) למרות שמדי פעם תתבצע פעולה יקרה. cs,Technion
שימוש: בעיית היחידותElement Uniqueness נתונים מספרים0 x0,…,xn-1 < T מצא אם קיים ijעבורוxi = xj. פתרון ראשון– מיון: זמןO(n log n) פתרון שני– ערבול: הכנס את המספרים לטבלת ערבול בגודל O(n) (שיתכן וקטנה בהרבה מ-T ). בזמן התנגשות, בדוק שוויון. זמן ממוצע O(n). cs,Technion