שאלת מבחן במבוא למדעי המחשב - האוניברסיטה הפתוחה 2017 - חיפוש בינארי

השיטה הבאה אמורה למצוא איבר x בתוך מערך חד-ממדי a בעזרת חיפוש בינרי. המערך מלא במספרים שלמים מסודרים בסדר לא-יורד.



סעיף ב: (5 נקודות)
איזה שינוי (אם בכלל) צריך לעשות כדי לתקן את השיטה f שלעיל? סמנו תשובתכם על השאלון.


1. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] < x) i = k-1; else j = k+1;


2. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] < x) i = k+1; else j = k-1;


3. לשנות את תנאי ה-if הראשון לתנאי הזה:
if (a[k] <= x) i = k; else j = k;


4. לשנות את תנאי ה-while לתנאי הזה:
while ((a[k] == x) && (i < j));


5. אין צורך לשנות כלום. הקוד תקין.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחה862017סמסטר א
חיפוש בינארימערכים
בדקו מה קורה לגבולות i ו-j כאשר k = i: האם הטווח מצטמצם בהכרח בכל איטרציה? חפשו תיקון שמבטיח שהטווח תמיד יצטמצם ב-לפחות אחד.
## ניתוח הבאג בקוד המקורי

הבעיה המרכזית בקוד המקורי היא אפשרות ללולאה אינסופית. נבדוק מה קורה עם i=0, j=1:




אם a[0] < x, אז מתבצע i = k = 0 — כלומר i לא השתנה! תנאי הלולאה a[k] != x && i < j עדיין מתקיים ← לולאה אינסופית.


הבאג: כאשר i = k (ובאופן סימטרי j = k), הטווח
אינו מצטמצם בהכרח.

---


## בדיקת האפשרויות
אפשרותתיאורבעיה
1i = k-1 / j = k+1שגוי — מרחיב את הטווח במקום לצמצם
2i = k+1 / j = k-1
3if (a[k] <= x) i = k; else j = k;שגוי — עדיין עלולה ללולאה אינסופית כאשר a[k]=x
4שינוי תנאי ה-while ל-a[k]==xשגוי לחלוטין — עוצר רק כשמצא, לא מסיים כשלא מצא
5הקוד תקין כמות שהואשגוי

---


## התשובה הנכונה: אפשרות 2




מדוע זה נכון?


- אם a[k] < x: כל האיברים עד
קטנים מ- (המערך ממוין) ← בצדק נעביר
- אם a[k] >= x: ← בצדק נעביר

- בכל מקרה
מצטמצם בקפדנות בכל איטרציה ← אין לולאה אינסופית

שימו לב: אם a[k] == x, ה-else יריץ j = k-1, אך אז תנאי ה-while בודק a[k] != x — שהוא שקר, ולכן הלולאה מיד נעצרת וה-k עדיין מצביע על האיבר שנמצא ✓
שאלת מבחן במבוא למדעי המחשב - האוניברסיטה הפתוחה 2017 | prepd