המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

Marina Kogan Sadetsky –

מצגות קשורות


מצגת בנושא: "Marina Kogan Sadetsky –"— תמליל מצגת:

1 Marina Kogan Sadetsky – 1.2015
יסודות מבני נתונים תרגול 9: טבלת גיבוב - Hash table Marina Kogan Sadetsky –

2 טבלת גיבוב Hash table hash table – מערך שמאפשר זמן חיפוש O(1).
כל מפתח ממופה לתא מסוים במערך (בעזרת hash function). מה קורה אם שני מפתחות k1 ו k2 ממופים לאותו תא במערך? התנגשות! hash function h(k) 3 החלטות חשובות: גודל המערך פונקציית מיפוי פתרון להתנגשויות

3 התנגשויות - hash collisions
hash collision – שני מפתחות k1 ו k2 ממופים לאותו תא ב hash table. באיזה פתרון להתנגשויות כדאי לבחור ? k2 משתרשר לאותו תא במערך (chain hashing) k2 יצטרך לחפש לעצמו מקום אחר במערך (open addressing) שאלה: בשיטת השרשור, במקרה הגרוע חיפוש מתבצע בזמן O(n). האם אפשר לשפר אותו ל O(log n)? דוגמא: תשובה: כן, במקום רשימה מקושרת נשתמש בעץ AVL. h(5)=1 h(16)=1  H[1] is occupied   probe hash to find empty slot (linear probe) h(38)=1  H[1] is occupied   probe hash to find empty slot 38 נכשל באותם המקומות במערך כמו 16 ! בגלל שנסיוניות לא תלוים בערך המפתח!

4 m - hash table size hash table size - m – גודל של hash table. x x √
דוגמא: נניח עולם של מספרים שלמים. לhash table צפוים להכנס רק 100 מספרים מתוך העולם. באיזה גודל m כדאי להגדיר את hash table? בשיטת chain hashing: 5 ? אז, לכל תא יכנסו 100/5=20 מפתחות ... יותר מדי 100 ? אז, לכ תא יכנס רק מפתח אחד ... בזבוז זכרון נקח m כך ש (load factor α > 1) n/m=α=O(1) בשיטת open addressing: m מומלץ הוא ~ פי 1.5 מ n (load factor α < 1) x x

5 h(k) - hash function hash function - h(k) – ממפה מפתח לתא מסוים בhash table. דוגמא: נניח עולם של מספרים שלמים. לhash table צפוים להכנס רק 10 מספרים מתוך העולם. באיזה פונקציית גיבוב h(k) כדאי לבחור ? h(k)=5 ? אז, כל המפתחות יכנסו לאותו תא במערך... והמטרה לפזר מפתחות על פני המערך h(k) = rand(0,m-1) ? אז הפיזור יהיה מושלם... אבל אי אפשר יהיה למצוא מפתחות במערך h(k)=k mod 10 ? אז, כל המפתחות יבחרו תא במערך רק ע"פ ספרת האחדות...רוצים שלכל הספרות של המפתח תהיה השפעה על בחירת התא במערך h(k)= ? כן!! איך הגענו לנוסחה הזו? דרך מחקר (זה לא מובן מאליו) ⌋m(k∙(√5-1)/2-⌋k∙(√5-1)/2⌊) ⌊

6 התנגשויות - hash collisions
דוגמא: h(5)=1 h(16)=1  H[1] is occupied   calculate probing step by additional step function h’(k) (double hashing) Let’s take h’(k)=k mod (m-1) +1 first step: h’(16) = 16 mod = 5  H[1+5=6] is free  h(38)=1  H[1] is occupied   first step: h’(38) = 38 mod = 3  H[1+3=4] is free  שאלה: האם h’(k) מבטיחה שנמצא מקום פנוי אם קיים כזה? תשובה: לא מובן מאליו, מצריך הוכחה.

7 Question 1

8 Question 2 Suggest how to implement Delete(k) function for a hash table, when using open addressing. search(54) h(54)=1 H[1]=5  H[2]=16  H[3]=38  H[4]=empty  there is no 54 in hash delete(16) search(38) h(38)=1 H[1]=5  H[2]=empty  there is no 38 in hash ?? פתרון: לכל תא שנמחק, נסמן אותו כ"deleted". אם נתקלים בתא “deleted”, לא נפסיק חיפוש. search(18) h(18)=1 H[1]=“d”  H[2]=“d”  H[6]=“d”  H[7]=18  חיפשנו את 18 בכל המערך בזמן O(m) ! פתרון אפשרי: rehash כל O(m) פעולות.

9 Question 2

10 Question 3 Consider two sets of integers, S = {s1, s2, …, sm} and T = {t1, t2, …, tn} , m ≤ n. Suggest an algorithm to test where S is a subset of T. Solution: נגדיר hash table H ונכניס לתוכה את כל המפתחות של T. עבור כל מפתח k ב S, נבדוק האם k נמצא ב H. אם כן, נחזיר “true” אחרת, נחזיר “false”

11 Question 4 נתונה קבוצה S עם n מספרים שלמים ומספר שלם x. צריך למצוא שני מספרים k2, k1 ϵ S כך ש x = k1 + k2 בזמן O(n). פתרון: נגדיר hash table H ונכניס לתוכה את כל המפתחות של S. עבור כל מפתח k1 ב S, נבדוק האם k2:=x-k1 נמצא ב H. אם כן, נחזיר k2, k1 אחרת, נחזיר “false”


הורד את "ppt "Marina Kogan Sadetsky –

מצגות קשורות


מודעות Google