שאלת מבחן במבוא למדעי המחשב - האוניברסיטה הפתוחה 2018 - מערכים
נתון מערך מלא במספרים שלמים, שבו כל מספר מופיע פעמיים ברצף פרט למספר אחד שמופיע רק פעם אחת. המערך אינו ממוין.
לדוגמא, המערכים הבאים מקיימים את התנאי:
-
-
-
כתבו שיטה סטטית שמקבלת כפרמטר מערך שמקיים את התנאי הנ"ל, ומחזירה את המספר שמופיע במערך רק פעם אחת.
אתם יכולים להניח שהמערך אינו ריק ושהוא מקיים את התנאי, אין צורך לבדוק זאת.
חתימת השיטה היא:
שימו לב: השיטה שתכתבו צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום. תשובה שאינה יעילה מספיק כלומר, שתהיה בסיבוכיות גדולה יותר מזו הנדרשת לפתרון הבעיה תקבל מעט נקודות בלבד.
מה סיבוכיות זמן הריצה של השיטה שכתבתם! הסבירו תשובתכם.
לדוגמא, המערכים הבאים מקיימים את התנאי:
-
a = {6, 6, 18, 18, -4, -4, 12, 9, 9} - המספר הבודד הוא 12 באינדקס 6-
b = {8, 8, -7, -7, 3, 3, 0, 0, 10, 10, 5, 5, 4} - המספר הבודד הוא 4 באינדקס 12-
c = {5} - המספר הבודד הוא 5 באינדקס 0כתבו שיטה סטטית שמקבלת כפרמטר מערך שמקיים את התנאי הנ"ל, ומחזירה את המספר שמופיע במערך רק פעם אחת.
אתם יכולים להניח שהמערך אינו ריק ושהוא מקיים את התנאי, אין צורך לבדוק זאת.
חתימת השיטה היא:
שימו לב: השיטה שתכתבו צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום. תשובה שאינה יעילה מספיק כלומר, שתהיה בסיבוכיות גדולה יותר מזו הנדרשת לפתרון הבעיה תקבל מעט נקודות בלבד.
מה סיבוכיות זמן הריצה של השיטה שכתבתם! הסבירו תשובתכם.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחה832018סמסטר ב
★★★★★
מערכיםחיפוש בינאריסיבוכיות זמןסיבוכיות מקוםשיטות סטטיות
שימו לב שכל זוג מופיע ברצף — לכן האיבר הבודד תמיד יושב באינדקס זוגי, וניתן לבדוק לכל אינדקס זוגי האם ובכך לדעת באיזה חצי של המערך להמשיך לחפש.
## פתרון: חיפוש בינארי
### תובנת המפתח
מכיוון שכל זוג מופיע ברצף (שתי פעמים צמודות), המבנה של המערך הוא:
תצפית קריטית: האיבר הבודד נמצא תמיד באינדקס זוגי.
- לפני האיבר הבודד: כל אינדקס זוגי מקיים
- אחרי האיבר הבודד: כל אינדקס זוגי מקיים
לכן ניתן להפעיל חיפוש בינארי על האינדקסים הזוגיים!
### השיטה
### מעקב על הדוגמאות
דוגמה א':
- : (זוגי), →
- : (אי-זוגי) → , →
- → מחזירים ✓
דוגמה ב':
- : , →
- : , →
- → מחזירים ✓
דוגמה ג':
- מיד → מחזירים ✓
---
## סיבוכיות זמן הריצה
**סיבוכיות הזמן: **
הסבר: בכל איטרציה של לולאת ה-
- אם
- אם
מספר האיטרציות הוא , וכל איטרציה מבצעת מספר קבוע של פעולות.
**סיבוכיות המקום: ** — משתמשים רק בכמה משתנים קבועים (, , ) ללא תלות בגודל הקלט.
זוהי הסיבוכיות האופטימלית: האיבר הבודד יכול להופיע בכל אחד מ- מקומות אפשריים, ולכן נדרשות לפחות השוואות.
### תובנת המפתח
מכיוון שכל זוג מופיע ברצף (שתי פעמים צמודות), המבנה של המערך הוא:
תצפית קריטית: האיבר הבודד נמצא תמיד באינדקס זוגי.
- לפני האיבר הבודד: כל אינדקס זוגי מקיים
- אחרי האיבר הבודד: כל אינדקס זוגי מקיים
לכן ניתן להפעיל חיפוש בינארי על האינדקסים הזוגיים!
### השיטה
### מעקב על הדוגמאות
דוגמה א':
{6, 6, 18, 18, -4, -4, 12, 9, 9}, בודד באינדקס 6- : (זוגי), →
- : (אי-זוגי) → , →
- → מחזירים ✓
דוגמה ב':
{8,8,-7,-7,3,3,0,0,10,10,5,5,4}, בודד באינדקס 12- : , →
- : , →
- → מחזירים ✓
דוגמה ג':
{5}- מיד → מחזירים ✓
---
## סיבוכיות זמן הריצה
**סיבוכיות הזמן: **
הסבר: בכל איטרציה של לולאת ה-
while, טווח החיפוש מתמצמץ לפחות בחצי. ספציפית, מגיעים ל- זוגי ואז:- אם
a[mid] == a[mid+1]: , כלומר הטווח מתמצמץ כמעט בחצי- אם
a[mid] != a[mid+1]: , כלומר הטווח מתמצמץ לפחות בחצימספר האיטרציות הוא , וכל איטרציה מבצעת מספר קבוע של פעולות.
**סיבוכיות המקום: ** — משתמשים רק בכמה משתנים קבועים (, , ) ללא תלות בגודל הקלט.
זוהי הסיבוכיות האופטימלית: האיבר הבודד יכול להופיע בכל אחד מ- מקומות אפשריים, ולכן נדרשות לפחות השוואות.