שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2018 - סיבוכיות זמן
נתונים משתנים לא משורסכים שכללם בטחום שלמים בתחום . יחיא מ- הכמות הכוללת של אברים בכל המשתנים בחתחה. כמו אלגוריתמים שליהם פנימיים לפחות מחצית מהם שיוצאים אברים אחדים אתה אתה חד, הוקר כי בעל השמושופופוש בתיתן מופיסות כוללת .
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2018סמסטר ב
★★★★★
סיבוכיות זמןמיון ספירה
ניתן להשתמש במערך ספירה בגודל כדי לעקוב אחר מספר המערכים שבהם כל איבר מופיע. האתגר המרכזי הוא לעדכן את הספירה ביעילות, כך שכל ערך ייספר פעם אחת בלבד לכל היותר עבור כל מערך קלט.
המטרה היא למצוא את כל המספרים השלמים בתחום המופיעים בלפחות מהמערכים הנתונים. נשתמש במערך ספירה כדי לפתור את הבעיה ביעילות.
האלגוריתם המוצע הוא כדלקמן:
1. יצירת מבני עזר: ניצור מערך שלמים
2. מעבר על המערכים: נעבור בלולאה על כל אחד מ- המערכים, A_1, A_2, oils, A_m. עבור כל מערך :
א. ניצור רשימה ריקה,
ב. נעבור על כל איבר במערך . עבור כל כזה, נבדוק את הערך
i. אם
ii. אם
ג. לאחר סיום המעבר על כל איברי , נעבור על כל האיברים ברשימה
3. איסוף התוצאות: לאחר שסיימנו לעבד את כל המערכים, נעבור על המערך
4. החזרת התוצאה: נחזיר את רשימת התוצאות.
ניתוח סיבוכיות:
- שלב 1 (אתחול): יצירה ואתחול של שני מערכים בגודל לוקחת זמן של .
- שלב 2 (עיבוד המערכים): הלולאה החיצונית רצה פעמים. הלולאה הפנימית (שלב 2.ב) עוברת על כל איבר בכל המערכים פעם אחת בדיוק. מכיוון שהמספר הכולל של האיברים בכל המערכים הוא , סך הפעולות בשלב זה הוא פרופורציונלי ל-. שלב האיפוס (2.ג) רץ רק על האיברים הייחודיים שהופיעו במערך הנוכחי. סך כל האיברים הייחודיים על פני כל המערכים (בצורה זו) לא יכול לעלות על . לכן, הסיבוכיות הכוללת של שלב 2 היא .
- שלב 3 (איסוף התוצאות): המעבר על המערך
הסיבוכיות הכוללת של האלגוריתם היא הסכום של כל השלבים: .
האלגוריתם המוצע הוא כדלקמן:
1. יצירת מבני עזר: ניצור מערך שלמים
counts בגודל ונאתחל את כל תאיו ל-0. המערך counts ישמש לספירת מספר המערכים השונים שבהם מופיע כל איבר. כלומר, counts[j] יכיל את מספר המערכים שבהם המספר נמצא. בנוסף, ניצור מערך בוליאני seen_in_current_array בגודל ונאתחל את כל תאיו ל-false. מערך זה יעזור לנו לוודא שכל מספר ייספר פעם אחת בלבד עבור כל מערך .2. מעבר על המערכים: נעבור בלולאה על כל אחד מ- המערכים, A_1, A_2, oils, A_m. עבור כל מערך :
א. ניצור רשימה ריקה,
unique_elements_in_Ai, שתכיל את האיברים הייחודיים שפגשנו במערך הנוכחי.ב. נעבור על כל איבר במערך . עבור כל כזה, נבדוק את הערך
seen_in_current_array[x]:i. אם
seen_in_current_array[x] הוא false, זו הפעם הראשונה שאנו נתקלים במספר במערך . לכן, נקדם את counts[x] ב-1, נשנה את seen_in_current_array[x] ל-true, ונוסיף את לרשימה unique_elements_in_Ai.ii. אם
seen_in_current_array[x] הוא true, לא נעשה דבר, מכיוון שכבר ספרנו את הופעתו של במערך הנוכחי.ג. לאחר סיום המעבר על כל איברי , נעבור על כל האיברים ברשימה
unique_elements_in_Ai ונאפס את seen_in_current_array[y] בחזרה ל-false. שלב זה חיוני כדי להכין את מערך העזר seen_in_current_array לקראת עיבוד המערך הבא, .3. איסוף התוצאות: לאחר שסיימנו לעבד את כל המערכים, נעבור על המערך
counts מאינדקס 1 עד . ניצור רשימת תוצאות ריקה. לכל אינדקס שעבורו counts[j] >= m/2, נוסיף את לרשימת התוצאות.4. החזרת התוצאה: נחזיר את רשימת התוצאות.
ניתוח סיבוכיות:
- שלב 1 (אתחול): יצירה ואתחול של שני מערכים בגודל לוקחת זמן של .
- שלב 2 (עיבוד המערכים): הלולאה החיצונית רצה פעמים. הלולאה הפנימית (שלב 2.ב) עוברת על כל איבר בכל המערכים פעם אחת בדיוק. מכיוון שהמספר הכולל של האיברים בכל המערכים הוא , סך הפעולות בשלב זה הוא פרופורציונלי ל-. שלב האיפוס (2.ג) רץ רק על האיברים הייחודיים שהופיעו במערך הנוכחי. סך כל האיברים הייחודיים על פני כל המערכים (בצורה זו) לא יכול לעלות על . לכן, הסיבוכיות הכוללת של שלב 2 היא .
- שלב 3 (איסוף התוצאות): המעבר על המערך
counts דורש זמן.הסיבוכיות הכוללת של האלגוריתם היא הסכום של כל השלבים: .