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

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

א( כמה איברים (לפחות) מצליח לנפות "חציון החציונים" לאחר השינוי?


ב( תאר/י נוסחא לזמן הריצה של האלגוריתם, ופתור/פתרי אותה. האם השינוי משנה את זמן הריצה של האלגוריתם? (שימו לב – כפי שניתחנו בכיתה, הנוסחא אינה מדויקת, אלא היא הערכה בלבד).
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2010סמסטר ב
סיבוכיות זמןנוסחת נסיגהמעקב אחר אלגוריתם
בחנו כיצד שינוי גודל הקבוצות מ-5 ל-3 משפיע על מספר האיברים שניתן להבטיח שהם קטנים או גדולים מאיבר הציר ("חציון החציונים"). מכאן, גזרו את נוסחת הנסיגה החדשה.
### סעיף א: מספר האיברים המנופים

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

המטרה שלנו היא למצוא חסם תחתון למספר האיברים שגדולים מ-
וחסם תחתון למספר האיברים שקטנים מ-. זה ייתן לנו חסם על גודל תת-הבעיה הרקורסיבית הבאה.

- ישנן
rac{n}{3} קבוצות, ולכן rac{n}{3} חציונים.
- איבר הציר
הוא החציון של rac{n}{3} החציונים הללו.
- לכן, לפחות מחצית מהחציונים קטנים או שווים ל-
. מספרם הוא לפחות .
- כל חציון כזה, בקבוצה המקורית שלו בת 3 איברים, גדול או שווה לפחות מאיבר אחד נוסף. לכן, כל קבוצה כזו תורמת לפחות 2 איברים שקטנים או שווים ל-
.
- בסך הכל, מספר האיברים שקטנים או שווים ל-
הוא לפחות .

באופן סימטרי, מספר האיברים שגדולים או שווים ל-
הוא גם לפחות .

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

לכן, האלגוריתם מצליח לנפות **לפחות
איברים** בכל קריאה רקורסיבית.

### סעיף ב: נוסחת נסיגה וזמן ריצה


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

לפיכך, נוסחת הנסיגה לזמן הריצה היא:


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

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

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