שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2023 - סיבוכיות זמן
[4]
(25 נקודות)
רביעייה פיתגורית היא רביעיה של ארבעה מספרים שלמים חיוביים כך ש .
בהינתן מערך המכיל מספרים שלמים חיוביים,
תארו אלגוריתם הרץ בזמן בממוצע
או אלגוריתם אחר הרץ בזמן במקרה הגרוע
המחליט האם קיים ב רביעייה פיתגורית, כאשר מספרים מ יכולים להופיע יותר מפעם אחת באותה הרביעייה.
הראו אחת משתי האפשרויות.
(25 נקודות)
רביעייה פיתגורית היא רביעיה של ארבעה מספרים שלמים חיוביים כך ש .
בהינתן מערך המכיל מספרים שלמים חיוביים,
תארו אלגוריתם הרץ בזמן בממוצע
או אלגוריתם אחר הרץ בזמן במקרה הגרוע
המחליט האם קיים ב רביעייה פיתגורית, כאשר מספרים מ יכולים להופיע יותר מפעם אחת באותה הרביעייה.
הראו אחת משתי האפשרויות.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2023סמסטר ב
★★★★★
סיבוכיות זמןטבלאות גיבובפונקציית גיבובניתוח מופחת
שנו את המשוואה לצורה . כעת, חשבו כיצד למצוא ביעילות ערך משותף בין קבוצת הסכומים וקבוצת ההפרשים.
הבעיה דורשת למצוא האם קיימים ארבעה מספרים במערך הנתון (עם אפשרות לחזרות) המקיימים את המשוואה . אלגוריתם נאיבי הבודק את כל הרביעיות האפשריות ידרוש זמן של , שאינו יעיל מספיק.
כדי לשפר את הסיבוכיות, נארגן מחדש את המשוואה כדי שנוכל להשתמש בטכניקת "פגישה באמצע" (meet-in-the-middle). נעביר את אגף ונקבל:
כעת, הבעיה הופכת לחיפוש ערך משותף בין קבוצת כל הסכומים מהצורה וקבוצת כל ההפרשים מהצורה , כאשר הם איברים מהמערך .
ניתן לפתור זאת ביעילות באמצעות טבלת גיבוב (hash table) כדי להשיג סיבוכיות זמן ממוצעת של .
להלן תיאור האלגוריתם:
1. יצירת קבוצת סכומים: ניצור טבלת גיבוב (או קבוצה מבוססת גיבוב, hash set) בשם
שלב זה דורש איטרציות. כל הכנסה לטבלת גיבוב לוקחת בממוצע , ולכן הסיבוכיות הממוצעת של שלב זה היא .
2. חיפוש הפרשים תואמים: נעבור שוב על כל הזוגות האפשריים של איברים מהמערך . עבור כל זוג, נחשב את ההפרש .
נבדוק האם הערך קיים בטבלת הגיבוב
שלב זה כולל איטרציות, ובכל אחת מהן מתבצע חישוב וחיפוש בטבלת גיבוב. לכן, הסיבוכיות הממוצעת של שלב זה היא .
3. סיום ללא מציאה: אם האלגוריתם מסיים את כל הלולאות בשלב 2 ולא מוצא התאמה, פירוש הדבר שלא קיימת רביעייה פיתגורית במערך . במקרה זה, האלגוריתם יחזיר
ניתוח סיבוכיות:
- סיבוכיות זמן: שני השלבים העיקריים פועלים בזמן בממוצע. לכן, **סיבוכיות הזמן הכוללת של האלגוריתם היא בממוצע**. במקרה הגרוע (התנגשויות רבות בטבלת הגיבוב), הסיבוכיות עלולה להיות גבוהה יותר, אך בממוצע היא עומדת בדרישה.
- סיבוכיות מקום: טבלת הגיבוב
האלגוריתם המוצג פותר את הבעיה בסיבוכיות הזמן הממוצעת הנדרשת.
כדי לשפר את הסיבוכיות, נארגן מחדש את המשוואה כדי שנוכל להשתמש בטכניקת "פגישה באמצע" (meet-in-the-middle). נעביר את אגף ונקבל:
כעת, הבעיה הופכת לחיפוש ערך משותף בין קבוצת כל הסכומים מהצורה וקבוצת כל ההפרשים מהצורה , כאשר הם איברים מהמערך .
ניתן לפתור זאת ביעילות באמצעות טבלת גיבוב (hash table) כדי להשיג סיבוכיות זמן ממוצעת של .
להלן תיאור האלגוריתם:
1. יצירת קבוצת סכומים: ניצור טבלת גיבוב (או קבוצה מבוססת גיבוב, hash set) בשם
sums_set. נעבור על כל הזוגות האפשריים של איברים מהמערך (ישנם זוגות כאלה). עבור כל זוג, נחשב את הסכום ונכניס אותו ל-sums_set.שלב זה דורש איטרציות. כל הכנסה לטבלת גיבוב לוקחת בממוצע , ולכן הסיבוכיות הממוצעת של שלב זה היא .
2. חיפוש הפרשים תואמים: נעבור שוב על כל הזוגות האפשריים של איברים מהמערך . עבור כל זוג, נחשב את ההפרש .
נבדוק האם הערך קיים בטבלת הגיבוב
sums_set. פעולת החיפוש בטבלת גיבוב לוקחת בממוצע. אם נמצא ב-sums_set, המשמעות היא שמצאנו זוג וזוג כך ש-. במקרה זה, מצאנו רביעייה פיתגורית, והאלגוריתם יכול להחזיר True ולסיים.שלב זה כולל איטרציות, ובכל אחת מהן מתבצע חישוב וחיפוש בטבלת גיבוב. לכן, הסיבוכיות הממוצעת של שלב זה היא .
3. סיום ללא מציאה: אם האלגוריתם מסיים את כל הלולאות בשלב 2 ולא מוצא התאמה, פירוש הדבר שלא קיימת רביעייה פיתגורית במערך . במקרה זה, האלגוריתם יחזיר
False.ניתוח סיבוכיות:
- סיבוכיות זמן: שני השלבים העיקריים פועלים בזמן בממוצע. לכן, **סיבוכיות הזמן הכוללת של האלגוריתם היא בממוצע**. במקרה הגרוע (התנגשויות רבות בטבלת הגיבוב), הסיבוכיות עלולה להיות גבוהה יותר, אך בממוצע היא עומדת בדרישה.
- סיבוכיות מקום: טבלת הגיבוב
sums_set עשויה לאחסן עד ערכים שונים. לכן, **סיבוכיות המקום של האלגוריתם היא **.האלגוריתם המוצג פותר את הבעיה בסיבוכיות הזמן הממוצעת הנדרשת.