ערכתי לאחרונה בתאריך 14.12.12 בשעה 21:00 בברכה, MrSus
קצת מוזר לי שלומדים על יעילות בקורס מבוא למדמח.. בכל מקרה קשה לי לחשוב על שיפור היעילות בהינתן החתימה הספציפית של הפונקציה שלכם.
אם מותר לך להגדיר פונקציית עזר, אז אתה יכול להוסיף לה מערך נוסף שגודלו כגודל האיבר הכי גדול באחד המערכים (מציאת האיבר הכי גדול זה (o(n), המערך הזה ישמש כמונה (counter) של האיברים בשני המערכים האחרים. ואז בכל קריאה רקורסיבית של הפונקציה אתה מוסיף 1 למקום במערך העזר שמתאים לאיבר האחרון במערך הראשון, ומחסיר 1 מהמקום במערך העזר שמתאים לאיבר האחרון במערך השני. צריך לשים לב ששיטה כזו תעבוד רק אם מובטח לך שכל המספרים שאתה מקבל הם אי-שליליים.
בסוף אתה מחזיר true אם כל האיברים במערך העזר הם 0, אחרת מחזירים false.
קצת קשה להסביר, אז מצורפת דוגמת קוד (שוב, הדוגמא ב- java , אבל קל להמיר את זה ל- cpp, פשוט אני עובד כרגע ב JAVA והסביבת עבודה שלי פתוחה אז יותר נוח לי לתת דוגמאות ב JAVA).
http://pastebin.com/j7zR7ZdW
היעילות של אלגוריתם כזה תלוי גם בגודל של המערכים שנותנים לך, וגם בגודל של האיבר הכי גדול במערכים האלו. אם אומרים לכם שהערכים שאתה מקבל חסומים אז אפשר להגיד שהיעילות היא (o(size.
בכל מקרה, אני בספק רב אם זה מה שאתם נדרשים לעשות.. מה גם שזה מאבד קצת מהעניין של הרקורסיביות.. כי מימוש כזה זה פשוט דרך מפגרת למדיי לממש לולאה, ולמרות שחלק גדול מהפונקציות הרקורסיביות אפשר להחליף בלולאות בקלות, לרובן יש יתרון בפישוטם של אלגוריתמים, ובאלגוריתם הנ"ל לא קיים היתרון הזה.