שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2013 - מיון
נתון משדר 4 מוגדר כ- בגרישות לדרך של פרמטרים . בצורתונו לזידרה עם דרך בינו המאחדים את אינדקסי ממחדד בך ש - הוא מידה כללית מדוקדק, הם הקצרובים הממתנים ינו הן קצרובים מדוקדק. ובכן עם שו - הם הקצרובים הממתנים לכינו המחדדים הממחיקים המוגדרים הממתנים. הרח"אח. הרח. אידך לדעות זרך .
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2013סמסטר ב
★★★★★
מיוןערימה בינאריתתור עדיפויותסיבוכיות זמןמיון מיזוג
ניתן לראות את הבעיה כמיזוג של תת-מערכים ממוינים. השתמשו בתור עדיפויות (ערימת מינימום) כדי למצוא ביעילות את האיבר הקטן ביותר מבין כל ראשי תת-המערכים בכל שלב.
השאלה, כפי שניתן להסיק מהנתונים והסיבוכיות הנדרשת, עוסקת במיון מערך בגודל אשר מורכב משרשור של תת-מערכים, כאשר כל תת-מערך ממוין וגודלו . המטרה היא למיין את המערך כולו בסיבוכיות זמן של .
בעיה זו היא למעשה בעיית **מיזוג של רשימות ממוינות. כדי לפתור אותה ביעילות, נשתמש בתור עדיפויות (Priority Queue) הממומש באמצעות ערימת מינימום** (Min-Heap). הערימה תסייע לנו למצוא בכל שלב את האיבר הקטן ביותר מבין כל האיברים הזמינים מכל תת-המערכים.
תיאור האלגוריתם:
1. ניצור מערך פלט
2. ניצור ערימת מינימום
3. נאתחל את הערימה: עבור כל אחד מ- תת-המערכים, נכניס לערימה את האיבר הראשון שלו יחד עם אינדקס תת-המערך. כלומר, עבור , נכניס לערימה את הזוג
4. נבצע איטרציות, ובכל איטרציה נבצע את הפעולות הבאות:
א. נשלוף מהערימה
ב. נוסיף את הערך
ג. ניגש לתת-המערך שממנו הגיע האיבר (אינדקס
לאחר איטרציות, הערימה תהיה ריקה ומערך הפלט
ניתוח סיבוכיות זמן:
- אתחול הערימה (שלב 3): אנו מכניסים איברים לערימה. כל פעולת הכנסה לערימה שגודלה עד לוקחת . לכן, שלב האתחול לוקח .
- הלולאה הראשית (שלב 4): הלולאה רצה פעמים, פעם אחת עבור כל איבר במערך הקלט.
- בכל איטרציה, אנו מבצעים פעולת
- גודל הערימה נשאר (או פחות, לקראת הסוף) לאורך כל ריצת האלגוריתם, מכיוון שעל כל איבר שיוצא, נכנס איבר חדש (עד שאחד התת-מערכים נגמר).
- לכן, כל איטרציה לוקחת .
- סה"כ סיבוכיות הלולאה: .
סיבוכיות הזמן הכוללת של האלגוריתם היא הסכום של שלב האתחול והלולאה הראשית: . מאחר שבדרך כלל , הביטוי הדומיננטי הוא , כנדרש בשאלה.
בעיה זו היא למעשה בעיית **מיזוג של רשימות ממוינות. כדי לפתור אותה ביעילות, נשתמש בתור עדיפויות (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 אחת (לכל היותר). - גודל הערימה נשאר (או פחות, לקראת הסוף) לאורך כל ריצת האלגוריתם, מכיוון שעל כל איבר שיוצא, נכנס איבר חדש (עד שאחד התת-מערכים נגמר).
- לכן, כל איטרציה לוקחת .
- סה"כ סיבוכיות הלולאה: .
סיבוכיות הזמן הכוללת של האלגוריתם היא הסכום של שלב האתחול והלולאה הראשית: . מאחר שבדרך כלל , הביטוי הדומיננטי הוא , כנדרש בשאלה.