Hash
(Hashing)ערבול
חומר קריאה לשיעור זה
Chapter 12- Hash tables (pages 219mdash243)
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
Hash
(Hashing)ערבול
ורשימת דילוגים 2-3עצי AVL ראינו שלושה מימושים שונים למילון
O(log n)-מתבצעות כל אחת ב( והוצאה הכנסה חיפוש)הפעולות הבסיסיות
האם אפשר לממש פעולות אלו בסיבוכיות זמן יותר טובה
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
1 Data 2 2
Data k k
0
m-1
כן תשובה
O(1)-באמצעות מערך אפשר לממש כל פעולה ב
למפתח כלשהו לא
0123456789 נניח שהמפתחות הם
איך
Hash
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
0
1
2
3
4
5
6
7
8
9
0123456789 נניח שהמספרים הם
Insert(3)
Insert(7)
Insert(0)
Insert(9)
Delete(7)
Delete(0)
Search(3)
Search(0)
3
7
0
9
Hash
csTechnion
4
O(1) סבוכיות זמן
O(M) סבוכיות מקום
direct addressing גישה ישירה 0
1
2
3
4
5
6
7
8
9
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
0123456789 נניח שהמספרים הם
3
9
אם נשתמש במערך אבחנה
O(1)זמן של כל פעולה יהיה אמנם
O(M)אך דרישות המקום הן
הטווחהוא גודל Mכאשר
n = o(M)ייתכן
M 0123 למספרים
Hash
csTechnion
5
(Hashing)ערבול
של ערכי המפתחות גדול בהרבה גודל התחום לעתים תשובה
המפתחות בהם משתמשים ממספר
מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות 1דוגמא
אנשים 107מפתחות אך בישראל יש פחות מ 109כלומר קיימים
בודד של הזיכרון המוקצה 1לפיכך שימוש במערך ינצל פחות מ
למערך
30מספר המחרוזות של אותיות עבריות באורך 2דוגמא
ושם משפחה של שם אמצעי באמצעותן ניתן לתאר שם פרטי)
107בעוד מספר האנשים קטן מ 2230הוא ( תושבי ישראל
מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
(Hashing)ערבול
ורשימת דילוגים 2-3עצי AVL ראינו שלושה מימושים שונים למילון
O(log n)-מתבצעות כל אחת ב( והוצאה הכנסה חיפוש)הפעולות הבסיסיות
האם אפשר לממש פעולות אלו בסיבוכיות זמן יותר טובה
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
1 Data 2 2
Data k k
0
m-1
כן תשובה
O(1)-באמצעות מערך אפשר לממש כל פעולה ב
למפתח כלשהו לא
0123456789 נניח שהמפתחות הם
איך
Hash
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
0
1
2
3
4
5
6
7
8
9
0123456789 נניח שהמספרים הם
Insert(3)
Insert(7)
Insert(0)
Insert(9)
Delete(7)
Delete(0)
Search(3)
Search(0)
3
7
0
9
Hash
csTechnion
4
O(1) סבוכיות זמן
O(M) סבוכיות מקום
direct addressing גישה ישירה 0
1
2
3
4
5
6
7
8
9
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
0123456789 נניח שהמספרים הם
3
9
אם נשתמש במערך אבחנה
O(1)זמן של כל פעולה יהיה אמנם
O(M)אך דרישות המקום הן
הטווחהוא גודל Mכאשר
n = o(M)ייתכן
M 0123 למספרים
Hash
csTechnion
5
(Hashing)ערבול
של ערכי המפתחות גדול בהרבה גודל התחום לעתים תשובה
המפתחות בהם משתמשים ממספר
מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות 1דוגמא
אנשים 107מפתחות אך בישראל יש פחות מ 109כלומר קיימים
בודד של הזיכרון המוקצה 1לפיכך שימוש במערך ינצל פחות מ
למערך
30מספר המחרוזות של אותיות עבריות באורך 2דוגמא
ושם משפחה של שם אמצעי באמצעותן ניתן לתאר שם פרטי)
107בעוד מספר האנשים קטן מ 2230הוא ( תושבי ישראל
מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
Geiger amp Itai 2001
0
1
2
3
4
5
6
7
8
9
0123456789 נניח שהמספרים הם
Insert(3)
Insert(7)
Insert(0)
Insert(9)
Delete(7)
Delete(0)
Search(3)
Search(0)
3
7
0
9
Hash
csTechnion
4
O(1) סבוכיות זמן
O(M) סבוכיות מקום
direct addressing גישה ישירה 0
1
2
3
4
5
6
7
8
9
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
0123456789 נניח שהמספרים הם
3
9
אם נשתמש במערך אבחנה
O(1)זמן של כל פעולה יהיה אמנם
O(M)אך דרישות המקום הן
הטווחהוא גודל Mכאשר
n = o(M)ייתכן
M 0123 למספרים
Hash
csTechnion
5
(Hashing)ערבול
של ערכי המפתחות גדול בהרבה גודל התחום לעתים תשובה
המפתחות בהם משתמשים ממספר
מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות 1דוגמא
אנשים 107מפתחות אך בישראל יש פחות מ 109כלומר קיימים
בודד של הזיכרון המוקצה 1לפיכך שימוש במערך ינצל פחות מ
למערך
30מספר המחרוזות של אותיות עבריות באורך 2דוגמא
ושם משפחה של שם אמצעי באמצעותן ניתן לתאר שם פרטי)
107בעוד מספר האנשים קטן מ 2230הוא ( תושבי ישראל
מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
4
O(1) סבוכיות זמן
O(M) סבוכיות מקום
direct addressing גישה ישירה 0
1
2
3
4
5
6
7
8
9
(Hashing)ערבול
Lecture7 of Geiger amp Itairsquos slide brochure
wwwcstechnionacil~dangcourseDS
0123456789 נניח שהמספרים הם
3
9
אם נשתמש במערך אבחנה
O(1)זמן של כל פעולה יהיה אמנם
O(M)אך דרישות המקום הן
הטווחהוא גודל Mכאשר
n = o(M)ייתכן
M 0123 למספרים
Hash
csTechnion
5
(Hashing)ערבול
של ערכי המפתחות גדול בהרבה גודל התחום לעתים תשובה
המפתחות בהם משתמשים ממספר
מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות 1דוגמא
אנשים 107מפתחות אך בישראל יש פחות מ 109כלומר קיימים
בודד של הזיכרון המוקצה 1לפיכך שימוש במערך ינצל פחות מ
למערך
30מספר המחרוזות של אותיות עבריות באורך 2דוגמא
ושם משפחה של שם אמצעי באמצעותן ניתן לתאר שם פרטי)
107בעוד מספר האנשים קטן מ 2230הוא ( תושבי ישראל
מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
5
(Hashing)ערבול
של ערכי המפתחות גדול בהרבה גודל התחום לעתים תשובה
המפתחות בהם משתמשים ממספר
מספרי תעודת זהות מורכבים מתשע ספרות עשרוניות 1דוגמא
אנשים 107מפתחות אך בישראל יש פחות מ 109כלומר קיימים
בודד של הזיכרון המוקצה 1לפיכך שימוש במערך ינצל פחות מ
למערך
30מספר המחרוזות של אותיות עבריות באורך 2דוגמא
ושם משפחה של שם אמצעי באמצעותן ניתן לתאר שם פרטי)
107בעוד מספר האנשים קטן מ 2230הוא ( תושבי ישראל
מדוע לפיכך נרצה להשתמש בעצי חיפוש מאוזנים או ברשימות דילוגים
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
6
(Hashing)ערבול
אשר בהינתן מפתח h U 0hellipm-1(hash)נגדיר פונקצית ערבול
מחשבת אינדקס בטווח המתאים Uבתחום
המפתח ( Direct Addressing)מימוש מילון באמצעות מערך נקרא גישה ישירה
עצמו משמש כאינדקס במערך
באמצעות k מתוך המפתח h(k) אינדקס נחשבכאשר מרחב המפתחות גדול
h key index ערבול פונקצית
O(1)של ממוצעוהוצאה בזמן הכנסההחיפושהמטרה לממש את פעולות
במערך h(k)יכנס לתא kמפתח
O(1)חייב להיות h(k)לכן זמן חישוב
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
דוגמא
Insert(43)
Insert(57)
Insert(60)
Insert(39)
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
h(43) = 3
h(57) = 7
h(60) = 0
h(39) = 9
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Delete(57)
Delete(50)
Search(43)
Search(66)
h(57) = 7
h(50) = 0
h(43) = 3
h(66) = 6
h פונקצית ערבול hash function
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
1000 - 0נניח שהמספרים הם
פעולות מילון
43
57
60
39
h 0 ndash 1000 012hellip9
h(x) = x mod 10
Insert(73) h(73) = 3
התנגשות
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
10
בשיטת הערבול נוצרות התנגשויות
h(x) = h(y)אבל x y כאשר
m = 10 h(k) = k mod 10דוגמא
51 17 15 92 88 29
51 1 92 2
3 4
15 5 6
17 7 88 8
0
29 9 h(81) = 1 = h(51)
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
11
(chaining )שרשראותפתרון להתנגשויות באמצעות
Insert(Tx) הכנס אתx בראש הרשימהT[ h(xkey)]
O(1)זמן במקרה הגרוע ביותר
Search(Tk) חפש איבר עם מפתחk ברשימהT[ h(k)]
(אורך הרשימה)זמן במקרה הגרוע ביותר
Delete(Tx) סלק אתx מהרשימהT[ h(xkey)]
( אורך הרשימה)זמן במקרה הגרוע ביותר
הפעולות
x1 x3 x4
x2 x5
X1
X4
X5 X3
X2
T
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
Insert(73) h(73) = 3
73
Insert(67) h(67) = 7
67
Insert(87) h(87) = 7
87
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(77)
בראש הרשימה במקום הסידורי
בסוף הרשימה
Chaining שיטת השרשראות
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
14
דוגמא להכנסה בראש הרשימה
m = 10 h(k) = k mod m נניח
קלט
1
2
3
4
5
6
7
8
0
9
12
53
19
53 62 17 19 37 12 57
62 12
57 37 57 17 37 57
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
60
43
57
39
73
67 87
Insert(37) Insert(47)
Insert(77) Insert(97)
Insert(107)
המפתחות מפוזרים באופן אחיד הנחה
או
h מפזרת את המפתחות באופן אחיד
במקרה הגרוע ביותר כל האיברים נכנסו לאותה
(n)הוצאה הוא הרשימה ואז זמן חיפוש
נכניס
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
אברים n
m
n
פקטור העומס
אורך ממוצע
של רשימה
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
הנחה הפיזור האחיד הפשוט
h מפזרת את המפתחות באופן אחיד
m
m
n אורך ממוצע
של רשימה
ל זמן ממוצע חיפוש כוש
m
n 11
nOm)( אם נבחר
)1(O
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
18
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש כושל)משפט
=1+nm+1הזמן הממוצע לחיפוש כושל הוא
הרשימות m-בהנחת הפיזור האחיד הפשוט כל מפתח מגיע באקראי לאחת מ הוכחה
הזמן לחיפוש כושל הוא לפיכך הזמן הממוצע לחפש באחת הרשימות עד סופהbull
= n mאורכה הממוצע של רשימה בהנחת הפיזור האחיד הוא bull
(הכולל את זמן בדיקת המצביע בסוף הרשימה) + 1לפיכך בממוצע יידרש זמן bull
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19
ארבעה מצביעים
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash 19
ניתוח זמנים )המשך(
ותחת הנחת הפיזור האחיד הפשוטבשיטת השרשראות (חיפוש מוצלח)משפט
(הכנסה בראש הרשימש) 2=1+n(2m)+1חיפוש מוצלח הוא ל ממוצעההזמן
k1hellipknמפתחות שהוכנסו בסדר nנאמר שבזמן החיפוש ישנם הוכחהbull
kiמהו זמן חיפוש הממוצע של המפתח bull
מפתחות נוספים n-iאחרי מפתח זה נוספו bull
m(n-i)הוא kiלכן בממוצע גודל הרשימה משמאל למפתח bull
הוא kiמכאן שזמן החיפוש הממוצע של המפתח bull
(n-i)m 1+
למפתח כלשהו יהיה לפיכך tזמן החיפוש הממוצע bull
n
i m
in
nt
1
11
n
i
inmn 1
)(1
1
1
0
11
n
i
imn 2
)1(11
nn
mn
mm
n
2
1
21
2
11
1
2
3
4
5
6
7
8
0
9
62 12
53
17 37 57
19 kiהמפתח
kiלפני kiאחרי
בלוף לחיפוש מפתיח רנדומליממוצע ה
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
20
ניתוח זמנים )המשך(
בהם משתמשים הוא כגודל nכאשר סדר הגודל של מספר המפתחות לפיכך
ולכן = O(1)נקבל שגורם העומס קבוע כלומר n = O(m)כלומר עבור mהמערך
O(1)כל הפעולות דורשות זמן ממוצע
נאמר עד של מספרים שלמים Uמפתחות מטווח כלשהו =2100nעבור דוגמא
מקומות ובממוצע אורך כל שרשרת יהיה =700mנוכל להחזיק מערך ובו 106
3nm= וזמני החיפוש יהיוO(1)
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
21
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
מערך עם מימוש
שרשראות
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
-של המפתחות אחיד פיזור
פקטור העומס
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
1 זמן חיפוש כושל +119899
119898
1 חיפוש מוצלח זמן +119899
2119898
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
Open addressingשיטת
התנגשות
0
1
2
3
( )
( )
( )
( )
h x
h x
h x
h x
אלא כל האיברים לא נשתמש בשרשראות
יוכנסו לטבלה
(n m) le 1 פקטור העומס open addressing ברור שבשיטות
נבחן שלושה שיטות
סריקה ליניארית
ערבול נשנה
וערבול כפול
נהערבול Rehashing- נש
נניח שברשותנו סדרה אינסופית של helliph0h1h2 פונקציות ערבול
h0(x)במקום xננסה לשמור את
h1(x)ננסה במקום אם תפוס נמשיך עד שנצליח
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
0
1 0
2 1
3 2
4 3
( )
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
( ) ( ) 1
h x
h x h x
h x h x
h x h x
h x h x
Open addressingשיטת
Linear probingסריקה ליניארית
linear probing-- סריקה ליניארית
תפוס h(k)אם המקום המיועד
mשים במקום הבא מודולו
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash 24
דוגמא
12
57
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12
57 37
12
57 37 19
12
57 37
17
19
12 62
57 37
17
19
12 62 53
57 37
17
19
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash 25
linear probingהוצאה בשיטת כיצד נוציא איברים
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט
12 62 53
57 37
17
19
12 62 53
57
17
19
37 הוצא 17 חפש
לא ניתן פשוט למחוק איבר שכן שרשרת החיפוש תינתקbull
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
26
linear probingהוצאה בשיטת
1פתרון
והכנס את בזמן ההוצאה הוצא את כל האיברים עד לרווח הבא
כולם חזרה פרט לאיבר שרוצים להוציא
12 62 53
57
19 17
1
2 3
4
5
6 7
8
0
9
12 62 53
57 37
17
19
17 חפש 37 הוצא
12 62 53
57 37
17
19
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash 27
המציבההוצאה בשיטת
1
2 3
4
5
6 7
8
0
9
53 62 17 19 37 12 57
m = 10 h(k) = k mod m דוגמא
קלט12 62 53
57 37
17
19
נמשיך את סריקת deleteבמידה וניתקל בסימן x חיפושבזמן bull (Null -המסומן ב)או עד שנגיע למקום ריק xהרשימה עד למציאת
xנשתמש במקום זה לשמירת deleteבמידה וניתקל בסימן x הכנסתבזמן bull
( Null-המסומן ב)במקום הריק בסוף הרשימה xאחרת נשמור את
12 62 53
57 delete
17
19
17 חפש 37 הוצא
12 62 53
57 27
17
19
27 הכנס
נסמן את כדי לא לנתק את שרשרת החיפוש bull (שיטת המציבה ) deletedמקום האיבר שהוצא בסימן
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
Open addressingשיטת
Linear probingסריקה ליניארית
Insert(3)
Insert(7)
Insert(13)
Insert(33)
Search(43)
Delete(3)
Search(33) 3
7
13
33
Insert(43)
43
Search(73)
D
h(x) = x mod 10
דוגמא נוספת
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
0
1
2
3
4
5
6
7
8
9
m
n
אורך חיפוש ממוצע
nm
m
1
1
1 (1 )2
2(1 )3
מקום ראשון לא תפוס שני לא תפוס
שלישי לא תפוס
Open addressingשיטת
Linear probingסריקה ליניארית
מהו זמן הכנסה ממוצע
ההסתברות שמקום רנדומלי תפוס
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
30
יתרונות וחסרונות
hellipאבל הוא פשטות המציבההיתרון העיקרי של שיטת bull
אורך החיפוש תלוי גם באיברים שכבר הוצאו ולא רק כאשר השימוש דורש הוצאותbull
באיברים שכרגע במבנה
open addressing-נתאר כעת שיטות נוספות ל
שיטות אלו שימושיות במיוחד במימושי מילון ללא הוצאות
הרשימות המקושרות עדיפה שיטת כאשר יש צורך בהוצאות
דוגמאות לשימוש במילון ללא הוצאות
(Symbol Table)טבלה של שמות משתנים בהרצת תוכנית bull
מספרי תעודות זהות אינם ממוחזרים bull
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
31
נהערבול Rehashing- נש
helliph0h1h2 נניח שברשותנו סדרה אינסופית של פונקציות ערבול
h0(x)במקום xננסה לשמור את
נמשיך עד שנצליח h1(x)ננסה במקום אם תפוס
hi(x) = h(x) + i היא מקרה פרטי בו( linear probing)סריקה ליניארית
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
32
Double Hashing--ערבול כפול
d hי שתי פונקציות בלבד נגיע לתוצאות דומות לערבול נשנה ע
hi(x) = h(x) + i d(x) כאשר
נבחרות באופן בלתי תלוי d hהפונקציות
mלגודל הטבלה d(x)מהו היחס הרצוי בין
deleteי שימוש בסימון הוצאות נעשות ע
תכסה את hm-1(x) helliph0(x)צריכים להיות מספרים זרים כך ש d(x) -גודל הטבלה ו
m-1hellip0האינדקסים האפשריים בתחום כל
להיות מספר ראשוני mלפיכך נוח לבחור את
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
33
Rehashingניתוח זמנים עבור
היא פרמוטציה (h0(x)h1(x)h2(x)helliphm-1(x))הסדרה הנחת הפיזור האחיד
(m-1hellip0)אקראית של
מתקיים rehashingבשיטת ערבול בהנחת הפיזור האחיד משפט
( - 1)1 -זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
1
1
1ln
1
Introduction to algorithms Cormen et al pp 238-239 הוכחה בספר הלימוד
גורם העומס חיפוש כושל חיפוש מוצלח
3386 2 05
3 261 5 08
3669 10 09
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
34
ניתוח זמנים עבור סריקה ליניארית בהנחת הפיזור האחיד הפשוט משפט
בסריקה ליניארית מתקיים open addressingבשיטת ערבול
-זמן ממוצע של חיפוש כושל קטן מ
-זמן ממוצע של חיפוש מוצלח קטן מ
Knuth The art of computer programming Vol 3 1973 הוכחה בספר
כל עוד הטבלה המשפט מראה שאפשר להשתמש בסריקה ליניארית מסקנה
(80)לא מלאה מדי
)1(112
1
2)1(112
1
סריקה ליניארית
חיפוש מוצלח
סריקה ליניארית
לחיפוש כוש
ערבול נשנה
חיפוש מוצלח
ערבול נשנה
לחיפוש כוש גורם
העומס
15 25 1836 2 05
30 130 3261 5 08
55 505 3669 10 09
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
35
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
הנחה
119874(1)
הנחה
119874(1)
הנחה
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
פיזור אחיד
הנחה
פיזור אחיד
הנחה
פיזור אחיד
הנחה
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
36
פונקציות ערבול
מפזרת היטב וקלה לחישוב דרישות מפונקציות ערבול
m h(x) = x mod mשיטת החילוק מודולו
m-רצוי ש
פונקצית הערבול מסתמכת רק על 2בחזקות של 10או 2לא יהיה חזקה של
log2(m) הביטים הראשונים(LSB) פונקצית הערבול מסתמכת בחזקות של עשר
רצוי שפונקציות הערבול ישתמשו בכל הספרות הראשונות log10(m)רק על
האינפורמציה הנמצאת במפתח כדי לקרב עד כמה שניתן את הנחת הפיזור
האחיד
גורמות לפיזור לא 2חזקות קרובות של 2יהיה ראשוני שאינו קרוב לחזקה של
למשל מחרוזות תווים 2אחיד כאשר המפתחות כתובים בבסיס שהוא חזקה של
256 = 28נכתבות בבסיס
רצוי לבדוק את פונקצית הערבול על תת קבוצה של מפתחות הערה
וכך לוודא שהנחת הפיזור האחיד מתקיימת בקרוב אמיתיים
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
37
(המשך) פונקציות ערבול
a gt0lt 1שיטת הכפל בקבוע
aבקבוע kהכפל את המפתח bull
מצא את החלק השבור של התוצאהbull
h(k) = m (ak mod 1) ועגל כלפי מטה m -הכפל את החלק השבור בbull
אינו קריטי mהערך של
הגורם לפיזור טוב הוא aערך של 618030215 a
m = 10000 k = 123456דוגמא
h(k) = 10000 (123456 061803 mod 1)
= 10000 (763000041151 mod 1)
= 10000 00041151
= 41151 hellip = 41
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
38
(Hashing)ערבול
ערבולפונקציית
ℎ 119880 rarr 12 hellip 119898 Direct
Addressing
Open Addressing
מערך עם מימוש
שרשראות
מערך
ℎזמן חישוב 119896
119874(1)חייב להיות
119874(1)
119874(1) 119874(1)
-של המפתחות אחיד פיזור
120572 פקטור העומס = 119899119898
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
החילוק שיטת
שיטת הכפל
119909 כאשר התנגשויות ne 119910
ℎ(119909)אבל = ℎ(119910)
שרשראות
chaining
Rehash Linear probing
Double Hashing
Rehash
אחיד פיזור
1 זמן חיפוש כושל + 120572 1
21 +
1
1 minus 120572 2
1
1 minus 120572
1 חיפוש מוצלח זמן +120572
2 1
21 +
1
1 minus 120572
1
120572ln
1
1 minus 120572+
1
120572
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
39
פונקציות ערבול למחרוזות ארוכות
h(ldquoaardquo) = h( (0110 0001) xor (0110 0001)) = (0000 0000) = 0 חסרון ראשון
hldquobbrdquo) = h( (0110 0010) xor (0110 0010)) = (0000 0000) = 0
hldquoabccbardquo) = 0התוצאה אפס מתקבלת כאשר כל אות מופיעה מספר זוגי של פעמים
ardquo = 97 = 0110 0001 asciirdquoנשתמש בקוד
rdquobrdquo = 98 = 0110 0010
hellip וכך הלאה
ביט ביט xorבצע פתרון נאיבי
h(ldquoabrdquo) = h( (0110 0001) xor (0110 0010)) = (0000 0011) = 3 לדוגמא
h(x) 255טווח הערכים מוגבל חסרון שני
ascii(s0) xor hellip xor ascii(sk) (h(s0hellip sk= בצע s0hellip skבהינתו מחרוזת
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
40
(המשך)פונקציות ערבול למחרוזות ארוכות
T[0]של המפתח והערך s0בין האות הראשונה xorבצע
255hellip0נמצאת בתחום a1התוצאה
-היא תוצאת ה aiכאשר T[ai]של המפתח והערך siבין האות xorבצע i-בשלב הxor בשלב הקודם
עם האות האחרונה של המפתח כלומר xor-תוצאת פונקצית הערבול היא תוצאת ה
hash(key) = sn xor T[an]
hash(aa) = T[ hash(a) ] xor a = T[118] xor 97
0001 01111 xor 0110 0001 = 0111 0110 = 118
= 0010 0110 xor 0110 0001 = 71
hash(aa) 38 דוגמא
23 0
118
T
hash(a) = T[0] xor 97 =
בשיטה זו נפתרה בעיית האותיות המופיעות מספר זוגי של פעמים הערה
פתרון עדיף
Tואחסן אותה במערך 255hellip0של (0hellip 255)בחר פרמוטציה אקראית
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
41
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 207 96 211 161 216 197 94 123 104 150 210 84 203 99 133 112
0001 113 58 21 142 57 31 228 25 220 37 48 181 53 63 186 235
0010 169 42 221 60 234 79 170 80 141 120 191 33 7 229 39 196
0011 85 10 202 41 16 178 30 193 20 219 166 165 214 177 43 251
0100 230 182 29 121 206 109 157 46 2 65 38 27 122 236 126 212
0101 135 55 187 108 71 3 93 130 117 110 240 98 245 23 200 15
0110 217 24 116 4 74 174 129 14 247 102 111 252 115 73 136 244
0111 145 198 49 128 34 66 45 103 1 64 254 8 152 255 224 146
1000 223 35 134 32 147 44 97 164 243 83 88 175 253 56 225 89
1001 119 158 163 127 19 26 179 13 54 87 18 226 67 61 238 162
1010 201 222 107 154 81 77 82 78 239 159 241 153 250 68 125 237
1011 90 199 9 143 22 114 0 70 75 36 106 248 44 249 246 195
1100 91 213 137 69 185 232 62 17 227 173 11 183 144 5 124 231
1101 208 12 149 156 190 6 139 40 160 194 138 176 242 184 155 204
1110 192 172 180 47 132 209 167 205 76 233 59 215 50 218 189 100
1111 52 171 101 151 131 72 28 92 140 118 105 95 86 168 148 51
[10000110] 97 01100001T
hash(dat) דוגמא
[00000100] 216 11011000T
( ) [00000000] xor ( ) 11001111xor01100100 10101011hash d T ascii d
[00000000] 207 11001111T
( ) [ ( )] xor ( ) 10011001xor01100001 11111000hash da T hash d ascii a
[10101011] 153 10011001T
( ) [ ( )] xor ( ) 10001100 xor01110100 11111000hash dat T hash da ascii t
דוגמא
[11111000] 140 10001100T
( ) 11111000 248hash dat
ascii symbol
0110 0001 a
0110 0010 b
0110 0011 c
0110 0100 d
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
42
(המשך)פונקציות ערבול למחרוזות ארוכות
מימוש של פונקצית הערבול
int hash(char s)
int h = 0
char p
for (p=s p p++)
h = T[h]^ p Xor
return h
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
43
(המשך)פונקציות ערבול למחרוזות ארוכות
ולשרשר T1 T2כדי להתגבר על בעיית הטווח ניתן להשתמש בשתי פרמוטציות
את התוצאות
hash(k) = [hash1(k) hash2(k)] = hash1(k) 256 + hash2(k)
בעוד )216 = 2562 65536=הוא כלומר גודל טבלת הערבול גודל הטווח החדש
(256הוא Tiגודל כל
י שימוש במספר קטן של פרמוטציות נוספותניתן להגיע לטווח הרצוי ע
לאות הראשונה של 1נוסיף hash2תוצאה דומה מתקבלת אם במקום
hash1בפונקצית הערבול המחרוזת ונשתמש שוב
hash(acb) = hash1(acb) 256 + hash1(bcb) לדוגמא
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash 44
ערבול אוניברסלי
תכונה זו יכולה ליצור בעיה
יתכן מתכנת המשתמש באופן עקבי בשמות מסוימים למשתני התוכניות שהוא כותב ולצערו דוגמא
ל לאותו המקום בטבלת הערבולממפה את כל השמות הנ symbol table-פונקצית הערבול הבונה את ה
של משתמש זה אינה יעילה כפי שיכולה הייתה להיות כל תוכנית מחשבלפיכך
נקראת Hהקבוצה m-1hellip0 לקבוצה Uקבוצת פונקציות ערבול מתחום Hתהי הגדרה
הוא h(x) = h(y)מספר הפונקציות עבורן xy Uאם לכל זוג מפתחות שונים אוניברסלית
|H|m
פונקצית ערבול מתוך קבוצת פונקציות שהוגדרה בזמן יצירת טבלת ערבול לבחור באקראי הפתרון
בחירה אקראית של אחת שעבור כל סדרת מפתחות נרצה שקבוצת הפונקציות תהיה כזו מראש
הפונקציות תיצור פיזור טוב
לכל בחירה של פונקצית ערבול קיימת סדרה גרועה של מפתחות כך שתווצר רשימה באורך מקסימלי
כ נראה כיצד לבנות קבוצה כזואח נראה כעת ששימוש בקבוצה אוניברסלית גורם לפיזור טוב
H אקראית של פונקצית ערבול מתוך שבבחירה p ההסתברותy-ו xלכל זוג מפתחות אבחנה
p = (|H|m)|H| = 1mהיא y-ו x תהיה התנגשות בין
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
45
(המשך)ערבול אוניברסלי
h אם m בגודל Tקבוצה אוניברסלית של פונקציות ערבול לתוך טבלה H תהי משפטהמספר הצפוי אזי לכל מפתח מפתחות כלשהם n ונשתמש בה לערבול H נבחרהבאקראי מתוך
m = α-1m(n-1)-התנגשויות בשיטת הרשימות המקושרות שווה ל של
p = 1m היא y עם מפתח מסוים x ראינו שההסתברות להתנגשות של מפתח מסוים הוכחה
יעם מפתח כלשהו נתון לפיכך ע x המספר הצפוי של התנגשויות של מפתח מסוים
|
1
xyTy mL
מספר ההתנגשויות הצפוי לכל מפתח קטן מגורם העומס מסקנה
mm
n 11
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
46
בניית קבוצה אוניברסלית
m נבחר את גודל הטבלה להיות מספר ראשוני
(ביטים 8 =למשל באורך בייט ) x = [ x0hellipxr] חלקים באורך קבוע r + 1 -ל x נשבור כל מפתח
m יהיה לכל היותר xi מספר הביטים יבחר כך שהערך של
הבאה בצורה ha(x) נגדיר פונקצית ערבול r+1 m-10 מהתחום a = [a0hellipar] לכל סדרה
mxaxh i
r
i
ia mod)(0
mr+1 ומספר הפונקציות בקבוצה זו הוא a ha מוגדרת להיות H קבוצת הפונקציות
a נגריל מספר m בגודל T נקצה טבלת ערבול דרך השימוש בשיטה זו
לכל הפעולות ha ונשתמש בפונקצית הערבול
ביטים 8נשבור כל מפתח לשלושה חלקים באורך 0-224 טווח המפתחות m=257 דוגמא a=[248223 101]נניח שהוגרלו המספרים
x = 1025 =00000000 00000100 00000001 = 428 +120 = [041]בהינתן המפתח
נחשב
(2480 + 2234 + 1011) mod 257 = 993 mod 257 = 222
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
47
(המשך)בניית קבוצה אוניברסלית
שהוגדרה בשקף הקודם היא קבוצה אוניברסלית H = ha קבוצת הפונקציות משפט
x0y0 ללא הגבלת הכלליות נניח מפתחות שונים y = [y0hellipyr] -ו x = [x0hellipxr] יהיו הוכחה
מתקבל a הערך ha(x)=ha(y) כך שמתקיים a0-קיים ערך יחיד ל a1hellipar אנו טוענים שלכל בחירה של
מהפתרון היחיד למשוואה
)(mod0)()()(0
myxayhxhr
i
iiiaa
)(mod)()(1
000 myxayxar
i
iii
כדלקמן לשכתובהניתנת
mr+1הוא H-נזכור שמספר הפונקציות ב
כנדרש מקבוצה אוניברסלית mrmr+1 = 1m יתנגשו היא y-ו x-ההסתברות ש לפיכך
שכן לכל ערך של a ערכים של mr עבור מתנגשים xy נובע שכל זוג מפתחות בהנחה שהטענה נכונה
(a1hellipar) קיים ערך אחד a0 עבורו xy מתנגשים
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
48
(המשך)בניית קבוצה אוניברסלית
)(mod)()(1
000 myxayxar
i
iii
יחיד w קיים מספר( 0שאינו ) z עבור כל מספר ראשוני מתקיים m נזכר שכאשר
יחיד( כפלי)לכל מספר הופכי במילים אחרות z w = 1 (mod m) ש כך
2 = 1 (mod 3) 1 1 = 1 (mod 3) 2 למשל
למשוואה הבאה יש פתרון והפתרון יחיד טענה
z = x0 ndash y0 0במשוואה הנתונה
a0-ונקבל את הפתרון היחיד ל zנכפיל את המשוואה בהופכי של
)(mod)()( 1
00
1
0 myxyxaar
i
iii
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
49
מגבלות לערבול
(n)צריך לדעת מראש סדר גודל למספר האיברים שמתעתדים להכניס למבנה
כאשר טבלת ערבול מתמלאת ניתן להקצות טבלה חדשה בגודל כפול פתרון חלקי
ולהיפטר מהטבלה הישנה להכניס את כל האיברים לטבלה החדשה
n 2n
4n
למרות שמדי פעם תתבצע פעולה יקרה O(1)הזמן המשוערך הממוצע יהיה
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע
Hash
csTechnion
50
Element Uniquenessבעיית היחידות שימוש
0 x0hellipxn-1 lt Tנתונים מספרים
xi = xj עבורו ijמצא אם קיים
O(n log n) זמן מיון ndash פתרון ראשון
ערבול ndash פתרון שני
O(n)הכנס את המספרים לטבלת ערבול בגודל
( T-שיתכן וקטנה בהרבה מ)
בדוק שוויון בזמן התנגשות
O(n)זמן ממוצע