המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מצגות קשורות


מצגת בנושא: "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים"— תמליל מצגת:

1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פרק 9 רשימה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מה בשיעור שימוש ברשימה כתיבת המחלקה רשימה ייצוג אוספים באמצעות רשימה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

3 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פרוטוקולים של אוספים מחסנית – האיברים נכנסים ויוצאים מאותו קצה. תור- האיברים נכנסים מקצה אחד ויוצאים מקצה אחר. רשימה – האיברים נכנסים יוצאים בכל מקום בסדרה ללא הגבלה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

4 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ייצוג הרשימה מערך : מקום הוא אינדקס מספרי מגבלה של מקום. סרבול בהכנסה והוצאה. שרשרת חוליות: מקום הוא הפניה לחוליה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

5 ייצוג הרשימה – שרשרת חוליות
public class List<T> { private Node<T> first; lst List<Integer> first 20 5 null 8 -3 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

6 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
דיון בפעולות הרשימה סריקה : getFirst(), getNext() הכנסה, הוצאה: insert(…), remove(…) בדיקת ריקנות: isEmpty() תיאור הרשימה: toString() פעולה של החוליה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

7 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הממשק של רשימה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הממשק של רשימה - המשך © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

9 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הממשק של הרשימה שימו לב כי הממשק של הרשימה אינו מאפשר להתקדם מחוליה אחת לאחרת תוך כדי סריקה . כדי לעשות זאת צריך להשתמש בפעולה של החוליה getNext(). אוסף פעולות הרשימה יחד עם פעולות החוליה מאפשר לבצע את כל הפעולות הדרושות. שמתם לב להנחות של הפעולות? אם לא – כדאי לחזור! לסיכום: פעולות הטיפוס רשימה מורכבות משני ממשקים: ממשק המחלקה רשימה וממשק המחלקה חוליה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

10 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שימוש בפעולות הממשקים בניית רשימה של שמות: List<String> nameList = new List<String>(); nameList List<String> null first © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

11 הכנסה public Node<T> insert (Node<T> pos, T x)
איך נכניס את הערך במקום הראשון? נזמן את הפעולה עם הערך null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

12 עדכון הpos על ידי ערך ההחזרה של insert
הכנסה List<String> nameList = new List<String>(); Node<String> pos = nameList.insert (null, "Moshe"); pos = nameList.insert (pos, "Talia"); הכנסה למקום הראשון הכנסה במקום אחרי pos nameList List<String> null first pos pos "Moshe" null "Talia" null עדכון הpos על ידי ערך ההחזרה של insert © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

13 pos=null ולכן זו הכנסה למקום הראשון
הכנסת ערכים בלולאה List<Integer> numList = new List<Integer>(); Node<Integer> pos = numList.getFirst(); for (int i=0; i<3; i++) pos = numList.insert (pos, i); pos=null ולכן זו הכנסה למקום הראשון numList List<Integer> null first pos pos pos 1 i 2 i i null 1 null 1 2 null null pos © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

14 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? תארו את הרשימה המתקבלת מהפעלת הקוד שלפניכם על רשימת המספרים הריקה lst: for (int i=0; i<3; i++) lst.insert (null, i); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

15 הוצאת ערך מרשימה public Node<T> remove (Node<T> pos)
ערך ההחזרה הוא הפניה לחוליה הבאה לחוליה שהוצאה. משמש לסריקות. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

16 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
דוגמה להוצאה המצב לפני ההוצאה: זימון פעולה ההוצאה: pos = nameList.remove (pos); pos pos nameList List<String> first "Moshe" "Talia" "Yaron" null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

17 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סריקה של רשימה עד סוף הרשימה עד קיום תנאי רצוי © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

18 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סריקה עד סוף הרשימה מציאת מספר האיברים ברשימה: public int size() { int len = 0; Node>T> pos = this.first; while (pos != null) len++; pos = pos.getNext(); } return len; סריקה עד סוף הרשימה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

19 סריקה עד קיום תנאי מסוים
סריקה עד קיום תנאי רצוי פעולה המחזירה את מקומו של x נתון ברשימה: public static Node<Integer> getPosition (List<Integer> lst, int x) { Node<Integer> pos = lst.getFirst(); while ((pos != null) && (pos.getInfo() != x)) pos = pos.getNext(); return pos; } סריקה עד קיום תנאי מסוים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

20 שאלה האם ניתן לכתוב את הפעולה getPosition(…) כפעולה פנימית?
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

21 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
כתיבת המחלקה רשימה UML: Node<T> first List<T> List() boolean isEmpty() Node<T> getFirst() Node<T> insert(Node<T> pos, T x) Node<T> remove(Node<T> pos) String toString() © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

22 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולה בונה public List() { this.first = null; } רשימה ריקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

23 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הפעולה getFirst() public Node<T> getFirst() { return this.first; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

24 הכנסת איבר במקום הראשון הכנסת איבר במקום שאינו הראשון
פעולת ההכנסה public Node<T> insert (Node<T> pos, T x) { Node<T> temp = new Node<T> (x); if (pos == null) temp.setNext (this.first); this.first = temp; } else temp.setNext (pos.getNext()); pos.setNext (temp); return temp; יצירת חוליה עם הערך x הכנסת איבר במקום הראשון הכנסת איבר במקום שאינו הראשון © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

25 פעולת הוצאה הוצאת האיבר הראשון סריקה למציאת האיבר הקודם לזה שמוציאים
public Node<T> remove (Node<T> pos) { if (this.first == pos) this.first = pos.getNext(); else Node<T> prevPos = this.getFirst(); while (prevPos.getNext() != pos) prevPos = prevPos.getNext(); prevPos.setNext (pos.getNext()); } Node<T> nextPos = pos.getNext(); pos.setNext (null); return nextPos; הוצאת האיבר הראשון סריקה למציאת האיבר הקודם לזה שמוציאים הוצאת האיבר עדכון pos ניתוק ההפניה next של החוליה שמוציאים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

26 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? השלימו את קוד הפעולה toString(): public String toString() { } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

27 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
יעילות פעולות הממשק remove (..) – O(n) toString() – O(n) כל יתר הפעולות – O(1) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

28 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולות נוספות על רשימה פעולות אלו לא יתווספו לממשק הרשימה, אלא יוגדרו כפעולות חיצוניות. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

29 יצירת תת רשימה ובה מספרים זוגיים מרשימה נתונה
נתונה רשימה של מספרים שלמים. רוצים לקבל רשימה של מספרים זוגיים מתוך הרשימה הנתונה. רוצים לא לקלקל את הרשימה המקורית. לכן יוצרים רשימה חדשה של המספרים הזוגיים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

30 יצירת תת רשימה ובה מספרים זוגיים מרשימה נתונה
public static List<Integer> getEvenList (List<Integer> lst) { List<Integer> evenList = new List<Integer>(); Node<Integer> pos1 = lst.getFirst(); Node<Integer> pos2 = evenList.getFirst(); while (pos1 != null) if ((pos1.getInfo() % 2) == 0) pos2 = evenList.insert (pos2, pos1.getInfo()); pos1 = pos1.getNext(); } return evenList; יצירת רשימה חדשה הפניה לחוליה הראשונה ברשימה הנתונה הפניה לחוליה הראשונה ברשימה החדשה המכילה כרגע null קידום ההפניה pos2 תוך כדי ההכנסה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

31 הכנסת ערכים לרשימה ממוינת
public static void insertIntoSortedList (List<String> lst, String str) { Node<String> prev = null; Node<String> pos = lst.getFirst(); while ((pos != null) && (pos.getInfo().compareTo(str) < 0)) prev = pos; pos = pos.getNext(); } lst.insert (prev, str); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

32 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? הראו כי הפעולה תפעל כראוי בכל מקרי הקצה הקיימים. ? אילו שינויים יש לעשות בפעולה כך שתבצע את משימתה על רשימה של מספרים שלמים? רמז: נדרשים ארבעה שינויים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

33 מיון רשימה באמצעות מיון הכנסה (insertion sort)
שתי אפשרויות מיון: 1. הפעולה מחזירה רשימה חדשה שבה הערכים של הרשימה המקורית ממוינים. 2. הפעולה תמיין את הרשימה הנתונה (in place sort) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

34 מיון רשימה באמצעות מיון הכנסה (insertion sort)
נתחיל באפשרות הראשונה – החזרת רשימה חדשה ממוינת: public static List<Integer> insertionSort (List<Integer> lst) { List<Integer> sortedList = new List<Integer>(); Node<Integer> pos = lst.getFirst(); while (pos != null) insertIntoSortedList (sortedList, pos.getInfo()); pos = pos.getNext(); } return sortedList; פעולה שכתבנו קודם © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

35 מיון רשימה באמצעות מיון הכנסה (insertion sort)
האפשרות השנייה – מיון במקום: הרשימה מחולקת לשני חלקים: החלק הראשון ממוין, החלק השני אינו ממוין. בתחילת הפעולה החלק הראשון אינו קיים, והחלק השני הוא הרשימה כולה. החלוקה נעשית באמצעות ההפניה untilPos שמסמנת את התחלה של החלק הלא ממוין. בכל שלב אנו לוקחים איבר מהחלק הלא ממוין ומכניסים אותו למקומו הנכון בחלק הממוין. ההכנסה מתבצעת באמצעות פעולת עזר: insertIntoSortedList(…). לאחר ההכנסה לחלק הממוין האיבר מוצא מהחלק הלא ממוין. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

36 מיון רשימה באמצעות מיון הכנסה (insertion sort)
public static void insertionSortInPlace (List<Integer> lst) { Node<Integer> untilPos = lst.getFirst(); while (untilPos != null) insertIntoPartialSortedList (lst, untilPos); untilPos = lst.remove (untilPos); } פעולת עזר © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

37 insertIntoPartialSortedList (lst, untilPos)
private static void insertIntoPartialSortedList(List<Integer> lst, Node<Integer> untilPos) { Node<Integer> prev = null; Node<Integer> pos = lst.getFirst(); while ((pos != untilPos) && (untilPos.getInfo() > pos.getInfo())) prev = pos; pos = pos.getNext(); } lst.insert (prev, untilPos.getInfo()); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

38 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה בפעולה insertIntoSortedList (…) הפרמטר השני הוא ערך, ואילו בפעולה – insertIntoPartialSortedList(…) הפרמטר השני הוא חוליה. הסבירו מדוע בפעולה insertIntoPartialSortedList (…) יש צורך בפרמטר מטיפוס חוליה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

39 ייצוג אוספים באמצעות רשימה
נייצג שלושה אוספים באמצעות רשימה: StudentList מחסנית תור © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

40 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
StudentList - ממשק © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

41 StudentList – ייצוג ופעולה בונה
public class StudentList { List<Student> lst; public StudentList() this.lst = new List<Student>(); } ... © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

42 השתמשנו בפעולה של הרשימה להכנסה במקום הראשון
StudentList - מימוש ראינו כי פעולת ההוספה יכולה להיעשות בשתי דרכים: למקום כלשהו. למקום המתאים לפי הסדר האלפביתי. הוספה למקום כלשהו (בחרנו את המקום הראשון כי זה נוח): public void add (Student st) } this.lst.insert (null, st); { השתמשנו בפעולה של הרשימה להכנסה במקום הראשון © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

43 היעזרו בפעולה insertIntoSortedList(...)
שאלה ? ממשו את המחלקה כך שפעולת ההוספה add(…) תוסיף את התלמיד למקומו הנכון לפי הסדר האלפביתי. public void add (Student st) { Node<Student> prev = null; Node <Student > pos = lst.getFirst(); while ((pos != null) && (pos.getInfo().getName().compareTo(st.getName()) < 0)) prev = pos; pos = pos.getNext(); } lst.insert (prev, st. getName()); היעזרו בפעולה insertIntoSortedList(...) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

44 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
StudentList שאלה: מה היתרון בשימוש בשרשרת חוליות לייצוג רשימת התלמידים לעומת שימוש ברשימה? תשובה: שימוש חוזר בקוד. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

45 ייצוג אוסף כללי באמצעות רשימה
נייצג שני אוספים כלליים באמצעות רשימה: מחסנית תור © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

46 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ממשק המחלקה מחסנית © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

47 ייצוג מחסנית והפעולה הבונה
public class Stack<T> { private List<T> data; public Stack() this.data = new List<T>(); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

48 שאלה ? ממשו את המחלקה מחסנית כאשר היא מיוצגת באמצעות רשימה.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

49 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ייצוג תור בחרנו לבצע את ההכנסה לסוף הרשימה ואת ההוצאה מתחילת הרשימה (דומה לשרשרת חוליות). על מנת לגשת לסוף הרשימה הוספנו תכונה: last. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

50 ייצוג התור והפעולה הבונה
public class Queue<T> { private List<T> data; private Node<T> last; public Queue() this.data = new List<T>(); this.last = null; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

51 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
ממשק המחלקה תור © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

52 שאלה ? ממשו את המחלקה תור כאשר היא מיוצגת באמצעות רשימה.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

53 מימוש רקורסיבי של פעולות ברשימה
נכתוב פעולת עזר רקורסיבית הפועלת על שרשרת חוליות נכתוב פעולה של הרשימה שתזמן את פעולת העזר © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

54 הנחה: node אינו שווה null
הפעולה size(…) – פעולה פנימית נכתוב פעולת עזר הפועלת על שרשרת חוליות: private int sizeHelp (Node<T> node) } if (node.getNext() == null) return 1; return 1 + sizeHelp (node.getNext()); הנחה: node אינו שווה null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

55 בדיקה הכרחית לפני זימון פעולת העזר. אחרת עלולה להיות שגיאה בפעולת העזר
הפעולה size() בדיקה הכרחית לפני זימון פעולת העזר. אחרת עלולה להיות שגיאה בפעולת העזר public int size() { if (this.first == null) return 0; return sizeHelp (this.first); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

56 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? ממשו את הפעולה: public static Node<Integer> getPosition (List<Integer> lst, int x) הפעולה מחזירה את המקום ברשימה lst המכיל את הערך x. אםx אינו ברשימה, יוחזר null. א. כתבו את הפעולה כך שלא תשתמש ברקורסיה. ב. כתבו את הפעולה כפעולה רקורסיבית (מותר להגדיר פעולות עזר רקורסיביות). © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

57 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
רשימה דו-כיוונית חוליה יכולה להיות דו–כיוונית (בנוסף לתכונה next, קיימת בחוליה דו-כיוונית התכונה prev, המכילה הפניה לחוליה הקודמת) מחוליה דו-כיוונית ניתן ליצור שרשרת חוליות דו-כיוונית. בשרשרת חוליות דו-כיוונית היעילות של הפעולה remove(…) היא O(1) ולא O(n). נמקו מדוע? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

58 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שאלה ? איך תשתנה היעילות של הפעולה: insertIntoSortedList(…) (דוגמה 2, סעיף ו), כאשר הרשימה תיוצג באמצעות שרשרת חוליות דו-כיוונית? הסבירו. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

59 רשימה – טיפוס נתונים מופשט?
רשימה אינה טיפוס נתונים מופשט: הייצוג חשוף יש אפשרות לקלקל את הרשימה בעזרת פעולות החוליה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

60 רשימה – טיפוס נתונים מופשט?
נתונה רשימה של מספרים ראשוניים: lst = [2, 3, 7, 11] יעקב רצה להכניס את המספר 5 בין המספרים 3 ו-7. לצורך כך הוא כתב את הקוד הזה: Node<Integer> pos = lst.getFirst(); pos = pos.getNext(); Node<Integer> n = new Node<Integer>(5); pos.setNext(n); n.setNext(pos.getNext()); בדקו מה יתקבל בהדפסה? מה מקור הבעיה? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

61 מסקנה: הרשימה היא מבנה נתונים אך אינה טיפוס נתונים מופשט
רשימה – טיפוס נתונים מופשט כדי לשפר את יעילות הפעולות של רשימה, שינו את הייצוג לשרשרת חוליות דו-כיוונית בינתיים תיקן יעקב את הקוד שלו (החליף בין שתי השורות האחרונות). האם עכשיו הקוד נכון? מסקנה: הרשימה היא מבנה נתונים אך אינה טיפוס נתונים מופשט © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

62 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סוף © המרכז להוראת המדעים האוניברסיטה העברית בירושלים


הורד את "ppt "© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מצגות קשורות


מודעות Google