007.class8_Heap_Hash

advertisement
‫מבני נתונים‬
‫שיעור ‪ – 8‬ערמה )‪(Heap‬‬
‫טבלאות ערבול )‪(Hash Tables‬‬
‫ערמה ‪Heap‬‬
‫• ערמת מינימום הינה עץ בינארי המקיים את התנאים‪:‬‬
‫‪ .1‬מפתח הורה =< מפתח בנים (=> בערמת מקסימום)‬
‫‪ .2‬העץ חייב להיות מלא לשמאל‪ ,‬כלומר כל העלים הם‬
‫מאותה רמה‪ ,‬או שמימין עומק העלים נמוך ב‪1‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪20‬‬
‫‪8‬‬
‫‪9‬‬
‫‪11‬‬
‫‪12‬‬
‫‪15‬‬
‫‪14‬‬
‫‪25‬‬
‫‪16‬‬
‫‪2‬‬
‫ערמה או לא?‬
‫‪3‬‬
‫ערמה לעומת עץ חיפוש בינארי‬
‫•‬
‫•‬
‫•‬
‫•‬
‫בעץ חיפוש בינארי מפתח הבן השמאלי קטן‬
‫מההורה והימני גדול ממנו‬
‫בערמה מפתח ההורה גדול (או קטן) שווה לבניו‬
‫עץ בינארי אין אילוץ להיות מלא לשמאל‬
‫גובה ערמה עם ‪ n‬איברים הוא ‪h = log(n + 1) :‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪20‬‬
‫‪8‬‬
‫‪9‬‬
‫‪11‬‬
‫‪12‬‬
‫‪15‬‬
‫‪14‬‬
‫‪25‬‬
‫‪16‬‬
‫‪4‬‬
‫פעולות על ערמה‬
‫• ניתן להכניס ערך כלשהו לערמה ‪insert‬‬
‫• ניתן להוציא רק את הערך בשורש (הקטן ביותר‬
‫בערמת מינימום או הגדול ביותר בערמת‬
‫מקסימום)‬
‫‪5‬‬
‫פעולת הכנסה ‪insert‬‬
‫• פעולת הכנסת איבר מורכבת משני שלבים‪:‬‬
‫‪ .1‬הכנסת האיבר למקום הפנוי הבא (הראשון‬
‫משמאל)‬
‫‪ .2‬תיקון הסדר על מנת לשמור על החוקיות‪ .‬פעולה‬
‫הכוללת השוואת המפתח של האיבר הנכנס עם‬
‫ההורה עד הגעה למיקום המתאים‪ .‬פעולה זו‬
‫‪2‬‬
‫נקראת ‪Upheap‬‬
‫‪6‬‬
‫‪5‬‬
‫‪z‬‬
‫‪7‬‬
‫מיקום הכנסה‬
‫‪9‬‬
‫‪6‬‬
‫הכנסת איבר ‪ -‬דוגמא‬
‫הכנסת איבר עם מפתח ‪6‬‬
‫‪7‬‬
‫הכנסת איבר ‪ -‬דוגמא‬
‫הכנסת איבר עם מפתח ‪6‬‬
‫שלב ‪ :1‬הכנסה למקום הפנוי הבא‬
‫‪8‬‬
‫הכנסת איבר ‪ -‬דוגמא‬
‫הכנסת איבר עם מפתח ‪6‬‬
‫שלב ‪ :2‬תיקון ‪Upheap‬‬
‫הכנסת איבר ‪ -‬דוגמא‬
‫הכנסת איבר עם מפתח ‪6‬‬
‫שלב ‪ :2‬כל עוד ערך‬
‫המפתח ‪ 6‬קטן מההורה‬
‫ממשיכים לעלות‬
‫הכנסת איבר ‪ -‬דוגמא‬
‫הכנסת איבר עם מפתח ‪6‬‬
‫סיום ‪Unheap‬כאשר מגיעים לשורש או נתקלים בהורה‬
‫עם מפתח קטן יותר (אך לא שווה)‬
‫פעולת מחיקה ‪delete‬‬
‫• פעולת המחיקה מוגבלת לשורש בלבד‪ .‬הפעולה‬
‫מורכבת משלושה שלבים‪:‬‬
‫‪ .1‬החלפת האיבר האחרון עם השורש‬
‫‪ .2‬מחיקת האיבר האחרון‬
‫‪ .3‬תיקון הסדר על מנת לשמור על החוקיות‪ .‬הפעולה‬
‫מתחילה מהשורש ומחליפה עם הבן בעל המפתח‬
‫הקטן עד הגעה למיקום המתאים‪ .‬פעולה זו נקראת‬
‫‪Downheap‬‬
‫‪12‬‬
‫מחיקת ערך ‪ -‬דוגמא‬
‫החלפת השורש (‪ )3‬עם האיבר האחרון (‪)20‬‬
‫ומחיקת האחרון (לאחר ההחלפה)‬
‫מחיקת ערך ‪ -‬דוגמא‬
‫• התחל תיקון ‪Downheap‬‬
‫מחיקת ערך ‪ -‬דוגמא‬
‫מחיקת ערך ‪ -‬דוגמא‬
‫מחיקת ערך ‪ -‬דוגמא‬
‫• סיום פעולת ‪ Downheap‬כאשר‪:‬‬
‫– הגענו לעלה‬
‫– מפתח ההורה קטן משני בניו‬
‫למה זה טוב?‬
‫•‬
‫•‬
‫•‬
‫•‬
‫מימוש תור עם עדיפויות‪.‬‬
‫הכנסת איבר ע"פ עדיפותו (מפתח)‬
‫הוצאת איבר הבא עם עדיפות מינימלית‬
‫(השורש בערמת מינימום)‬
‫דוגמא‪ :‬הכנס את האיברים בעלי העדיפויות‬
‫‪ 3,2,1,2‬והוצא אותם באמצעות ‪delete‬‬
‫‪18‬‬
‫טבלאות ערבול ‪ /‬גיבוב‬
‫• טבלאות ערבול הינן מבני נתונים המבוססים על‬
‫מיפוי ערכי המפתחות ע"י פונקציה מתמטית‬
‫• מבנה נתונים מהיר המאפשר גישה ישירה‬
‫לנתונים‪ ,‬הכנסת איבר וחיפוש מיידי ))‪(O(1‬‬
‫• טבלאות ערבול מבוססות על מערכים (חסרון‬
‫של גודל ידוע מראש)‬
‫‪19‬‬
‫מדוע?‬
‫• נניח שרוצים לאחסן את סדרת האובייקטים‬
‫בעלי המפתחות הבאים‪12,120,34,1145,64 :‬‬
‫• הבא נבחן את האופציות העומדות לרשותנו‪:‬‬
‫–‬
‫–‬
‫–‬
‫–‬
‫–‬
‫מערך‬
‫מערך ממויין‬
‫תור‪/‬מחסנית‬
‫רשימה מקושרת‬
‫עץ חיפוש בינארי‬
‫‪20‬‬
‫מערך‬
‫• ניתן להכנים בקלות ופשטות לאינדקס הראשון‬
‫הפנוי (מיידי)‬
‫• חיפוש ערך מסוים מצריך מעבר על כל הנתונים‬
‫והשוואה לערך המבוקש‬
‫‪21‬‬
‫מערך ממויין‬
‫• הכנסה במיקום המתאים‪ :‬דורש מעבר על‬
‫האיברים עד מציאת המיקום המתאים‬
‫• חיפוש ערך מסוים פשוט יותר ממערך לא‬
‫ממויין‪ ,‬אך עדיין מצריך מעבר על הנתונים‬
‫והשוואה לערך המבוקש (אם כי ניתן לבצע‬
‫ביעילות יחסית עקב הסדר)‬
‫• יתרון במידה ומעוניינים לעבור על כל האיברים‬
‫ע"פ סדר מסוים‬
‫‪22‬‬
‫תור ‪ /‬מחסנית‬
‫• מבנים מוגבלים ביותר כאשר מעוניינים לבצע‬
‫חיפוש של ערך‬
‫• יש להוציא ערכים רק ע"פ הסדר המוגדר‬
‫• מבנים אלו שימושיים במימושים ספציפיים כמו‬
‫שהוזכרו‬
‫‪23‬‬
‫רשימה מקושרת‬
‫• הכנסה מהירה‬
‫• חיפוש ערך דורש מעבר על כל הנתונים‬
‫• למעשה כמו מערך אך מאפשר דינאמיות בגודל‬
‫‪24‬‬
‫עץ חיפוש בינארי‪/‬ערמה‬
‫• הכנסת ערכים בהתאם לסדר והחוקיות‬
‫• חיפוש ערך יעיל יותר מרשימה או מערך אך‬
‫עדיין יש צורך לבצע מעבר על הענפים והשוואה‬
‫לערך המבוקש‬
‫• יתרון במידה ומעוניינים לעבור על כל האיברים‬
‫ע"פ סדר מסוים‬
‫‪25‬‬
‫מצב היפוטתי ‪1‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫נניח והאובייקטים אותם אנו מעוניינים לאחסן‬
‫הם בעלי המפתחות‪1,2,3,4,5,6,7 :‬‬
‫נניח שאילו כל הנתונים שיש להכניס‬
‫נוכל להגדיר מערך באורך ‪ 7‬ולהכניס את איבר‬
‫עם מפתח ‪ 1‬למיקום ‪ ,1‬וכך את כל שאר‬
‫האיברים בהתאם למפתח שלהם‬
‫כך יהיה לנו מבנה נתונים מושלם כמעט‬
‫המאפשר חיפוש מיידי‪ :‬איבר עם מפתח ‪ i‬יימצא‬
‫‪26‬‬
‫באינדקס ‪ i‬במערך‬
‫מצב היפוטתי ‪2‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫נניח והאובייקטים אותם אנו מעוניינים לאחסן הם‬
‫בעלי המפתחות‪2,4,6,8,10,12,14 :‬‬
‫נניח שאילו כל הנתונים שיש להכניס‬
‫נוכל להגדיר מערך באורך ‪ 7‬ולהכניס את איבר‬
‫עם מפתח ‪ 2‬למיקום ‪ ,1‬וכך את כל שאר‬
‫האיברים בהתאם‪ :‬איבר עם מפתח ‪ i‬לאינדקס‬
‫‪i/2‬‬
‫ומה אם המפתחות היו‪?2,4,8,16,32,64,128 :‬‬
‫‪ ?12,120,34,1145,64‬האם קיימת נוסחאת‬
‫‪27‬‬
‫הפלא?‬
‫דוגמא למצב היפוטטי אמיתי‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫בסיס נתונים בחברה עם ‪ 1000‬עובדים‬
‫כל עובד שנקלט לחברה מקבל מספר עובד ייחודי‬
‫ע"פ סדר קליטת העובד‬
‫המייסד מס ‪ 1‬והעובד האחרון מספרו ‪1000‬‬
‫במקרה זה ניתן להשתמש בערכי המפתחות‬
‫ישירות כאינדקס למערך העובדים‬
‫האם היינו יכולים להשתמש בת"ז העובדים במקום‬
‫מס העובד? באיזה מחיר של נפח אחסון?‬
‫‪28‬‬
‫מגבלות בשימוש ישיר במפתח‬
‫• המפתח חייב להיות ייחודי‬
‫• על תחום המפתחות להיות צר אחרת המערך‬
‫יהיה גדול בהרבה ממספר הרשומות‬
‫• על המפתחות להיות דחוסים בתחום הצר‪ ,‬אם‬
‫יש הרבה מרווחים בינהם זה מוריד את יעילות‬
‫האחסון‬
‫‪29‬‬
‫טבלת ערבול‬
‫• טבלת ערבול מבצעת פעולה חשבונית על‬
‫המפתחות כדי להגיע למצב הדומה למצב‬
‫האופטימלי שראינו קודם‬
‫• במקרים אילו (לרוב לא נוכל להשתמש בערכי‬
‫המפתחות ישירות כאינדקסים)‬
‫• המטרה‪ :‬למפות את ערכי המפתחות לתחום צר‬
‫של ערכים טבעיים (המתאימים לאינדקסים)‬
‫‪30‬‬
‫פונקציות ערבול‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫ישנן דרכים רבות לבצע את המיפוי‬
‫פונקציות ערבול רבות מבוססות על פעולת‬
‫השארית השלמה )‪(MOD %‬‬
‫אם נפעיל על ערכי המפתחות ‪ MOD X‬נמפה‬
‫אותם לתחום ערכים צר בגודל ‪X‬‬
‫דוגמא‪1,102,855,78,1521 MOD 10:‬‬
‫חסרון‪ :‬כפילויות‪/‬התנגשויות‬
‫‪31‬‬
‫טבלאות ערבול‬
‫פונקציות ערבול‬
A hash function h maps keys of a given type to
integers in a fixed interval [0, N - 1]
Example:
h(x) = x mod N
is a hash function for integer keys
The integer h(x) is called the hash value of key x
A hash table for a given key type consists of
 Hash function h
 Array (called table) of size N
When implementing a map with a hash table, the goal
is to store item k at index i = h(k)
Example
0 
1
2
3 
4
025-612-0001
981-101-0002
451-229-0004
…
We design a hash table for
a map storing entries as
(SSN, Name), where SSN
(social security number) is a
nine-digit positive integer
Our hash table uses an
array of size N = 10,000 and
the hash function
h(x) = last four digits of x
9997 
9998
9999 
200-751-9998
Hash Functions ‫פונקציות ערבול‬
A hash function is usually
specified as the
composition of two
functions:
Hash code:
h1: keys  integers
Compression function:
h2: integers  [0, N - 1]
The hash code is
applied first, and the
compression function
is applied next on the
result, i.e.,
h(x) = h2(h1(x))
The goal of the hash
function is to
“disperse” the keys in
an apparently random
way
Compression Functions examples
Division:
 h2 (y) = y mod N
 The size N of the
hash table is usually
chosen to be a prime
 The reason has to do
with number theory
and is beyond the
scope of this course
Multiply, Add and
Divide (MAD):
 h2 (y) = (ay + b) mod N
 a and b are
nonnegative integers
such that
a mod N  0
 Otherwise, every
integer would map to
the same value b
Example Hash Function
0
hf(22) = 22
22 % 7 = 1
1
tableEntry[1]
2
3
hf(4) = 4
4%7=4
4
5
6
tableEntry[4]
Example Hash Function
22%7 = 1
hf(22) = 22
36%7 = 1
hf(36) = 36
4%7 = 4
hf(4) = 4
0
1
2
3
4
5
6
tableEntry[1]
tableEntry[4]
‫טיפול בהתנגשויות‬
Collisions occur when
different elements are
mapped to the same
cell
Separate Chaining:
let each cell in the
table point to a linked
list of entries that map
there
0 
1
2 
3 
4
025-612-0001
451-229-0004
981-101-0004
Separate chaining is
simple, but requires
additional memory
outside the table
Chaining with Separate Lists - Example
< b u ck et 0 >
< b u ck et 1 >
< b u ck et 2 >
. . . .
< b u ck et n - 1 >
Keys:
54, 77, 94, 89, 14, 45, 35, 76
Function: MOD 11
< B uc k e t 0 >
7 7 (1 )
< B uc k e t 1 >
8 9 (1 )
< B uc k e t 2 >
3 5 (1 )
< B uc k e t 3 >
1 4 (1 )
4 5 (2 )
< B uc k e t 4 >
< B uc k e t 5 >
< B uc k e t 6 >
9 4 (1 )
< B uc k e t 7 >
< B uc k e t 8 >
< B uc k e t 9 >
< B uc k e t 1 0 >
5 4 (1 )
7 6 (2 )
Linear Probing ‫סריקה לינארית‬
• Open addressing: the colliding
item is placed in a different cell
of the table
• Linear probing handles
collisions by placing the
colliding item in the next
(circularly) available table cell
• Each table cell inspected is
referred to as a “probe”
• Colliding items lump together,
causing future collisions to
cause a longer sequence of
probes
Example:
 h(x) = x mod 13
 Insert keys 18, 41, 22, 44,
59, 32, 31, 73, in this order
0 1 2 3 4 5 6 7 8 9 10 11 12
41
18 44 59 32 22 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
h(x)=x%11 ‫סריקה לינארית – דוגמא‬
0
77
1
0
77
1
0
77
1
0
77
1
1
89
1
1
89
1
1
89
1
1
89
1
2
45
2
2
45
2
2
45
2
3
14
1
3
14
1
3
14
1
35
3
4
35
3
5
76
7
6
94
1
54
1
2
3
14
1
4
4
4
5
5
5
6
94
1
6
94
1
6
94
1
7
7
7
7
8
8
8
8
9
9
9
9
10
54
1
In s ert
54, 77, 94, 89, 14
(a)
10
54
In s ert
45
(b )
1
10
54
In s ert
35
(c)
1
10
In s ert
76
(d )
‫חיפוש בסריקה לינארית‬
Consider a hash table A that
uses linear probing
get(k)
 We start at cell h(k)
 We probe consecutive
locations until one of the
following occurs
 An item with key k is
found, or
 An empty cell is found,
or
 N cells have been
unsuccessfully probed
Algorithm get(k)
i  h(k)
p0
repeat
c  A[i]
if c = 
return null
else if c.key () = k
return c.element()
else
i  (i + 1) mod N
pp+1
until p = N
return null
Updates with Linear Probing
To handle insertions and
deletions, we introduce a
special object, called
AVAILABLE, which replaces
deleted elements
remove(k)
 We search for an entry
with key k
 If such an entry (k, o) is
found, we replace it with
the special item
AVAILABLE and we
return element o
 Else, we return null
put(k, o)
 We throw an exception if
the table is full
 We start at cell h(k)
 We probe consecutive cells
until one of the following
occurs
 A cell i is found that is
either empty or stores
AVAILABLE, or
 N cells have been
unsuccessfully probed
We store entry (k, o) in cell
i
Double Hashing ‫ערבול כפול‬
Double hashing uses a
secondary hash function d(k)
and handles collisions by
placing an item in the first
available cell of the series
(h(k) + jd(k)) mod N
for j = 0, 1, … , N - 1
The secondary hash function
d(k) cannot have zero values
The table size N must be a
prime to allow probing of all
the cells
Common choice of
compression function for the
secondary hash function:
d (k) = q - k mod q
where
 q<N
 q is a prime
The possible values for
d (k) are
1, 2, … , q
Example of Double Hashing
Consider a hash table
storing integer keys that
handles collision with
double hashing
 N = 13
 h(k) = k mod 13
 d(k) = 7 - k mod 7
Insert keys 18, 41, 22,
44, 59, 32, 31, 73, in this
order
k
18
41
22
44
59
32
31
73
h (k ) d (k ) Probes
5
2
9
5
7
6
5
8
3
1
6
5
4
3
4
4
5
2
9
5
7
6
5
8
10
9
0
0 1 2 3 4 5 6 7 8 9 10 11 12
31
41
18 32 59 73 22 44
0 1 2 3 4 5 6 7 8 9 10 11 12
‫חסרונות טבלת ערבול‬
‫•לא ניתן לעבור על כל האיברים (סריקה) ע"פ‬
‫סדר מסוים‪.‬‬
‫•מהירות על חשבון נפח אחסון‪.‬‬
‫•מבוסס על מערך – אילוץ גודל‪.‬‬
‫‪46‬‬
‫דוגמא‬
‫• יש לבנות מערך‪ ,‬מערך ממוין‪ ,‬רשימה מקושרת‪,‬‬
‫עץ חיפוש בינארי וטבלת ערבול מהסטודנטים‬
‫הלומדים בכיתה ע"פ מפתח ת"ז‬
‫• ברשימת הערבול נשתמש בשתי הספרות‬
‫האחרונות של הת"ז (פונקציית הערבול)‬
‫‪47‬‬
Download