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

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

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

תיאור האלגוריתם:
1. ניצור מערך פלט B בגודל
.
2. ניצור ערימת מינימום H. הערימה תחזיק זוגות (tuples) מהצורה (value, list_index), כאשר value הוא ערך האיבר ו-list_index הוא האינדקס של תת-המערך שממנו הגיע האיבר (מ-0 עד
).
3. נאתחל את הערימה: עבור כל אחד מ-
תת-המערכים, נכניס לערימה את האיבר הראשון שלו יחד עם אינדקס תת-המערך. כלומר, עבור , נכניס לערימה את הזוג (A[i*(n/k)], i). בנוסף, נשמור מערך עזר pointers בגודל שיצביע לאינדקס הבא שיש לקרוא מכל תת-מערך (מאותחל ל-1 עבור כולם).
4. נבצע
איטרציות, ובכל איטרציה נבצע את הפעולות הבאות:
א. נשלוף מהערימה H את הזוג בעל הערך הקטן ביותר. פעולה זו נקראת extract-min. נסמן את הזוג ששלפנו ב-(v, i).

ב. נוסיף את הערך v למערך הפלט B.

ג. ניגש לתת-המערך שממנו הגיע האיבר (אינדקס i). אם תת-המערך טרם הסתיים (כלומר, האינדקס ששמור ב-pointers[i] עדיין בתחום של תת-המערך), נכניס לערימה את האיבר הבא מאותו תת-מערך. כלומר, את הזוג (value, i) כאשר value הוא האיבר הבא, ונקדם את pointers[i] ב-1.


לאחר
איטרציות, הערימה תהיה ריקה ומערך הפלט B יכיל את כל איברי בסדר ממוין.

ניתוח סיבוכיות זמן:
- אתחול הערימה (שלב 3): אנו מכניסים
איברים לערימה. כל פעולת הכנסה לערימה שגודלה עד לוקחת . לכן, שלב האתחול לוקח .
- הלולאה הראשית (שלב 4): הלולאה רצה
פעמים, פעם אחת עבור כל איבר במערך הקלט.
- בכל איטרציה, אנו מבצעים פעולת extract-min אחת ופעולת insert אחת (לכל היותר).

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

סיבוכיות הזמן הכוללת של האלגוריתם היא הסכום של שלב האתחול והלולאה הראשית:
. מאחר שבדרך כלל , הביטוי הדומיננטי הוא , כנדרש בשאלה.