שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2021 - חיפוש

(25) יהי מעורד עם איברים שוני. נאמר כי הוא מעורד מוצא כאשר קיים מפתח מעורד מוצא שאחרי החזות האיברים מעמדות שונות בעמדה שמאלו ויימנו מעלי במנחולים מעומרים משנהל מעורד מינימלי.

לדוגמה: הטבלה הבאה חזות המעורד מוצא
עם מעלויו מנחולים:
A[1]A[2]A[3]A[4]A[5]A[6]A[7]
4565358915

(א) כתוב אלגוריתם ממעורד מוצא על A עם
איברים שונים מעמלו בעמדה שמאל וימין אם המעורד עם כתובת ב- היא בעמדה שמאל למשקפות מהווה הריצה זיקם הריצה , וזיקם הריצה .

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

**(א) אלגוריתם בסיבוכיות
**
ניתן למצוא את האיבר המינימלי במערך באמצעות סריקה לינארית פשוטה.

1. נאתחל משתנה min_val עם ערך האיבר הראשון במערך,
(בהנחת אינדוקס מ-0).
2. נעבור על כל איברי המערך החל מהאיבר השני, i מ-1 עד
.
3. בכל איטרציה, נשווה את
עם min_val. אם , נעדכן את min_val לערך .
4. בסיום הלולאה, min_val יכיל את הערך המינימלי במערך.


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

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


1. נאתחל שני מצביעים: low = 0, high = n-1.
2. אם המערך אינו מוזז כלל (
), האיבר המינימלי הוא .
3. כל עוד low < high, נבצע:

א. נחשב את האינדקס האמצעי: mid = floor((low + high) / 2).

ב. נשווה את האיבר האמצעי
עם האיבר בקצה הימני של המקטע הנוכחי, .
* אם
: הדבר מעיד על כך שנקודת השבר (והאיבר המינימלי) נמצאת בחלק הימני של המערך, כלומר בין mid+1 ל-high. לכן, נקדם את הגבול התחתון: low = mid + 1.
* אם
: הדבר מעיד על כך שהחלק מהאמצע ועד הסוף, כלומר , הוא מקטע ממוין. לכן, האיבר המינימלי יכול להיות עצמו, או שהוא נמצא משמאלו. לכן, נקטין את טווח החיפוש לחלק השמאלי (כולל mid): high = mid.

4. הלולאה מסתיימת כאשר low = high. בשלב זה, המצביע low (וכן high) יצביע על האיבר המינימלי במערך. נחזיר את
.

ניתוח סיבוכיות:
* סיבוכיות זמן: בכל איטרציה של הלולאה, אנחנו מצמצמים את טווח החיפוש בערך בחצי. זהו המאפיין של חיפוש בינארי, ולכן סיבוכיות הזמן היא
.
* סיבוכיות מקום: האלגוריתם בגרסתו האיטרטיבית משתמש בכמות קבועה של זיכרון נוסף, ולכן סיבוכיות המקום היא
.