תרגילים לשרשרת חוליות 1
Transcription
תרגילים לשרשרת חוליות 1
מדעי המחשב 1 מבני נתונים שרשרת חוליות רשימה מקושרת חלק מהפעולות שלהלן הן פעולות שיש להן שימוש בהקשרים שונים (תבניות אלגוריתמיות). פעולות אלו סומנו בצבע אדום .אם טרם עשית זאת ,הוסף אותן למחלקת השרות .Chain .1 א. ב. ג. כתוב פעולה המקבלת רשימה וערך מטיפוס איברי הרשימה ,ומחזירה "אמת" אם הערך מופיע ברשימה ו"שקר" אחרת. כתוב פעולה ,המקבלת רשימה וערך מטיפוס איברי הרשימה ,ומחזירה את מקומו של הערך ברשימה .אם הערך לא ברשימה ,יוחזר .null כתוב פעולה המקבלת רשימה ושני ערכים מטיפוס איברי הרשימה ,ומעדכנת את המקום שבו נמצא הערך הראשון להיות הערך השני .התבסס על הפעולות ככתבת בסעיפים הקודמים. ] lst [3, 5, 4, 7, 4, 8והערכים 4ו,20 - לדוגמה ,עבור הרשימה: תתקבל הרשימהlst [3, 5, 20, 7, 4, 8] : .3 ברצוננו להוסיף את הפעולות הבאות לפעולות המטפלות במבנה נתונים :רשימה: אורך-רשימה -בהינתן רשימה Lתחזיר הפעולה את מספר האיברים ברשימה. מחק-ברשימה -בהינתן רשימה Lוהמספר " ,xיימחקו" כל האיברים שערכם xברשימה. החלף-ברשימה -בהינתן רשימה Lומקום pבה ,תהפוך הפעולה את הסדר בין האיבר שבמקום pלבין האיבר העוקב לו ברשימה( .שים :יש לטפל במקרה שבו אין איבר עוקב לאיבר שבמקום .)p כתוב אלגוריתם למימוש פעולות אילו (השתמש בפעולות שבממשק רשימה). א. חשב את הסיבוכיות של הפעולות שמימשת. ב. .4 שרשור רשימות :כתוב פעולה בשם concatהמקבלת שתי רשימות ומשרשרת את הרשימה הראשונה לסופה של הרשימה השנייה. .5 מיזוג רשימות :כתוב פעולה המקבלת שתי רשימות ממויינות בסדר עולה ,בכל רשימה אין ערך החוזר על עצמו יותר מפעם אחת ,ומחזירה רשימה שלישית ממויינת ,שהיא רשימת האיחוד של שתי הרשימות ,בדרך הבאה: עם חזרות :אם ערך מופיע בשתי הרשימות ,הוא יופיע פעמיים ברשימת האיחוד. א. ללא חזרות :אם ערך מופיע בשתי הרשימות ,הוא יופיע ברשימת האיחוד בדיוק פעם אחת. ב. .6 חיתוך רשימות :כתוב פעולה המקבלת שתי רשימות ממויינות בסדר עולה ,בכל רשימה אין ערך החוזר על עצמו יותר מפעם אחת ,ומחזירה את רשימת החיתוך -רשימה המכילה את כל האיברים הנמצאים בשתי הרשימות גם יחד. .7 כתוב פעולה המקבלת שתי רשימות לא ממויינות ,בכל רשימה אין ערך החוזר על עצמו יותר מפעם אחת, ומחזירה רשימה שלישית שהיא רשימת האיחוד של שתי הרשימות ,כך שאיברים המופיעים בשתי הרשימות יופיעו ברשימת האיחוד פעם אחת בלבד. .8 נתונה רשימה Lשל מספרים שלמים. כתוב פעולה בשם רשימת-המספרים-העוקבים-המקסימלית longestSubListשתחזיר רשימה חדשה שהיא רשימת המספרים העוקבים הגדולה ביותר ברשימה נתונה .L (שני מספרים עוקבים אם השני גדול מהראשון ב.)-1 ]L1 [3 , 5 , 6 , 7 , 8 , -1 , 0 , 1 , 2 , 3 , 4 , 6 , 7 , 13 , 1 , 2 למשל ,עבור הרשימה: ]L2 [-1 , 0 , 1 , 2 , 3 , 4 תתקבל רשימת המספרים המקסימלית הבאה: blog.csit.org.il הילה קדמן מדעי המחשב .9 מבני נתונים 2 הרשימות L1ו L2-ממומשות באמצעות שרשרת חוליות .ידוע כי קיימת חוליה כלשהי בכל אחת משתי הרשימות המצביעה על חוליה המשותפת לשתי הרשימות ,החל מחוליה המשך הרשימה משותף. ראה דוגמה :שים ♥ ,כי מספר החוליות עד לחוליה המשותפת אינו חייב להיות זהה בשתי הרשימות. 3 6 // 12 7 8 ב. .10 5 1 21 א. L1 9 L2 ממש את הפעולה listDisconnect (L1, L2) :שתקבל שתי רשימות לא ריקות L1וL2- המחוברות ביניהן בנקודה כלשהי ומנתקת אותן .לאחר הפעלת הפעולה ,תכיל כל אחת מהרשימות בסופה את האיברים המשותפים( .ראה איור) // 6 12 7 1 3 8 // 6 12 7 1 21 9 5 L1 L2 מהי סיבוכיות הפעולה שכתבת בסעיף א' כפונקציה של המספר האיברים בכל אחת משתי הרשימות המחוברות? נמק! מספרים שלמים גדולים יכולים להיות מיוצגים ע"י רשימה באופן הבא: המספר 113,526,785,901יהיה מיוצג ברשימה: // 112 526 785 901 lst שים ♥ כי שלשות המספרים נרשמות בסדר הפוך. כתוב פעולה המקבלת שתי רשימות lst1ו ,lst2 -המייצגות כל אחת מספר בייצוג הנ"ל ,ומחזירה רשימה שלישית שהיא רשימת הסכום שלהן. .11 רשימה L1היא תת-רשימה של רשימה L2אם מתקיימים שני תנאים: כל איבר xברשימה L1קיים גם ברשימה .L2 סדר האיברים זהה בשתי הרשימות. 3, 12, 5, 32, 1היא תת-רשימה של 6, 3, 34, 1, 1, 12, 5, 8, 32, 5, 1 לדוגמה: שים ♥ :האיברים ברשימה L1אינם חייבים להופיע ברצף בתוך הרשימה .L2 כתוב פעולה :האם-תת-רשימה ) ,isSubList (L1, L2שתקבל כפרמטר שתי רשימות ותחזיר 'אמת' ,אם L1 היא תת-רשימה של L2ו'שקר' אחרת. blog.csit.org.il הילה קדמן מדעי המחשב .12 מבני נתונים 3 (בגרות ,תשנ"ח) -מקטע-משותף-מכסימלי לשתי רשימות נתונות הוא תת-רשימה הרצופה המכסימלית, המשותפת לשתיהן. לדוגמה :עבור הרשימות L1ו: L2- המקטע המשותף המכסימלי הוא הרשימה .l3 L1: 1,5,6,3,4,8,9,5,4,3,6,7 L2: 5,4,4,8,9,5,6,3,6 L3: 4,8,9,5 נתונה הפעולה: Java: public static boolean listCompare (Node<Integer> L1, Node<Integer> L2, )Node<Integer> p1, Node<Integer>, int n public static bool listCompare (Node<int> L1, Node<int> L2, )Node<int> p1, Node<int>, int n C#: הפעולה מקבלת שתי רשימות ,שתי הפניות ומספר שלם ( p1מפנה על חוליה ב L1 -ו p2 -מפנה על חוליה ב- .)L2הפעולה מחזירה "אמת" אם nהאיברים החל מ p1ברשימה , L1זהים ל n-האיברים החל מp2- ברשימה ,L2ו"-שקר" אחרת .אם יש פחות מ n -איברים אחרי p1או אחרי ,p2יוחזר "שקר". כתוב פעולה בשם ,maxJointSectionשתקבל שתי רשימות L1ו , L2-ותחזיר את המקטע המשותף המכסימלי לשתיהן .השתמש בפעולהה הנתונה. שים ♥ :בבחינה היה רשום :הפונקציה listCompareנתונה ואין צורך לממש אותה. בדף העבודה זה ,כדי להריץ את התכנית יש לממש את הפעולה. blog.csit.org.il הילה קדמן