שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2023 - סיבוכיות זמן

[4]
(25 נקודות)


רביעייה פיתגורית היא רביעיה של ארבעה מספרים שלמים חיוביים כך ש .

בהינתן מערך המכיל מספרים שלמים חיוביים,
תארו אלגוריתם הרץ בזמן
בממוצע
או אלגוריתם אחר הרץ בזמן
במקרה הגרוע
המחליט האם קיים ב
רביעייה פיתגורית, כאשר מספרים מ יכולים להופיע יותר מפעם אחת באותה הרביעייה.
הראו אחת משתי האפשרויות.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א · 2023 · סמסטר ב
★★★★★
סיבוכיות זמןטבלאות גיבובפונקציית גיבובניתוח מופחת
שנו את המשוואה לצורה . כעת, חשבו כיצד למצוא ביעילות ערך משותף בין קבוצת הסכומים וקבוצת ההפרשים.
הבעיה דורשת למצוא האם קיימים ארבעה מספרים במערך הנתון (עם אפשרות לחזרות) המקיימים את המשוואה . אלגוריתם נאיבי הבודק את כל הרביעיות האפשריות ידרוש זמן של , שאינו יעיל מספיק.

כדי לשפר את הסיבוכיות, נארגן מחדש את המשוואה כדי שנוכל להשתמש בטכניקת "פגישה באמצע" (meet-in-the-middle). נעביר את אגף ונקבל:



כעת, הבעיה הופכת לחיפוש ערך משותף בין קבוצת כל הסכומים מהצורה וקבוצת כל ההפרשים מהצורה , כאשר הם איברים מהמערך .

ניתן לפתור זאת ביעילות באמצעות טבלת גיבוב (hash table) כדי להשיג סיבוכיות זמן ממוצעת של .

להלן תיאור האלגוריתם:

1. יצירת קבוצת סכומים: ניצור טבלת גיבוב (או קבוצה מבוססת גיבוב, hash set) בשם sums_set. נעבור על כל הזוגות האפשריים של איברים מהמערך (ישנם זוגות כאלה). עבור כל זוג, נחשב את הסכום ונכניס אותו ל-sums_set.
שלב זה דורש
איטרציות. כל הכנסה לטבלת גיבוב לוקחת בממוצע , ולכן הסיבוכיות הממוצעת של שלב זה היא .

2. חיפוש הפרשים תואמים: נעבור שוב על כל הזוגות האפשריים של איברים מהמערך . עבור כל זוג, נחשב את ההפרש .
נבדוק האם הערך
קיים בטבלת הגיבוב sums_set. פעולת החיפוש בטבלת גיבוב לוקחת בממוצע. אם נמצא ב-sums_set, המשמעות היא שמצאנו זוג וזוג כך ש-. במקרה זה, מצאנו רביעייה פיתגורית, והאלגוריתם יכול להחזיר True ולסיים.
שלב זה כולל
איטרציות, ובכל אחת מהן מתבצע חישוב וחיפוש בטבלת גיבוב. לכן, הסיבוכיות הממוצעת של שלב זה היא .

3. סיום ללא מציאה: אם האלגוריתם מסיים את כל הלולאות בשלב 2 ולא מוצא התאמה, פירוש הדבר שלא קיימת רביעייה פיתגורית במערך . במקרה זה, האלגוריתם יחזיר False.

ניתוח סיבוכיות:
  • סיבוכיות זמן: שני השלבים העיקריים פועלים בזמן בממוצע. לכן, סיבוכיות הזמן הכוללת של האלגוריתם היא בממוצע. במקרה הגרוע (התנגשויות רבות בטבלת הגיבוב), הסיבוכיות עלולה להיות גבוהה יותר, אך בממוצע היא עומדת בדרישה.
  • סיבוכיות מקום: טבלת הגיבוב sums_set עשויה לאחסן עד ערכים שונים. לכן, סיבוכיות המקום של האלגוריתם היא .


האלגוריתם המוצג פותר את הבעיה בסיבוכיות הזמן הממוצעת הנדרשת.