007.class8_Heap_Hash
Download
Report
Transcript 007.class8_Heap_Hash
מבני נתונים
שיעור – 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)
p0
repeat
c A[i]
if c =
return null
else if c.key () = k
return c.element()
else
i (i + 1) mod N
pp+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