שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 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), הפתרון הוא ****.
מסקנה: כן, השינוי משנה את זמן הריצה של האלגוריתם. הוא הופך אותו מלינארי, , ללינארי-לוגריתמי, , מה שהופך אותו לא יעיל יותר מאשר פשוט למיין את המערך כולו () ולבחור את האיבר ה-.
האלגוריתם המשונן מחלק את המערך של איברים ל-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), הפתרון הוא ****.
מסקנה: כן, השינוי משנה את זמן הריצה של האלגוריתם. הוא הופך אותו מלינארי, , ללינארי-לוגריתמי, , מה שהופך אותו לא יעיל יותר מאשר פשוט למיין את המערך כולו () ולבחור את האיבר ה-.