שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 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 עשויה לאחסן עד
ערכים שונים. לכן, **סיבוכיות המקום של האלגוריתם היא **.

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