340 likes | 532 Views
מילון. מבנה נתונים להחזקת קבוצות שבו רוצים INSERT, DELETE, MEMBER. דוגמה :. קלט מורכב מ -. 1. (‘F’, שם ). 2. (‘U’, שם ). 3. (?, שם ). 1. סמן ח”כ מתפקד כ”טוב ”. 2. סמן ח”כ מתפקד כ“רע ”. 3. האם “רע” או “טוב ”?. רוצים לשמור האינפורמציה ולענות על שאילתות מסוג 3.
E N D
מילון מבנה נתונים להחזקת קבוצות שבו רוצים INSERT, DELETE, MEMBER דוגמה: קלט מורכב מ - 1. (‘F’, שם) 2. (‘U’, שם) 3. (?, שם) 1. סמן ח”כ \ מתפקד כ”טוב” 2. סמן ח”כ \ מתפקד כ“רע” 3. האם “רע” או “טוב”? רוצים לשמור האינפורמציה ולענות על שאילתות מסוג 3 Data Structures, CS, TAU - 4.6
יישום המילון 1) רשימה מקושרת 2) Bit Vector – מאוד יעיל אם התחום מוגבל וקטן 3) מערך - טוב רק אם אין הרבה דינמיות (שינוי מבנה) אם ממויין: אם לא ממויין: INS = O(N) INS = O(1) DEL = O(N) DEL = O(N) MEM = O(logN) MEM = O(N) Data Structures, CS, TAU - 4.7
HASH TABLE ליישום המילון יישום מערך ( - O(N ווקטור ביטים - O(1) אבל מוגבל בגודל. - גישה לכל סל ב O(1) -חפוש בסל לינארי. 0 1 B-1 HASH - בממוצע זמן קבוע ואין מגבלת גודל כמו בווקטור הביטים. HASH פתוח (Chaining) : - נחזיק B סלים שבהם נאחסן את האיברים (Buckets) - Overflow ברשימות פונקצית :Hash עבור כל ערך h(x) , x הוא ערך הפונקציה ונופל בתחום.0, 1, …B-1 1) חישוב h(x)o הכנסת איבר: 2) הכנסתו ברשימה המתאימה Data Structures, CS, TAU - 4.8
HASH סגור (Open Addressing) 0 1 Bucket Table B-1 0 1 2 3 4 5 6 f c a b d e משתמשים רק בטבלה (בלי רשימותOverflow ) אם h(x) גורמת התנגשות: מחשבים (rehash) h2(x) ואח”כ h3(x) דוגמה פשוטה : Linear Hashing Hi(x) = (h(x)+i) mod B a b c d e f 3 4 2 3 6 0 Data Structures, CS, TAU - 4.9
בדיקת חברות (MEMBER) ב-HASH סגור - אם השמטות אסורות בישום, אזי ריק x איננו. - אבל: אם השמטות מותרות: ריק איננו! 0 1 2 3 a b c נצטרך לסמן “deleted” במקוםשהושמט - בדוק h1(x), h2(x)…o והשווה את האיבר הנמצא עם x - בדיקה עד שנמצא “ריק” (צריך ערך ל”ריק”) דוגמה: Ins (a, 1), Ins (b, 1), Ins (c, 1) Del (b) Member (c) א) בחיפוש של איבר - לפסוח עליו ב) בהכנסה - ניתן להשתמש בו Data Structures, CS, TAU - 4.10
ביצועים של Hash פתוח (Chaining) N/B = load factor - לכן כל N/2 האיברים האחרונים דורשים כל-אחד פעולות (הכנסת איבר לרשימה ממויינת) וסה”כ כל N האיברים דורשים: אם חפוש בשכיחות דומה: - אזי אםN B סה”כ נתון: B סלים N איברים - נניח: הכנסה של כל איבר פעם אחת Insert: Amortized Complexity. Member: regular - בממוצע יש בכל סל N/B איברים Data Structures, CS, TAU - 4.11
ביצועים של Hash פתוח (Chaining) - המשך 0, 1, …B-1 לכל התאים כלומר: עבור מפתח אקראי ההסתברותליפול בכל תא הינה :SIMPLE UNIFORM HASHING (1 הנחות: לכל מפתח יש אותה הסתברות ליפול בכל תא אחרי שהופעלה עליו פונקצית ה HASH- ללא תלות במפתחות אחרים. 2)פונקצית HASH מחושבת ב O(1) זמן. • בפונקציות HASH ההגדרה “לכל מפתח ישאותה הסתברות ליפול בכל תא" אינה במובן של מפתח (ערך) ספציפי, כי:עבור פונקציה נתונה מפתח נתון ייפול בדיוק בתא אחד! • הגדרה שכן תופסת: Data Structures, CS, TAU - 4.12
דוגמאות לפונקציות HASH אז h(k) = k B מקיימת את הנחה (1) h(k) = B (kA mod 1) החלק השבור של kA 1) אם : 0<A<1 B ראשוני, Knuth ממליץ: 2) אם k מספרים שלמים: h(k) = k mod B (עדיף לקחתB ראשוני) 3) אם k שלמים: Data Structures, CS, TAU - 4.13
UNIVERSAL HASHING ממוצע זמן חיפוש - משתמש “זדוני” יכול לבחור n מפתחות,כולם לתוך אותו סל. - נכון עבור כל פונקצית Hash קבועה. - דרך מניעה יחידה: בחירת פונקציה באקראי לא תלויה במפתחות. - בגלל אקראיות האלגוריתם יתנהג שונה בכל ריצה (על אותו input ) input - מסויים אינו יכול “לסבול” באופן תמידי. - עבור כל input ההסתברות לבצועים גרועים קטנה (וזהה לקלטים אחרים דומים) Data Structures, CS, TAU - 4.14
UNIVERSAL HASHING - המשך H - אוסף סופי של פונקציות Hash שממפות תחום U ל B סלים {0, 1,…B-1} לכל x, y U מספר הפונקציות h Hכל ש h(x )=h(y) הינו B / |H| אם h נבחרת מאוסף אוניברסלי של פונקציותhash ומשומשת להכניס N מפתחות לתוך טבלה בגודל N B ,B, אזי תוחלת מס’ ההתנגשויותהקשורות במפתח x הינה קטנה מ 1. H נקרא אוניברסלי אם: כלומר: אם פונקציה נבחרת אקראית מ- H אזי סיכוי ההתנגשות של x ו y הינו 1/B משפט Data Structures, CS, TAU - 4.15
הוכחת המשפט יהי: אם z, y מתנגשים 1 =Cyz אחרת 0 לכן: E[Cyz] = 1 B )כי z, y מתנגשים בהסתברות 1 ) B אזי: הוכחה: יהי Cxמס’ ההתנגשויות הכולל של X תוחלת סכום = סכום תוחלות Data Structures, CS, TAU - 4.16
בחירת קבוצה אוניברסלית x=(x0, x1,…xr) - יהי a={a0, …ar } רצף של אברים נלקחים באקראי מהקבוצה {0, 1,…B-1} ונגדיר ha H : - בחר B ראשוני. - פרק x ל r+1 בתים - דרישה: ערך כל byte קטן מ B- Data Structures, CS, TAU - 4.17
משפט - ניקח שני מפתחות שונים כלשהם x y - בלי הגבלת הכלליות נניח x0 y0 a1, a2,…ar - נסתכל על בחירה שרירותית של אבל B הוא ראשוני ולכן יש יחידי הפותר את המשוואה a0w=z וזה נכון כי אם a0’w=z, a0w=z אז (a0-a0’)w=B בניגוד לראשוניות של B 0 a0 B האוסף H הוא אוסף אוניברסלי של פונקציות Hash הוכחה: טענה: עבור הבחירה הנ”ל ישנו בדיוק a0בודד המקיים h(x)=h(y) הוכחה: כדי שיתקיים h(x)=h(y) חייב להתקיים: Data Structures, CS, TAU - 4.18
המשך ההוכחה - לכן יש בדיוק ערכים של{a0, …ar} שעבורם x ו y מתנגשים לכל (x,y) - היות ומס’ הערכים של a={a0, …an} הוא בדיוקx ו-y מתנגשים בדיוקבהסתברות: H אוניברסלית Data Structures, CS, TAU - 4.19
הערכת ביצועים Hash סגור (OPEN ADDRESSING) Hash לינארי: אם התנגשנו סיכוי התנגשות שניה גבוה (כבר נפלנו באזור “מועד”) נניח: פונקצית rehash שולחת בצורה אקראית. “אמונה”: זה הטוב ביותר B - סלים N - איברים (כרגע בטבלה) Data Structures, CS, TAU - 4.20
הערכת ביצועים : תוחלת עלות הכנסת איבר כשיש N הסתברות לפחות להתנגשות אחת: הסתברות לפחות לשתי התנגשויות: הסתברות לפחות ל i התנגשויות: עבור N, B גדולים: ממוצע: הצלחה אבל: Data Structures, CS, TAU - 4.21
הערכת ביצועים - המשך אם נדייק ונחליף ב: חשבון מסובך ייתן (amortized) :1, 2,…M כמה עולה להכניס האיברים בממוצע: Data Structures, CS, TAU - 4.22
הערכת ביצועים - המשך למלא את הטבלה יקח: logB בממוצע לאיבר 10/9 ln10 אבל למלא 90% (M=0.9B) : כלומר: קיים: לא קיים: - מילוי הטבלה – פונקציה B - כל שבר שונה מ- 1 – לא תלויים ב- B בדיקת חברות - לאיבר שלא קיים - כמו הכנסה - לאיבר שקיים - כמו הממוצע עד כה Data Structures, CS, TAU - 4.23
הערכת ביצועים - המשך למלא 90% מ 1000 למלא 90% מ- 109 שווה!! אבל למלא הכל lnB הערה: אם M אחוז ( ) של B – אזי יעילות הכנסה היא: לא תלוי ב-B!!! כלומר: סיבה: השבריר האחרון של המילוי שבו אורך השרשרות פרופורציונלי למספרהסלים – קובע. Data Structures, CS, TAU - 4.24
פתרון התנגשויות Rehash hi(x) = h(x) + i (mod B) 1) לינארי: hi(x) = h(x) + C i (mod B) 2) אם B מתחלק ב C (או גורם משותף) בעייתי כי גורם התקבצות. אזור התקבצות נוטה לגדול!! גרוע מאוד מכיוון שיחזור על עצמו !!! דוגמא: C=20 B=50 Ci = 20, 40, 10, 30, 50, 20... לכן: צריך ש B ו C בלי גורם משותף. אבל - תופעת ההתקבצות לא נפתרת. סיבה: התקבצות נובעת מכך ש hiמחושבת כפונקציה של המקום בטבלה ולא של מס’ ההתנגשויות (i) – כל מי שנופל על אותו תא מקבל את אותה !! hi Data Structures, CS, TAU - 4.25
פתרון התנגשויות Rehash - המשך 1, 2, … B-1 כש diהינו פרמוטציה של לדוגמא(הפרשים זהים): d1=1, d2=2, d3=3, d4=4 hi(x) = h(x) + di (mod B) 3) יותר טוב: d0 =0 d1=4, d2=2, d3=1, d4=3 דוגמא : B=5 - מונע שכל מי שנופל על h(x) יפול באותה השרשרת. ( כמובן לא מונע שבעלי h(x) זהה יפלו עלשרשרת זהה! ) הערה: סתם פרמוטציה אינה טובה. Data Structures, CS, TAU - 4.26
רה-ארגון - טבלה מלאה בעיה רה-ארגון אם N 2B כדאי להכפיל הגודל ולהעתיק. אם N > 0.9B במקרה של DELETIONS כשכמות המקומות הפנויים קטן [0.1B] כשמבנה הנתונים מתמלא (חוקי אצבע): טבלה פתוחה: לא סתם העתקה – בצוע insert טבלה סגורה: Data Structures, CS, TAU - 4.27
סכום HASH - יעיל לבצוע פעולות Insert, Delete, Member כולם בסיבוכיות ממוצעת O(1) , גרוע ביותר O(N) • אינו יעיל עבור אינפרמצית סדר (MIN, עוקב, וכו') • שפור HASH פתוח: • החלף שרשרות בעצי 2-3 • סבוכיות: O(1) ממוצע, O(log N)worst case Data Structures, CS, TAU - 4.27
Perfect Hashing רוצים: לבנות טבלת T Lookupבגודל (O(n שבאמצעותה אפשר לבדוק חברות, בזמן קבוע (1)O . בעיה: נתונה קבוצה S של n מפתחות מתחום U השוואה ל- Hash : * טבלה קבועה (Hashרגיל - דינאמי) * רוצים זמן קבועWorst case * מוכנים להשקיע בבניית הטבלה (זמן בנייה (O(n בתוחלת) *מקום: (O(n שיטה: טבלה דו-שלבית
T 1 2 S מפתחות i Bi f (hash) ²|Bi| n gi (Hash) עקרונות: 1)f ממפה את כל n המפתחות לטבלת ביניים בגודל n . בטבלת הביניים קיימים תאים עם יותר ממפתח אחד. 2)gi- פונקציה אישית של תא i : ממפה מ- Bi לתחום בגודל ²|Bi| בצורה חד-חד ערכית.
בעיות שיש להתמודד איתן * לא נצטרך לחפש הרבה 1) אם Biגדול מידי Tלא תהיה (O(n צריך לחפשfכזה כך שלא יהיו Bi גדולים. 2) צריך למצוא (לחפש) פונקציות gi שימפו את Bi ל ²|Bi| בלי התנגשויות בסיס לפתרון: הסתברות !! * הסתברות למציאת פתרונות ל-1) ו-2) היא גבוהה. בתוחלת זמן לינארי
בחירת פונקציה f בחירת פונקציה f : 1 f 1…n * ממפה n אלמנטיםל - i Bi n * תכונה נדרשת [1…n] 1) בוחרים בצורה אקראית מקבוצה אוניברסלית של פונקציות Hash f: U 2)הוכחה: פרק על HASH אוניברסלי 2)משפט: אם f אוניברסלית וממפה N מפתחות ל B סלים אז תוחלת מס’ התנגשויות של מפתח בודד הינו (N-1)/B * ממפה לדליים B1 …Bn bi = | Bi | * * דרך להשגה : בחרו f עד שתצליחו! (מפונקציה אוניברסלית) אנליזה:
3) לכן: במיפוי n מפתחות ל תוחלת מס’ ההתנגשויות של איבר בודד: n-1/n 1…n אבל: #collisions = וכן ניקח תוחלת תוחלת מס’ ההתנגשויות של כל האיברים: n(n-1/n)= n-1
אם xמשתנה אקראי לא שלילי 5) ולכן 4) אי שוויון מרקוב: 6) נבחר f באקראי. סיכוי להצלחה בכל ניסוי > 1/2 תוחלת מספר הניסיונות = 2
מסקנה: במספר ניסיונות שתוחלתם 2 נקבל f כך ש: גודל הטבלה לינארית + זמן הריצה של חיפוש f קבוע בתוחלת
בחירת פונקציה gi: * נתונים מפתחות * נמפה אותם לתחום נבחר * תוחלת מס’ התנגשויות של מפתח בודד * תוחלת מס’ התנגשויות של כל המפתחות *אי שוויון מרקוב: *אי שוויון Boole: * נבחר gi מאוסף אוניברסלי:
תוחלת מס’ הניסיונות עד שנמצא gi כך שאין התנגשויות היא 2
עלות בניית פונקציה gi: * בונים וקטור ביטים בגודל * יש לאתחלו פעולות. * היות (בחרנו קודם את f כדי שתקיים את זה!) O(n) עלות כוללת של בחירת כל gi כבבחירה ראשונה הינה worst case O(n) עלות כל בחירת giבתוחלת * עבור כל gi שמנסים צריך לבדוק אם בקבוצה Bi יש התנגשויות. היות ומס’ בחירות בתוחלת הינו 2 (עבור gi )
סיכום O(n) 1) עלות העבודה בכל שלבי ההכנה בתוחלת. 2) עלות ביצוע find: : Worst Case O(1)