מבני נתונים שיעור – 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