50
Hash ערבול(Hashing) חומר קריאה לשיעור זה: Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure www.cs.technion.ac.il/~dang/courseDS Geiger & Itai, 2001

Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 2: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 3: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 4: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 5: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 6: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 7: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 8: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 9: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 10: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 11: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 12: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 13: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 14: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 15: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 16: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 17: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 18: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 19: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 20: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 21: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 22: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 23: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 24: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 25: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 26: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 27: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 28: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 29: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 30: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 31: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 32: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 33: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 34: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 35: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 36: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 37: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 38: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 39: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 40: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 41: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 42: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 43: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 44: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 45: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 46: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 47: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 48: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 49: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

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)זמן ממוצע

Page 50: Hash (Hashing) ר - cs.technion.ac.ilbshouty/DS/Lec7-WWW/Lec7.pdf · Hash (Hashing) ר Chapter 12- Hash tables (pages 219—243) Lecture7 of Geiger & Itai’s slide brochure dang/courseDS

Hash

csTechnion

50

Element Uniquenessבעיית היחידות שימוש

0 x0hellipxn-1 lt Tנתונים מספרים

xi = xj עבורו ijמצא אם קיים

O(n log n) זמן מיון ndash פתרון ראשון

ערבול ndash פתרון שני

O(n)הכנס את המספרים לטבלת ערבול בגודל

( T-שיתכן וקטנה בהרבה מ)

בדוק שוויון בזמן התנגשות

O(n)זמן ממוצע