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

נתון מערך בגודל של מספרים ממשיים, שבו יכולות להיות כפילויות.
נסמן ב-
את מספר הערכים השונים המופיעים במערך (, לא ידוע מראש).

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

כל הערכים המופיעים במערך שלוש פעמים או יותר- עותק אחד מכל ערך בסדר ממוין, וכן הלאה.

פתרו בזמן
. מותר להקצות מקום נוסף בגודל .

דוגמא:
בהינתן המערך
הבא-
5 7 3 1 1 5 5 3 1 3 3 2 4
נקבל-
1 2 3 4 5 7 1 3 5 1 3 5 3
ב) (13 נקודות) כתבו שגרה שמעתיקה את איברי מערך לתוך מערך בסדר הבא:
ערכי האיברים ששכיחותם היא הגבוהה ביותר- את כל העותקים ובסדר ממוין,

ערכי האיברים ששכיחותם היא השנייה בגודלה- את כל העותקים ובסדר ממוין,

ערכי האיברים ששכיחותם היא השלישית בגודלה- את כל העותקים ובסדר ממוין,

וכן הלאה.

פתרו בזמן
.
מותר להקצות רק מערך אחד- מערך הפלט
באורך . אבל מותר שכל איבר בו יכיל כמה שדות.

דוגמא:
בהינתן המערך
הבא-
5 7 3 1 1 5 5 3 1 3 3 2 4
נקבל-
3 3 3 3 1 1 1 5 5 5 2 4 7
הערות:
  • בשאלות אלגוריתמיות יש להקפיד על כתיבת רעיון, אלגוריתם, נכונות וסיבוכיות.
  • אלגוריתם = שגרה = סדרת פקודות מוגדרות היטב בעברית או באנגלית.
  • שימו לב לדייק בנכונות ובחישוב היעילות.
  • כל אחד מהסעיפים עומד בפני עצמו, וניתן לפתרון גם אם לא פתרתם הסעיף האחר.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמועד ב2025סמסטר ב
מיוןסיבוכיותמערכיםאלגוריתמיםעצי חיפושמבנה נתונים
לסעיף א', השתמשו במבנה נתונים יעיל (כמו עץ חיפוש מאוזן) כדי למנות את שכיחות האיברים ולאחר מכן לבנות את הפלט. לסעיף ב', בצעו את כל החישובים "במקום" על גבי מערך הפלט B, החל מהעתקה ומיון של הנתונים, דרך כיווץ לזוגות (ערך, שכיחות), מיון הזוגות, והרחבה חזרה.
סעיף א)
רעיון

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

לאחר מכן, ניצור מערך של רשימות, כאשר הרשימה במקום ה- תחזיק את כל הערכים המופיעים במערך לפחות פעמים, בסדר ממוין. נוכל לאכלס רשימות אלו ביעילות על ידי סריקה סדורה (in-order traversal) של עץ החיפוש. סריקה כזו תיתן לנו את הערכים השונים בסדר ממוין. עבור כל ערך עם שכיחות , נוסיף את לרשימות .

לבסוף, נשרשר את כל הרשימות לפי הסדר (רשימה 1, אחריה רשימה 2, וכן הלאה) כדי לקבל את מערך הפלט .

אלגוריתם

1. צור עץ חיפוש בינארי מאוזן ריק, , שיאחסן זוגות (ערך, שכיחות).
2. עבור על כל איבר
במערך :
א. חפש את
ב-.
ב. אם
נמצא עם שכיחות , עדכן את שכיחותו ל-.
ג. אם
לא נמצא, הכנס צומת חדש ל-.
3. צור מערך
בגודל של רשימות מקושרות ריקות.
4. בצע סריקה סדורה (in-order) על העץ
. עבור כל צומת שפוגשים:
א. עבור
מ- עד , הוסף את הערך לסוף הרשימה .
5. צור מערך פלט
בגודל . אתחל אינדקס .
6. עבור
מ- עד :
א. עבור כל איבר
ברשימה (לפי סדר הופעתם):
i. קבע
.
ii. קדם את
ב-1.
7. החזר את
.

הוכחת נכונות

שלבים 1-2 מונים נכונה את שכיחות כל אחד מ- הערכים השונים ב- ומאחסנים אותם ב-. מאחר ש- הוא עץ חיפוש, ערכיו ייחודיים.

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

שלבים 5-7 בונים את מערך הפלט על ידי שרשור הרשימות לפי הסדר. זה בדיוק המבנה הנדרש בשאלה: תחילה כל הערכים המופיעים לפחות פעם אחת (ממוינים), לאחר מכן כל הערכים המופיעים לפחות פעמיים (ממוינים), וכן הלאה. סך כל האיברים שיוכנסו ל- הוא , ולכן המערך יתמלא במלואו. ניתוח סיבוכיות
  • זמן ריצה:
  • שלב 2: מבצע פעולות על עץ חיפוש מאוזן המכיל לכל היותר איברים. כל פעולה (חיפוש, הכנסה, עדכון) לוקחת זמן. סה"כ: .
  • שלב 3: אתחול מערך של רשימות לוקח .
  • שלב 4: סריקה סדורה של עץ עם צמתים לוקחת . מספר פעולות ההוספה הכולל לכל הרשימות הוא . כל הוספה לסוף רשימה מקושרת לוקחת . סה"כ: .
  • שלב 6: מעבר על כל האיברים בכל הרשימות. סך האיברים הוא , לכן שלב זה לוקח .
  • סה"כ זמן ריצה: .
  • סיבוכיות מקום:
  • עץ החיפוש דורש מקום.
  • מערך הרשימות מאחסן בסך הכל איברים. לכן דורש מקום.
  • מערך הפלט דורש מקום.
  • סה"כ מקום נוסף: .
הפתרון עומד בדרישות הזמן והמקום.
סעיף ב)
רעיון

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

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

אלגוריתם

1. הקצה מערך בגודל , כאשר כל תא ב- הוא מבנה (או זוג) היכול להכיל value ו-count.
2. העתק את המערך
ל-: עבור עד , קבע .
3. מיין את המערך
בסדר עולה לפי שדה ה-value של איבריו. השתמש באלגוריתם מיון בסיבוכיות (למשל, מיון מיזוג).
4. כווץ את
: אתחל אינדקס כתיבה ואינדקס קריאה .
א. כל עוד
:
i. שמור
.
ii. אתחל
.
iii. כל עוד
וגם : קדם את ו- .
iv. קבע
ו- .
v. קדם את
.
ב. שמור את מספר האיברים הייחודיים:
.
5. מיין את
האיברים הראשונים של , כלומר את התת-מערך . פונקציית ההשוואה בין שני זוגות ו- תהיה:
א. אם
, החזר את תוצאת ההשוואה (מיון בסדר יורד לפי שכיחות).
ב. אחרת (אם
), החזר את תוצאת ההשוואה (מיון בסדר עולה לפי ערך).
6. הרחב את
לפורמט הסופי: אתחל אינדקס כתיבה .
א. עבור
מ- עד (בסדר יורד):
i. שמור
ו- .
ii. עבור
מ- עד :
  • קבע .
  • הקטן את ב-1.
7. החזר את (ליתר דיוק, את הערכים שבשדה ה-value של איבריו).

הוכחת נכונות

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