470 likes | 716 Views
מבני נתונים. שיעור 8 – ערמה (Heap) טבלאות ערבול (Hash Tables). ערמה Heap. ערמת מינימום הינה עץ בינארי המקיים את התנאים: מפתח הורה =< מפתח בנים (=> בערמת מקסימום) העץ חייב להיות מלא לשמאל, כלומר כל העלים הם מאותה רמה, או שמימין עומק העלים נמוך ב1. ערמה או לא?. ערמה לעומת עץ חיפוש בינארי.
E N D
מבני נתונים שיעור 8 – ערמה (Heap) טבלאות ערבול (Hash Tables)
ערמה Heap • ערמת מינימום הינה עץ בינארי המקיים את התנאים: • מפתח הורה =< מפתח בנים (=> בערמת מקסימום) • העץ חייב להיות מלא לשמאל, כלומר כל העלים הם מאותה רמה, או שמימין עומק העלים נמוך ב1
ערמה לעומת עץ חיפוש בינארי • בעץ חיפוש בינארי מפתח הבן השמאלי קטן מההורה והימני גדול ממנו • בערמה מפתח ההורה גדול (או קטן) שווה לבניו • עץ בינארי אין אילוץ להיות מלא לשמאל • גובה ערמה עם n איברים הוא : h = log(n + 1)
פעולות על ערמה • ניתן להכניס ערך כלשהו לערמה insert • ניתן להוציא רק את הערך בשורש (הקטן ביותר בערמת מינימום או הגדול ביותר בערמת מקסימום)
פעולת הכנסה insert • פעולת הכנסת איבר מורכבת משני שלבים: • הכנסת האיבר למקום הפנוי הבא (הראשון משמאל) • תיקון הסדר על מנת לשמור על החוקיות. פעולה הכוללת השוואת המפתח של האיבר הנכנס עם ההורה עד הגעה למיקום המתאים. פעולה זו נקראת Upheap 2 5 6 z 9 7 מיקום הכנסה
הכנסת איבר - דוגמא הכנסת איבר עם מפתח 6
הכנסת איבר - דוגמא הכנסת איבר עם מפתח 6 שלב 1: הכנסה למקום הפנוי הבא
הכנסת איבר - דוגמא הכנסת איבר עם מפתח 6 שלב 2: תיקון Upheap
הכנסת איבר - דוגמא הכנסת איבר עם מפתח 6 שלב 2: כל עוד ערך המפתח 6 קטן מההורה ממשיכים לעלות
הכנסת איבר - דוגמא הכנסת איבר עם מפתח 6 סיום Unheapכאשר מגיעים לשורש או נתקלים בהורה עם מפתח קטן יותר (אך לא שווה)
פעולת מחיקה delete • פעולת המחיקה מוגבלת לשורש בלבד. הפעולה מורכבת משלושה שלבים: • החלפת האיבר האחרון עם השורש • מחיקת האיבר האחרון • תיקון הסדר על מנת לשמור על החוקיות. הפעולה מתחילה מהשורש ומחליפה עם הבן בעל המפתח הקטן עד הגעה למיקום המתאים. פעולה זו נקראת Downheap
מחיקת ערך - דוגמא החלפת השורש (3) עם האיבר האחרון (20) ומחיקת האחרון (לאחר ההחלפה)
מחיקת ערך - דוגמא • התחל תיקון Downheap
מחיקת ערך - דוגמא • סיום פעולת Downheap כאשר: • הגענו לעלה • מפתח ההורה קטן משני בניו
למה זה טוב? • מימוש תור עם עדיפויות. • הכנסת איבר ע"פ עדיפותו (מפתח) • הוצאת איבר הבא עם עדיפות מינימלית (השורש בערמת מינימום) • דוגמא: הכנס את האיברים בעלי העדיפויות 3,2,1,2 והוצא אותם באמצעות delete
טבלאות ערבול / גיבוב • טבלאות ערבול הינן מבני נתונים המבוססים על מיפוי ערכי המפתחות ע"י פונקציה מתמטית • מבנה נתונים מהיר המאפשר גישה ישירה לנתונים, הכנסת איבר וחיפוש מיידי (O(1)) • טבלאות ערבול מבוססות על מערכים (חסרון של גודל ידוע מראש)
מדוע? • נניח שרוצים לאחסן את סדרת האובייקטים בעלי המפתחות הבאים: 12,120,34,1145,64 • הבא נבחן את האופציות העומדות לרשותנו: • מערך • מערך ממויין • תור/מחסנית • רשימה מקושרת • עץ חיפוש בינארי
מערך • ניתן להכנים בקלות ופשטות לאינדקס הראשון הפנוי (מיידי) • חיפוש ערך מסוים מצריך מעבר על כל הנתונים והשוואה לערך המבוקש
מערך ממויין • הכנסה במיקום המתאים: דורש מעבר על האיברים עד מציאת המיקום המתאים • חיפוש ערך מסוים פשוט יותר ממערך לא ממויין, אך עדיין מצריך מעבר על הנתונים והשוואה לערך המבוקש (אם כי ניתן לבצע ביעילות יחסית עקב הסדר) • יתרון במידה ומעוניינים לעבור על כל האיברים ע"פ סדר מסוים
תור / מחסנית • מבנים מוגבלים ביותר כאשר מעוניינים לבצע חיפוש של ערך • יש להוציא ערכים רק ע"פ הסדר המוגדר • מבנים אלו שימושיים במימושים ספציפיים כמו שהוזכרו
רשימה מקושרת • הכנסה מהירה • חיפוש ערך דורש מעבר על כל הנתונים • למעשה כמו מערך אך מאפשר דינאמיות בגודל
עץ חיפוש בינארי/ערמה • הכנסת ערכים בהתאם לסדר והחוקיות • חיפוש ערך יעיל יותר מרשימה או מערך אך עדיין יש צורך לבצע מעבר על הענפים והשוואה לערך המבוקש • יתרון במידה ומעוניינים לעבור על כל האיברים ע"פ סדר מסוים
מצב היפוטתי 1 • נניח והאובייקטים אותם אנו מעוניינים לאחסן הם בעלי המפתחות: 1,2,3,4,5,6,7 • נניח שאילו כל הנתונים שיש להכניס • נוכל להגדיר מערך באורך 7 ולהכניס את איבר עם מפתח 1 למיקום 1, וכך את כל שאר האיברים בהתאם למפתח שלהם • כך יהיה לנו מבנה נתונים מושלם כמעט המאפשר חיפוש מיידי: איבר עם מפתח i יימצא באינדקס 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? האם קיימת נוסחאת הפלא?
דוגמא למצב היפוטטי אמיתי • בסיס נתונים בחברה עם 1000 עובדים • כל עובד שנקלט לחברה מקבל מספר עובד ייחודי ע"פ סדר קליטת העובד • המייסד מס 1 והעובד האחרון מספרו 1000 • במקרה זה ניתן להשתמש בערכי המפתחות ישירות כאינדקס למערך העובדים • האם היינו יכולים להשתמש בת"ז העובדים במקום מס העובד? באיזה מחיר של נפח אחסון?
מגבלות בשימוש ישיר במפתח • המפתח חייב להיות ייחודי • על תחום המפתחות להיות צר אחרת המערך יהיה גדול בהרבה ממספר הרשומות • על המפתחות להיות דחוסים בתחום הצר, אם יש הרבה מרווחים בינהם זה מוריד את יעילות האחסון
טבלת ערבול • טבלת ערבול מבצעת פעולה חשבונית על המפתחות כדי להגיע למצב הדומה למצב האופטימלי שראינו קודם • במקרים אילו (לרוב לא נוכל להשתמש בערכי המפתחות ישירות כאינדקסים) • המטרה: למפות את ערכי המפתחות לתחום צר של ערכים טבעיים (המתאימים לאינדקסים)
פונקציות ערבול • ישנן דרכים רבות לבצע את המיפוי • פונקציות ערבול רבות מבוססות על פעולת השארית השלמה (MOD %) • אם נפעיל על ערכי המפתחות MOD Xנמפה אותם לתחום ערכים צר בגודל X • דוגמא:10 MOD 1,102,855,78,1521 • חסרון: כפילויות/התנגשויות
טבלאות ערבול פונקציות ערבול • A hash functionh maps keys of a given type to integers in a fixed interval [0, N - 1] • Example:h(x) = x mod Nis 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 kat index i = h(k)
0 1 025-612-0001 2 981-101-0002 3 4 451-229-0004 … 9997 9998 200-751-9998 9999 Example • 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 functionh(x) = last four digits of x
פונקציות ערבול 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) = ymodN • The size Nof 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)modN • a and b are nonnegative integers such thatamodN 0 • Otherwise, every integer would map to the same value b
Example Hash Function 0 hf(22) = 22 22%7 = 1 1 tableEntry[1] hf(36) = 36 36%7 = 1 2 3 hf(4) = 4 4%7 = 4 4 tableEntry[4] 5 6
0 1 025-612-0001 2 3 4 451-229-0004 981-101-0004 טיפול בהתנגשויות • 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 • Separate chaining is simple, but requires additional memory outside the table
Chaining with Separate Lists - Example Keys: 54, 77, 94, 89, 14, 45, 35, 76 Function: MOD 11
סריקה לינארית 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 mod13 • 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
חיפוש בסריקה לינארית • 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 Algorithmget(k) i h(k) p0 repeat c A[i] if c= returnnull else if c.key () =k returnc.element() else i(i+1)mod N p p+1 untilp=N returnnull
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 Nfor 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 • qis 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 mod13 • d(k) =7 - k mod7 • 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 31 41 18 32 59 73 22 44 0 1 2 3 4 5 6 7 8 9 10 11 12
חסרונות טבלת ערבול • לא ניתן לעבור על כל האיברים (סריקה) ע"פ סדר מסוים. • מהירות על חשבון נפח אחסון. • מבוסס על מערך – אילוץ גודל.
דוגמא • יש לבנות מערך, מערך ממוין, רשימה מקושרת, עץ חיפוש בינארי וטבלת ערבול מהסטודנטים הלומדים בכיתה ע"פ מפתח ת"ז • ברשימת הערבול נשתמש בשתי הספרות האחרונות של הת"ז (פונקציית הערבול)