שאלת מבחן במבוא למדעי המחשב - אוניברסיטת תל אביב 2021 - רקורסיה
בהינתן רשימה באורך , נגדיר איבר רוב ברשימה להיות איבר אשר מופיע יותר מ- פעמים ברשימה (אם קיים). לאורך שאלה זו נניח כי איברי הרשימה ניתנים להשוואה (כלומר, בהינתן שני איברים מהרשימה, ניתן לבדוק האם ), אך אין עליהם יחס סדר (כלומר, לא ניתן לבדוק האם או ). כמוכן, ניתנת לנו אפשרות ההשוואה בין איברים ברשימה (בפייתון: ) מתבצעת בזמן קבוע.
לדוגמה, ברשימה האיבר הוא איבר רוב וברשימה אין איבר רוב.
לאורך שאלה זו נעסוק באלגוריתמים דטרמיניסטיים (כלומר לא אקראיים) בלבד. בפרט, אין להשתמש ב-hashing.
בשאלה כולה (הן במימוש עצמי הן במימוש מובנה כמו dict או set).
בנוסף, ניתן להניח כי אינו איבר ברשימה.
א. ממשו את הפונקציה המקבלת כקלט רשימה ומחזירה כפלט איבר רוב ברשימה, אם קיים, אחרת. הנחיות:
דוגמאות הרצה:
ב. ציירו את עץ הרקורסיה של הפונקציה שלכם עבור הקלט , כאשר איברים כלשהם. יש לרשום מימין לכל צומת ביצע את הקלט ואת הפלט שאותו החזיר.
ג. נמקו מדוע זמן הריצה של הפונקציה שלכם הוא אכן כנדרש.
לדוגמה, ברשימה האיבר הוא איבר רוב וברשימה אין איבר רוב.
לאורך שאלה זו נעסוק באלגוריתמים דטרמיניסטיים (כלומר לא אקראיים) בלבד. בפרט, אין להשתמש ב-hashing.
בשאלה כולה (הן במימוש עצמי הן במימוש מובנה כמו dict או set).
בנוסף, ניתן להניח כי אינו איבר ברשימה.
א. ממשו את הפונקציה המקבלת כקלט רשימה ומחזירה כפלט איבר רוב ברשימה, אם קיים, אחרת. הנחיות:
- על הפתרון להיות רקורסיבי.
- ניתן להשתמש ב- כפונקציה מעטפת.
- על הפתרון לרוץ בסיבוכיות זמן .
דוגמאות הרצה:
ב. ציירו את עץ הרקורסיה של הפונקציה שלכם עבור הקלט , כאשר איברים כלשהם. יש לרשום מימין לכל צומת ביצע את הקלט ואת הפלט שאותו החזיר.
ג. נמקו מדוע זמן הריצה של הפונקציה שלכם הוא אכן כנדרש.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד א2021סמסטר א
★★★★★
רקורסיהסיבוכיות זמןמערכיםרקורסיה
א. חלוקה לשניים, מציאת מועמד רקורסיבית בכל חצי, ואם המועמדים שונים — ספירה ליניארית של כל מועמד ברשימה המלאה. ג. רמות × עבודה ברמה = .
א — maj.
הרעיון: Divide and Conquer. מחלקים את הרשימה לשני חצאים, מוצאים את מועמד לרוב בכל חצי רקורסיבית. אם שני החצאים מחזירים אותו מועמד — הוא המועמד. אם הם מחזירים מועמדים שונים — סופרים את מספר ההופעות של כל מועמד ברשימה השלמה ובודקים מי (אם בכלל) הוא רוב.
ב — עץ הרקורסיה.
הקלט (אורך 9). מחלקים ל- ו-. ממשיכים רקורסיבית. בסופו של דבר, שני החצאים יחזירו (כי הוא רוב בשני החצאים). *(הסטודנט צייר את העץ המלא בכתב יד.)*
ג — הוכחת .
עומק הרקורסיה הוא (כי בכל קריאה מחלקים את הרשימה לשני חצאים). בכל קריאה, אם המועמדים שונים, נעשית ספירה ליניארית () על הרשימה הנוכחית. בנוסף, ה-slicing () עולה .
בכל רמה של הרקורסיה, סכום אורכי הרשימות הוא (כי הרשימות לא חופפות). לכן סכום העבודה ברמה הוא . יש רמות. סך הכול: .
הרעיון: Divide and Conquer. מחלקים את הרשימה לשני חצאים, מוצאים את מועמד לרוב בכל חצי רקורסיבית. אם שני החצאים מחזירים אותו מועמד — הוא המועמד. אם הם מחזירים מועמדים שונים — סופרים את מספר ההופעות של כל מועמד ברשימה השלמה ובודקים מי (אם בכלל) הוא רוב.
ב — עץ הרקורסיה.
הקלט (אורך 9). מחלקים ל- ו-. ממשיכים רקורסיבית. בסופו של דבר, שני החצאים יחזירו (כי הוא רוב בשני החצאים). *(הסטודנט צייר את העץ המלא בכתב יד.)*
ג — הוכחת .
עומק הרקורסיה הוא (כי בכל קריאה מחלקים את הרשימה לשני חצאים). בכל קריאה, אם המועמדים שונים, נעשית ספירה ליניארית () על הרשימה הנוכחית. בנוסף, ה-slicing () עולה .
בכל רמה של הרקורסיה, סכום אורכי הרשימות הוא (כי הרשימות לא חופפות). לכן סכום העבודה ברמה הוא . יש רמות. סך הכול: .