שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2022 - תכנות דינמי
נתונה קבוצה של ערים ומטריצה עבור שנותנת את עלות הנסיעה הישירה מ ל (בלי תחנות ביניים). אם אין אפשרות לנסיעה ישירה מ ל, אז . נרצה לבנות מטריצה שנותנת את עלות הנסיעה הזולה ביותר מ ל, כאשר מותר להשתמש בתחנות ביניים (אין צורך לפרט מיהן התחנות על המסלול).
רמז: תכנות דינמי.
א. (13) הגדירו נוסחה רקורסיבית עבור , , שתחזיר את עלות הנסיעה הזולה ביותר מ ל, כאשר מותר להשתמש בתחנות ביניים רק מתוך הקבוצה ; יש לכלול את תנאי העצירה בנוסחה.
ב. (6) הגדירו את המטריצה שברצוננו לבנות במונחים של הנוסחה הרקורסיבית .
ג. (6) מהן סיבוכיות הזמן וסיבוכיות המקום הנדרשות עבור אלגוריתם התכנות הדינמי? נמקו. שימו לב כי אין צורך לשחזר את המסלולים.
רמז: תכנות דינמי.
א. (13) הגדירו נוסחה רקורסיבית עבור , , שתחזיר את עלות הנסיעה הזולה ביותר מ ל, כאשר מותר להשתמש בתחנות ביניים רק מתוך הקבוצה ; יש לכלול את תנאי העצירה בנוסחה.
ב. (6) הגדירו את המטריצה שברצוננו לבנות במונחים של הנוסחה הרקורסיבית .
ג. (6) מהן סיבוכיות הזמן וסיבוכיות המקום הנדרשות עבור אלגוריתם התכנות הדינמי? נמקו. שימו לב כי אין צורך לשחזר את המסלולים.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2022סמסטר ב
★★★★★
תכנות דינמיגרפיםמסלולים קצריםנוסחת נסיגה
הגדירו את תת-הבעיה כעלות המסלול הזול ביותר המשתמש רק בתחנות ביניים מתוך קבוצה חלקית של צמתים בגודל k. לאחר מכן, חשבו כיצד הוספת צומת k+1 לקבוצה זו משפיעה על המסלול.
### סעיף א: נוסחה רקורסיבית
נגדיר את התת-בעיה באופן הבא: היא עלות המסלול הזול ביותר מהעיר לעיר , כאשר מותר להשתמש בתחנות ביניים רק מתוך הקבוצה $\{a_1, a_2,
obreakspace
ldots, a_k\}$.
מקרה הבסיס (תנאי העצירה):
עבור , אין תחנות ביניים מותרות. לכן, המסלול היחיד האפשרי מ- ל- הוא המסלול הישיר, שעלותו נתונה במטריצת הקלט .
לכן, עבור וכל :
הצעד הרקורסיבי:
עבור , נרצה לחשב את בהתבסס על ערכים עם אינדקס קטן יותר. המסלול הזול ביותר מ- ל- המשתמש בתחנות ביניים מתוך $\{a_1,
obreakspace
ldots, a_k\}$ יכול להיות משני סוגים:
1. **המסלול אינו עובר דרך העיר .** במקרה זה, המסלול משתמש רק בתחנות ביניים מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_{k-1}\}E(i,j,k-1)$.
2. **המסלול כן עובר דרך העיר .** במקרה זה, ניתן לפרק את המסלול לשניים: מסלול מ- ל-, ומסלול מ- ל-. כדי שהמסלול הכולל יהיה הזול ביותר, כל אחד מהקטעים חייב להיות הזול ביותר האפשרי. תחנות הביניים בכל אחד מהקטעים יכולות להיות רק מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_{k-1}\}a_kE(i,k,k-1) + E(k,j,k-1)$.
העלות המינימלית היא המינימום מבין שני המקרים הללו.
הנוסחה הרקורסיבית המלאה:
### סעיף ב: הגדרת המטריצה D
המטריצה מייצגת את עלות הנסיעה הזולה ביותר מ- ל- כאשר מותר להשתמש בכל עיר כתחנת ביניים. קבוצת כל הערים היא $\{a_1, a_2,
obreakspace
ldots, a_n\}$.
על פי הגדרת הנוסחה הרקורסיבית מסעיף א', היא בדיוק עלות הנסיעה הזולה ביותר מ- ל- כאשר מותר להשתמש בתחנות ביניים מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_n\}$.
לכן, ניתן להגדיר את המטריצה באופן הבא:
### סעיף ג: ניתוח סיבוכיות
האלגוריתם המבוסס על תכנות דינמי יבנה טבלה תלת-ממדית (או מערך) כדי לאחסן את הפתרונות של כל תתי-הבעיות ויחשב אותם באופן איטרטיבי (bottom-up), החל מ- ועד .
סיבוכיות זמן:
האלגוריתם ירוץ בשלוש לולאות מקוננות:
1. לולאה חיצונית על מ-1 עד .
2. לולאה אמצעית על מ-1 עד .
3. לולאה פנימית על מ-1 עד .
בכל איטרציה של הלולאה הפנימית ביותר, מתבצע חישוב של אשר דורש מספר קבוע של פעולות (השוואת מינימום וחיבור). לכן, הפעולה בתוך הלולאות היא .
סך הפעולות הוא .
לכן, **סיבוכיות הזמן היא **.
סיבוכיות מקום:
במימוש נאיבי, נצטרך לשמור את כל ערכי בטבלה תלת-ממדית בגודל , מה שדורש **סיבוכיות מקום של **.
*נימוק לאופטימיזציה:* ניתן לשים לב שהחישוב של שכבה (כלומר, כל הערכים עבור קבוע) תלוי אך ורק בערכים מהשכבה הקודמת, . לכן, אין צורך לשמור את כל השכבות בזיכרון בו-זמנית. ניתן להסתפק בשתי מטריצות דו-ממדיות בגודל (אחת עבור שכבה ואחת עבור שכבה ), ולהעתיק ביניהן. זה מוריד את סיבוכיות המקום ל-. ניתן אפילו לבצע את העדכון במקום (in-place) עם מטריצה אחת בלבד בגודל , ולכן סיבוכיות המקום המיטבית היא ****.
נגדיר את התת-בעיה באופן הבא: היא עלות המסלול הזול ביותר מהעיר לעיר , כאשר מותר להשתמש בתחנות ביניים רק מתוך הקבוצה $\{a_1, a_2,
obreakspace
ldots, a_k\}$.
מקרה הבסיס (תנאי העצירה):
עבור , אין תחנות ביניים מותרות. לכן, המסלול היחיד האפשרי מ- ל- הוא המסלול הישיר, שעלותו נתונה במטריצת הקלט .
לכן, עבור וכל :
הצעד הרקורסיבי:
עבור , נרצה לחשב את בהתבסס על ערכים עם אינדקס קטן יותר. המסלול הזול ביותר מ- ל- המשתמש בתחנות ביניים מתוך $\{a_1,
obreakspace
ldots, a_k\}$ יכול להיות משני סוגים:
1. **המסלול אינו עובר דרך העיר .** במקרה זה, המסלול משתמש רק בתחנות ביניים מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_{k-1}\}E(i,j,k-1)$.
2. **המסלול כן עובר דרך העיר .** במקרה זה, ניתן לפרק את המסלול לשניים: מסלול מ- ל-, ומסלול מ- ל-. כדי שהמסלול הכולל יהיה הזול ביותר, כל אחד מהקטעים חייב להיות הזול ביותר האפשרי. תחנות הביניים בכל אחד מהקטעים יכולות להיות רק מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_{k-1}\}a_kE(i,k,k-1) + E(k,j,k-1)$.
העלות המינימלית היא המינימום מבין שני המקרים הללו.
הנוסחה הרקורסיבית המלאה:
### סעיף ב: הגדרת המטריצה D
המטריצה מייצגת את עלות הנסיעה הזולה ביותר מ- ל- כאשר מותר להשתמש בכל עיר כתחנת ביניים. קבוצת כל הערים היא $\{a_1, a_2,
obreakspace
ldots, a_n\}$.
על פי הגדרת הנוסחה הרקורסיבית מסעיף א', היא בדיוק עלות הנסיעה הזולה ביותר מ- ל- כאשר מותר להשתמש בתחנות ביניים מתוך הקבוצה $\{a_1,
obreakspace
ldots, a_n\}$.
לכן, ניתן להגדיר את המטריצה באופן הבא:
### סעיף ג: ניתוח סיבוכיות
האלגוריתם המבוסס על תכנות דינמי יבנה טבלה תלת-ממדית (או מערך) כדי לאחסן את הפתרונות של כל תתי-הבעיות ויחשב אותם באופן איטרטיבי (bottom-up), החל מ- ועד .
סיבוכיות זמן:
האלגוריתם ירוץ בשלוש לולאות מקוננות:
1. לולאה חיצונית על מ-1 עד .
2. לולאה אמצעית על מ-1 עד .
3. לולאה פנימית על מ-1 עד .
בכל איטרציה של הלולאה הפנימית ביותר, מתבצע חישוב של אשר דורש מספר קבוע של פעולות (השוואת מינימום וחיבור). לכן, הפעולה בתוך הלולאות היא .
סך הפעולות הוא .
לכן, **סיבוכיות הזמן היא **.
סיבוכיות מקום:
במימוש נאיבי, נצטרך לשמור את כל ערכי בטבלה תלת-ממדית בגודל , מה שדורש **סיבוכיות מקום של **.
*נימוק לאופטימיזציה:* ניתן לשים לב שהחישוב של שכבה (כלומר, כל הערכים עבור קבוע) תלוי אך ורק בערכים מהשכבה הקודמת, . לכן, אין צורך לשמור את כל השכבות בזיכרון בו-זמנית. ניתן להסתפק בשתי מטריצות דו-ממדיות בגודל (אחת עבור שכבה ואחת עבור שכבה ), ולהעתיק ביניהן. זה מוריד את סיבוכיות המקום ל-. ניתן אפילו לבצע את העדכון במקום (in-place) עם מטריצה אחת בלבד בגודל , ולכן סיבוכיות המקום המיטבית היא ****.