מבני נתונים פתרונות לסט שאלות דומה לשאלות מתרגיל 5 השאלות 2. נתונה טבלת ערבול שבה התנגשויות נפתרות בשיטת.Open Addressing הכניסו לטבלה את המפתחות הבאים: 59 88, 17, 28, 15, 4, 31, 22, 10, (מימין לשמאל), כאשר גודל הטבלה הוא = 11 m, תוך שימוש בשיטות הבאות: א.,h(k,i) = (h 1 (k) + i) mod m :Linear Probing כאשר.h 1 (k) = k mod m ב. h(k,i) = (h 1 (k) + c 1 i + c 2 i 2 ) mod m :Quadratic Probing כאשר (k) h 1 כמו בסעיף א' ו- = 1 1.c 2 = 3 c ג. h(k,i) = (h 1 (k) + ih 2 (k)) mod m :Double Hashing כאשר (k) h 1 כמו בסעיף א', ו- (m 1)).h 2 (k) = 1+(k mod ציירו את הטבלה המתקבלת בכל אחד מהמקרים. 3. נתונה טבלת ערבול שבה התנגשויות נפתרות ע"י שרשור, תוך שימוש בשיטת החלוקה ובפונקצית הערבול.h(k) = k mod m הדגימו את הכנסת המפתחות 10,17,12,33,20,15,19,28,5 (מימין לשמאל) טבלה בגודל = 9.m ציירו את הטבלה המתקבלת. 4. נתונה טבלת ערבול בגודל n שבה התנגשויות נפתרות בשיטת open addressing (הנתונים נשמרים בטבלה עצמה). מכניסים לטבלה 1 n מפתחות, ואח"כ מחפשים מפתח x שאינו נמצא בטבלה. מה זמן החיפוש הממוצע של x? הוכיחו את תשובתכם ישירות בלי להשתמש בנוסחאות. 5. נתונה טבלת ערבול בגודל m שבה התנגשויות נפתרות ע"י שרשור. יהי U תחום המפתחות האפשריים. הוכיחו שאם U > n m אז יש תת-קבוצה של n מפתחות מתוך U שכולם ימופו לאותו תא בטבלה ע"י כל פונקצית ערבול. מה יהיה הזמן הגרוע של חיפוש במקרה שאכן מופו n מפתחות כאלה לטבלה ומחפשים אחד מהם? 6. נתונה טבלת ערבול שבה התנגשויות נפתרות ע"י שרשור, תוך שימוש בשיטת החלוקה ובפונקצית הערבול.h(k) = k mod m p גודל הטבלה הוא 1 p, m = 2 ונתון שהמפתחות הם מחרוזות המיוצגות בבסיס 2 (כאשר תו במחרוזת מיוצג ע"י קוד ASCII שלו כפי שראינו בשיעור). א. הוכיחו שאם מכניסים לטבלה שתי מחרוזות x,y והמחרוזת x מתקבלת מהמחרוזת y ע"י החלפת שתי אותיות סמוכות, אז x,y ימופו ע"י פונקצית הערבול לאותו תא בטבלה. ב. הסיקו מכך שגם אם המחרוזת x היא תמורה (פרמוטציה) כלשהי של המחרוזת y, ימופו שתי המחרוזות לאותו תא בטבלה.
הדרכה: נניח ש- y = y 1 y 2 y 3...y n והמחרוזת x מתקבלת מ- y ע"י החלפת שני התווים הראשונים. לכן, = x K,2 p המפתח y ו-,x הוא המפתח המתאים למחרוזת K x בבסיס ונניח ש- x,y הציגו את.y 2 y 1 y 3...y n המתאים למחרוזת y בייצוג זה. כעת, כדי להראות ששני המפתחות האלה ימופו לאותו מקום הראו כי K y.mod m = K x mod m 7. נתונות שתי רשימות משורשרות L, 1 L, 2 כאשר כל רשימה מכילה n נתונים. הציעו אלגוריתם שזמן הריצה הממוצע שלו טוב ככל האפשר, אשר בודק אם הנתונים בשתי הרשימות זהים (לאו דווקא מופיעים באותו סדר). 8. נתון קלט של n מספרים ממשיים הלקוחים בהתפלגות שווה מהקטע (0,1). עליכם לבדוק אם יש בקלט שני מספרים a,b כך ש-.a 2 = b א. כתבו אלגוריתם יעיל ככל האפשר במקרה הגרוע. ב. כתבו אלגוריתם יעיל ככל האפשר במקרה הממוצע. בשני המקרים נתחו את יעילות האלגוריתם שלכם.
פתרונות נבחרים שאלה 2: נתונה טבלת ערבול שבה התנגשויות נפתרות בשיטת.Open Addressing נכניס לטבלה את המפתחות הבאים: 59 88, 17, 28, 15, 4, 31, 22, 10, (מימין לשמאל), כאשר גודל הטבלה הוא = 11 m, תוך שימוש בשיטות הבאות:.h 1 (k) = k mod m כאשר,h(k,i) = (h 1 (k) + i) mod m א. :Linear Probing 22 88 4 15 28 17 59 31 10 0 1 2 3 4 5 6 7 8 9 10 ב. h(k,i) = (h 1 (k) + c 1 i + c 2 i 2 ) mod m :Quadratic Probing ו- = 1 1.c 2 = 3 c כאשר (k) h 1 כמו בסעיף א' 22 88 17 4 28 59 15 31 10 0 1 2 3 4 5 6 7 8 9 10 שימו לב שלא כל סדרות החיפוש הן פרמוטציה (תמורה) של כל המקומות בטבלה, וזה כמובן אינו טוב. לדוגמה: במקרה של המפתח 88. h(k,i) = (h 1 (k) + ih 2 (k)) mod m ג. :Double Hashing ו- (m 1)).h 2 (k) = 1+(k mod כאשר (k) h 1 כמו בסעיף א', 22 59 17 4 15 28 88 31 10 0 1 2 3 4 5 6 7 8 9 10
שאלה 3: נתונה טבלת ערבול שבה התנגשויות נפתרות ע"י שרשור, ופונקצית הערבול:.h(k) = k mod m נכניס את המפתחות 10,17,12,33,20,15,19,28,5 (מימין לשמאל) לטבלה בגודל = 9.m 0 1 2 3 4 5 6 7 8 10 20 12 5 33 17 19 NULL NULL NULL NULL 15 28 NULL NULL הערה: שימו לב שהכנסנו את האיברים לתחילת הרשימות ולא לסופן. אם רוצים בפעולת Insert לבדוק שהאיבר שמכניסים לא נמצא בטבלה, צריך כמובן להכניס אותו לסוף הרשימה. שאלה 4: נשים לב שכל התאים בטבלה מלאים פרט לאחד. אנו נדע שהחיפוש של x נכשל כאשר נגיע לתא הריק הזה. אם נגיע לתא הריק מיד, הרי שביצענו פעולה אחת. אם נגיע לתא הריק לאחר התנגשות אחת ביצענו 2 פעולות, ובאופן כללי אם הגענו לתא הריק לאחר (1 i) התנגשויות אז סה"כ ביצענו i פעולות. נראה שההסתברות לכל אחד מהמקרים האלה שווה ל- n/1. נסמן ב- p i את ההסתברות שנגיע לתא הריק אחרי בדיוק i ניסיונות. לכן אם הפונקציה אחידה אז.p 1 = 1/n כמו-כן: n 1 n 2 n 1 (n 1) (n 2) 1 p2 = 1 = = n n 1 n n 1 n זאת כי יש הסתברות של (n 1)/n להגיע לאחד מ- (1 n) התאים המלאים בניסיון הראשון, ויש להכפיל זאת בהסתברות המתאימה להגיע לתא הריק בניסיון השני. שימו לב שידוע לנו בוודאות שבניסיון השני לא נגיע לתא שאליו הגענו בניסיון הראשון כי אנחנו מניחים שסדרת החיפוש של כל מפתח היא תמורה של n התאים בטבלה. באופן דומה אפשר להוכיח כי p i = n/1 לכל i. לכן בסה"כ נקבל שהזמן הממוצע לחיפוש לא מוצלח הוא: n 1 1 nn ( + 1) n+ 1 i = = =Θ( n) n n 2 2 i= 1 שאלה 5: לפי עקרון שובך היונים, אם U > n m אז יהיו לפחות nm + 1 m > n נתונים שימופו לאותו תא ע"י כל פונקצית ערבול. אחרת אם יש פונקצית ערבול h שממפה לכל תא לכל היותר 1 n נתונים מתוך הקבוצה U, נקבל שסה"כ יש בטבלה לכל היותר m (n 1) נתונים, וזו סתירה לכך ש- U. > n m לכן יש קבוצה של n מפתחות שימופו לאותו תא. חיפוש של מפתח ברשימה הזאת ייקח במקרה הגרוע זמן של.Θ(n)
שאלה 6: גודל הטבלה הוא 1 p m, = 2 ונתון שהמפתחות הם מחרוזות המיוצגות בבסיס 2, p כאשר תו במחרוזת מיוצג ע"י קוד ASCII שלו. יהיו x,y שתי מחרוזות, כך שהמחרוזת x מתקבלת מהמחרוזת y ע"י החלפת שתי אותיות סמוכות. נניח שהמחרוזת y היא y = y 1 y 2 y 3...y n ונניח שהמחרוזת x מתקבלת מ- y ע"י החלפת שני התווים הראשונים (ההוכחה דומה לכל שני תווים אחרים). לכן,.x = y 2 y 1 y 3...y n המפתחות המתאימים לשתי המחרוזות יהיו: K y = (2 p ) n 1 y 1 + (2 p ) n 2 y 2 + (2 p ) n 3 y 3 +...+ (2 p ) 0 y n K x = (2 p ) n 1 y 2 + (2 p ) n 2 y 1 + (2 p ) n 3 y 3 +...+ (2 p ) 0 y n וכעת כדי להראות ששני המפתחות האלה ימופו לאותו מקום נראה ש- K. y mod m = K x mod m לשם כך, מספיק להראות שההפרש ) x K) y K מתחלק ב -m ללא שארית. ואמנם: K y K x = [(2 p ) n 1 y 1 + (2 p ) n 2 y 2 ] [(2 p ) n 1 y 2 + (2 p ) n 2 y 1 ] = (2 p ) n 2 y 1 (2 p 1) (2 p ) n 2 y 2 (2 p 1) = (2 p 1)(2 p ) n 2 (y 1 y 2 ) ואין ספק שהביטוי האחרון מתחלק ב- (1 p 2)=m ללא שארית. מכאן אפשר להסיק שגם אם המחרוזת x היא תמורה כלשהי של המחרוזת y, ימופו שתי המחרוזות לאותו תא בטבלה. זאת משום שאפשר לעבור מהמחרוזת y למחרוזת x ע"י סדרה של חילופי אותיות סמוכות, וראינו שכל חילוף כזה אינו משפיע על מיפוי המפתח המתאים לטבלת הערבול. שאלה 7: נכניס את הנתונים של הרשימה L 1 לטבלת ערבול A 1 בגודל m, = n ואת הנתונים של הרשימה L 2 לטבלת ערבול A 2 בגודל n, כאשר התנגשויות נפתרות ע"י שרשור. אנחנו נשתמש בשתי הטבלאות באותה פונקצית ערבול h. אם למשל האיברים הם מספרים שלמים אז אפשר להשתמש בפונקציה.h(k) = k mod m כעת, עבור :i = 1,2,,n נמיין את הנתונים בתא ה- i בטבלה A 1 ובתא ה- i בטבלה A. 2 נעבור על שתי הרשימות (הקצרות) הממוינות ונשווה בין האיברים. אם שתי הרשימות הקצרות אינן שוות נעצור ונחזיר ש- L 1 L, 2 לא מכילות אותם נתונים. נחזיר: L 1 L, 2 מכילות אותם נתונים. ניתוח היעילות: בהנחה שהקלט אקראי ופונקצית הערבול h אחידה, כל תא בטבלה (רשימה קצרה) מכיל (1)Θ נתונים. לכן, מיון רשימה קצרה ייקח בממוצע (1)Θ פעולות, ולכן מיון של 2n הרשימות ייקח בממוצע Θ(n) פעולות. הערה: כאשר מספר האיברים המוכנסים לטבלת ערבול עם שרשור קרוב למספר התאים בטבלה, אז זמני ההכנסה בפועל עשויים להיות גדולים, למרות שזמן הריצה הממוצע לפעולה הוא (1)Θ כפי שראינו. לכן במימוש אמיתי, מומלץ להקצות מקום רב יותר לטבלה, למשל 2n. זה כמובן מגדיל את הזיכרון, אולם זמן הריצה של כל פעולה יהיה מהיר יותר.
שאלה 8: נתון קלט של n מספרים ממשיים הלקוחים בהתפלגות שווה מהקטע (0,1). עלינו לבדוק האם יש בקלט 2 מספרים a,b כך ש- a. 2 = b א. אלגוריתם יעיל ככל האפשר במקרה הגרוע. 1. נמיין את n המספרים ע"י.MergeSort 2. נעבור על המערך הממוין מתחילתו ועד סופו ולכל מספר b נבצע: א. נחפש ע"י חיפוש בינארי אם יש a. = b ב. אם כן, מצאנו a,b כך ש- a. 2 (b )= 2 = b נעצור ונחזיר.a,b 3. אם לא מצאנו בכל שלב 2 זוג כזה נחזיר "לא". יעילות: היעילות של שלב 1 היא כמובן.Θ(nlogn) בשלב 2 יש n איטרציות, והיעילות של כל איטרציה היא Θ(logn) במקרה הגרוע. ולכן, סה"כ היעילות במקרה הגרוע היא.Θ(nlogn) ב. אלגוריתם יעיל ככל האפשר במקרה הממוצע. 1. נמפה את כל המספרים לטבלת ערבול בגודל Θ(n) m = שבה התנגשויות נפתרות ע"י שרשור. נשתמש בפונקצית הערבול k m.h(k) = מכיוון שהקלט לקוח בהתפלגות שווה מהתחום (0,1) אז זו פונקצית ערבול אחידה. 2. נעבור שוב על רשימת המספרים ולכל מספר b נבדוק אם יש כבר בטבלה מספר a. = b אם כן, נעצור ונחזיר.a,b 3. אם לא מצאנו בכל שלב 2 זוג כזה נחזיר "לא". הערה: אפשר למעשה לבצע את שלב 2 תוך כדי שלב 1. יעילות: העומס של הטבלה הוא (1)Θ α. = n/m = לכן, הכנסת מספר לטבלה תיקח בממוצע (1)Θ Θ(1+α) = פעולות, וכך גם חיפוש בטבלה. ולכן, הכנסה וחיפוש של n מספרים תיקח בממוצע Θ(n) פעולות.