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

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

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

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


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

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

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


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

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

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


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

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



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

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


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