שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2020 - סיבוכיות זמן
מבנה תומך בארבע פעולות על מערך .
כמו כן, נתון כי המערך מכיל מספרים טבעיים שונים.
להלן 4 הפעולות של המבנה :
* – חסום בזמן :
* איתחול המבנה
* – חסום בזמן :
* מחזיר את האיבר שהינו העשירי בגודלו בתת המערך בטווח מ- עד ואת האינדקס של (במקרה ש- הפונקציה תחזיר
* – חסום בזמן :
* מעדכן במערך את הערך באינדקס להיות .
* – חסום בזמן :
* מחזיר את האיבר באינדקס במערך .
תאר מימוש של מבנה נתונים העומד בדרישות הנ"ל או הוכח שלא קיים מבנה נתונים כזה.
דוגמא להבהרה:
נתון המערך הבא:
הפעולה תחזיר את הערך: 89 והאינדקס: 11.
הפעולה מערך לאחר הפעולה יהיה:
הפעולה תחזיר את הערך: 1
כמו כן, נתון כי המערך מכיל מספרים טבעיים שונים.
להלן 4 הפעולות של המבנה :
* – חסום בזמן :
* איתחול המבנה
* – חסום בזמן :
* מחזיר את האיבר שהינו העשירי בגודלו בתת המערך בטווח מ- עד ואת האינדקס של (במקרה ש- הפונקציה תחזיר
null).* – חסום בזמן :
* מעדכן במערך את הערך באינדקס להיות .
* – חסום בזמן :
* מחזיר את האיבר באינדקס במערך .
תאר מימוש של מבנה נתונים העומד בדרישות הנ"ל או הוכח שלא קיים מבנה נתונים כזה.
דוגמא להבהרה:
נתון המערך הבא:
הפעולה תחזיר את הערך: 89 והאינדקס: 11.
הפעולה מערך לאחר הפעולה יהיה:
הפעולה תחזיר את הערך: 1
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2020סמסטר ב
★★★★★
סיבוכיות זמןהוכחת אי-קיום
נסו להוכיח בדרך השלילה שלא קיים מבנה נתונים כזה. התמקדו בפעולת והראו, באמצעות טיעון יריב, שסיבוכיות הזמן שלה במקרה הגרוע חייבת להיות , בסתירה לדרישה.
לא קיים מבנה נתונים כזה. נוכיח זאת על ידי הוכחה בדרך השלילה.
נניח בשלילה שקיים מבנה נתונים העומד בדרישות.
נתמקד בפעולה ובדרישת סיבוכיות הזמן שלה, . דרישה זו צריכה להתקיים עבור כל חוקיים, ובפרט עבור הטווח , כלומר צריכה לרוץ בזמן (בהנחה ש-).
כעת, נראה שכל אלגוריתם נכון לבעיית מציאת האיבר העשירי בגודלו במערך בגודל חייב לבדוק לפחות איברים מהמערך במקרה הגרוע. מכך נובע שסיבוכיות הזמן של כל אלגוריתם כזה היא .
נוכיח טענה זו באמצעות טיעון יריב (adversary argument).
נניח שקיים אלגוריתם המוצא את האיבר העשירי בגודלו במערך והוא קורא פחות מ- איברים. כלומר, האלגוריתם קורא איברים מהמערך לפני שהוא מוציא פלט.
יהי אוסף האינדקסים שהאלגוריתם קרא, ויהי אוסף האינדקסים שהאלגוריתם לא קרא. על פי ההנחה, ו-.
היריב מנהל את המשחק באופן הבא: עבור כל שאילתה של על איבר כאשר , היריב מספק ערך. לאחר ש- השאילתות הסתיימו, האלגוריתם מוציא פלט . כעת, היריב צריך להראות שפלט זה יכול להיות שגוי. היריב עושה זאת על ידי השלמת המערך (כלומר, קביעת ערכים לאינדקסים ב-) בשתי דרכים שונות, כך שהתשובה הנכונה בכל אחת מהדרכים שונה מהשנייה. מאחר שהאלגוריתם כבר סיים את ריצתו ואינו יכול לשנות את תשובתו (כי הוא ראה את אותם הערכים באינדקסים שב- בשני המקרים), הוא בהכרח יטעה לפחות באחד מהמקרים.
נבנה את שתי ההשלמות של היריב:
יהיו הערכים שהאלגוריתם קרא . תהי חסם עליון על ערכים אלו ( אם , אחרת ).
* השלמה 1: היריב קובע את כל הערכים באינדקסים להיות מספרים קטנים מאוד (למשל, קטנים יותר מכל הערכים ). במקרה זה, 10 האיברים הגדולים ביותר במערך נמצאים כולם בקרב האיברים שהאלגוריתם קרא. תהי התשובה הנכונה עבור מערך זה .
* השלמה 2: מכיוון ש-, היריב יכול לבחור 10 אינדקסים שונים מתוך , למשל . הוא קובע את הערכים באינדקסים אלה להיות . את שאר האינדקסים ב- (אם ישנם) הוא קובע לערכים קטנים מאוד. במקרה זה, 10 האיברים הגדולים ביותר במערך הם . האיבר העשירי בגודלו הוא . לכן, התשובה הנכונה עבור מערך זה היא .
האלגוריתם חייב להוציא את אותו הפלט עבור שתי ההשלמות, מכיוון שבמהלך ריצתו הוא "ראה" את אותם הערכים בדיוק (הערכים באינדקסים ).
עם זאת, התשובות הנכונות ו- שונות זו מזו (ערך התשובה ב- הוא אחד מ- ולכן קטן או שווה ל-, בעוד ערך התשובה ב- הוא ). לכן, הפלט של אינו יכול להיות נכון עבור שתי ההשלמות. זוהי סתירה להנחה ש- הוא אלגוריתם נכון.
מכאן, כל אלגוריתם נכון חייב לקרוא לפחות איברים מהמערך. פעולת קריאה של איבר מהמערך לוקחת לפחות זמן קבוע, ולכן סיבוכיות הזמן המינימלית (במקרה הגרוע) למציאת האיבר העשירי בגודלו היא .
דרישת השאלה היא ש- תתבצע בסיבוכיות . עבור , יש לנו סתירה: מצד אחד, הפעולה צריכה לרוץ ב-, ומצד שני הראנו שהיא דורשת לפחות זמן.
הסתירה מוכיחה כי ההנחה הראשונית שלנו הייתה שגויה, ולכן לא קיים מבנה נתונים העומד בכל הדרישות.
נניח בשלילה שקיים מבנה נתונים העומד בדרישות.
נתמקד בפעולה ובדרישת סיבוכיות הזמן שלה, . דרישה זו צריכה להתקיים עבור כל חוקיים, ובפרט עבור הטווח , כלומר צריכה לרוץ בזמן (בהנחה ש-).
כעת, נראה שכל אלגוריתם נכון לבעיית מציאת האיבר העשירי בגודלו במערך בגודל חייב לבדוק לפחות איברים מהמערך במקרה הגרוע. מכך נובע שסיבוכיות הזמן של כל אלגוריתם כזה היא .
נוכיח טענה זו באמצעות טיעון יריב (adversary argument).
נניח שקיים אלגוריתם המוצא את האיבר העשירי בגודלו במערך והוא קורא פחות מ- איברים. כלומר, האלגוריתם קורא איברים מהמערך לפני שהוא מוציא פלט.
יהי אוסף האינדקסים שהאלגוריתם קרא, ויהי אוסף האינדקסים שהאלגוריתם לא קרא. על פי ההנחה, ו-.
היריב מנהל את המשחק באופן הבא: עבור כל שאילתה של על איבר כאשר , היריב מספק ערך. לאחר ש- השאילתות הסתיימו, האלגוריתם מוציא פלט . כעת, היריב צריך להראות שפלט זה יכול להיות שגוי. היריב עושה זאת על ידי השלמת המערך (כלומר, קביעת ערכים לאינדקסים ב-) בשתי דרכים שונות, כך שהתשובה הנכונה בכל אחת מהדרכים שונה מהשנייה. מאחר שהאלגוריתם כבר סיים את ריצתו ואינו יכול לשנות את תשובתו (כי הוא ראה את אותם הערכים באינדקסים שב- בשני המקרים), הוא בהכרח יטעה לפחות באחד מהמקרים.
נבנה את שתי ההשלמות של היריב:
יהיו הערכים שהאלגוריתם קרא . תהי חסם עליון על ערכים אלו ( אם , אחרת ).
* השלמה 1: היריב קובע את כל הערכים באינדקסים להיות מספרים קטנים מאוד (למשל, קטנים יותר מכל הערכים ). במקרה זה, 10 האיברים הגדולים ביותר במערך נמצאים כולם בקרב האיברים שהאלגוריתם קרא. תהי התשובה הנכונה עבור מערך זה .
* השלמה 2: מכיוון ש-, היריב יכול לבחור 10 אינדקסים שונים מתוך , למשל . הוא קובע את הערכים באינדקסים אלה להיות . את שאר האינדקסים ב- (אם ישנם) הוא קובע לערכים קטנים מאוד. במקרה זה, 10 האיברים הגדולים ביותר במערך הם . האיבר העשירי בגודלו הוא . לכן, התשובה הנכונה עבור מערך זה היא .
האלגוריתם חייב להוציא את אותו הפלט עבור שתי ההשלמות, מכיוון שבמהלך ריצתו הוא "ראה" את אותם הערכים בדיוק (הערכים באינדקסים ).
עם זאת, התשובות הנכונות ו- שונות זו מזו (ערך התשובה ב- הוא אחד מ- ולכן קטן או שווה ל-, בעוד ערך התשובה ב- הוא ). לכן, הפלט של אינו יכול להיות נכון עבור שתי ההשלמות. זוהי סתירה להנחה ש- הוא אלגוריתם נכון.
מכאן, כל אלגוריתם נכון חייב לקרוא לפחות איברים מהמערך. פעולת קריאה של איבר מהמערך לוקחת לפחות זמן קבוע, ולכן סיבוכיות הזמן המינימלית (במקרה הגרוע) למציאת האיבר העשירי בגודלו היא .
דרישת השאלה היא ש- תתבצע בסיבוכיות . עבור , יש לנו סתירה: מצד אחד, הפעולה צריכה לרוץ ב-, ומצד שני הראנו שהיא דורשת לפחות זמן.
הסתירה מוכיחה כי ההנחה הראשונית שלנו הייתה שגויה, ולכן לא קיים מבנה נתונים העומד בכל הדרישות.