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

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

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

מצגות קשורות


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

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

2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מה בשיעור 1. חוליה המכילה ערך שלם (IntNode) 2. שרשרת חוליות: הוצאה, הכנסה, מעבר על השרשרת, פעולות על השרשרת 3. החוליה הגנרית 4. שרשרת חוליות כמבנה רקורסיבי 5. שרשרת חוליות לייצוג של אוסף 6. מבנים נוספים מבוססי חוליות © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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

6 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
IntNode חוליה המכילה מספר שלם UML: הערך int info IntNode next IntNode IntNode (int x) IntNode (int x, IntNode next) . הפניה לחוליה העוקבת © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
מימוש המחלקה IntNode ייצוג המחלקה והפעולות הבונות: private int info; private IntNode next; public IntNode (int x) { this.info = x; this.next = null; } public IntNode (int x, IntNode next) this.next = next; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

9 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
פעולות get, set public IntNode getNext() { return this.next; } public void setNext (IntNode next) this.next = next; public int getInfo() return this.info; public void setInfo (int x) this.info = x; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

10 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
toString() public String toString() { return "" + this.info; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

11 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שרשרת חוליות – בנייה IntNode n = new IntNode (5); IntNode n1 = new IntNode (7, n); IntNode n2 = new IntNode (4, n1); n IntNode 5 info next null IntNode n1 n 7 info next 5 null IntNode n1 n n2 4 info next 7 5 null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

12 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שרשרת חוליות – בנייה ניתן ליצור שרשרת חוליות בכתיבה מקוצרת: IntNode n = new IntNode(4, new IntNode(7, new IntNode(5))); במקרה זה קיימת רק הפניה אחת לאורך כל השרשרת: n - ההפניה לחוליה הראשונה חייבת להישמר אם היא נמחקת, לא ניתן לגשת יותר לשרשרת החוליות אספן הזבל ימחק את כול השרשרת IntNode n 4 info next 7 5 null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

13 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שרשרת חוליות – הכנסה IntNode temp = new IntNode (56); temp.setNext (n.getNext()); n.setNext (temp); IntNode temp 56 info next null n IntNode IntNode IntNode 4 info next 7 info next 5 info next null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

14 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
הכנסה – כתיבה מקוצרת IntNode temp = new IntNode (56, n.getNext()); n.setNext (temp); temp IntNode 56 info next IntNode n 4 info next 7 5 null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

16 הוצאת חוליה משרשרת חוליות
IntNode temp = n.getNext(); n.setNext (temp.getNext()); temp.setNext (null); temp n IntNode IntNode IntNode 4 info next info next 5 info next null 7 null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

17 מעבר על שרשרת החוליות תבנית של קטע קוד לסריקה מלאה של שרשרת חוליות:
IntNode pos = chain; while (pos != null) { // pos.getInfo() pos = pos.getNext(); } ביצוע פעולה עם ערך החוליה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

18 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
סכום ערכי החוליות int sum = 0; IntNode pos = chain; while (pos != null) { sum = sum + pos.getInfo(); pos = pos.getNext(); } sum sum 4 sum 11 sum 16 pos pos pos pos null chain IntNode IntNode IntNode 4 info next 7 info next 5 info next null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

21 שרשרת חוליות כפרמטר לפעולות
המשתנה myChain מפנה לחוליה ראשונה בשרשרת: נשלח את השרשרת כפרמטר לפעולה (הפרמטר הוא הפניה לחוליה הראשונה בשרשרת): public static int getChainSum (IntNode chain) הזימון ייראה כך: int totalSum = getChainSum (myChain); 4 7 5 null myChain © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

22 למרות שהפרמטר הוא חוליה בודדת, היא יכולה להיות ראשונה בשרשרת חוליות
שרשרת חוליות כפרמטר לפעולות public static int getChainSum (IntNode chain) { int sum = chain.getInfo(); while (chain.getNext() != null) chain = chain.getNext(); sum = sum + chain.getInfo(); } return sum; למרות שהפרמטר הוא חוליה בודדת, היא יכולה להיות ראשונה בשרשרת חוליות © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

23 אחרי זימון הפעולה נוצר משתנה מקומי chain
נתונה שרשרת חוליות המוחזקת על ידי המשתנה myChain: נזמן את הפעולה getChainSum (..): int totalSum = getChainSum (myChain); נזכיר כי כותרת הפעולה היא: public static int getChainSum (IntNode chain) chain אחרי זימון הפעולה נוצר משתנה מקומי chain 4 7 5 null myChain © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

24 שרשרת חוליות כפרמטר לפעולות
public static int getChainSum (IntNode chain) { int sum = 0; while (chain != null) sum = sum + chain.getInfo(); chain = chain.getNext(); } return sum; sum 4 sum 16 sum 11 sum chain chain chain chain null 4 7 5 null myChain © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

25 הכנסת ערך לשרשרת חוליות ממוינת
chain נתונה שרשרת ממוינת: אנו רוצים לכתוב פעולה המכניסה את החוליה החדשה למקום הנכון בהתאם למיון: public static void insertIntoSortedChain (IntNode chain, int x) { ... } נזמן את הפעולה: insertIntoSortedChain (myChain, 2) 4 5 7 null myChain © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

26 המשתנה myChain לא עבר שינוי
ביצוע הזימון insertIntoSortedChain (myChain, 2) בעת ביצוע הפעולה: לאחר איתור מקום ההכנסה, הפעולה יוצרת חוליה חדשה המכילה את הערך 2, ומכניסה אותו למקום הראשון בשרשרת החוליות: chain 4 5 7 null myChain 4 5 7 null myChain chain 2 המשתנה myChain לא עבר שינוי © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

28 מציאת ערך מקסימלי בקטע של שרשרת חוליות
הפעולה תחזיר הפניה לערך הגדול ביותר החל במקום מסוים בשרשרת חוליות: public static IntNode getMaxPosition (IntNode pos) { IntNode maxPos = pos; pos = pos.getNext(); while (pos != null) if (pos.getInfo() > maxPos.getInfo()) maxPos = pos; } return maxPos; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

31 החלפת טיפוס החוליה השינויים בין IntNode ו-StringNode
הם שינויים טכניים בלבד כדי לא לכתוב לכל טיפוס מחלקה שונה קיים בג'אווה מנגנון הגנריות (genericity) הגדרה יחידה של מחלקה גנרית – משמשת ליצירת טיפוסי ערכים שונים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

32 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
חוליה גנרית public class Node<T> { מימוש המחלקה באמצעות הטיפוס T (המימוש יתואר בהמשך)// } בעת השימוש במחלקה יש לקבוע טיפוס קונקרטי במקום הטיפוס T . המעבד יבצע "הצבה" , ובכל מקום שניכתב T , הוא יוחלף בטיפוס הקונקרטי שהגדרנו. אין חשיבות לאות T , ניתן לסמן את הטיפוס בכל אות או מזהה אחרים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

34 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שימוש בחוליה גנרית Node<Point> p = new Node<Point> (new Point (1,2)); Node<String> s = new Node<String> ("Hello"); String str = s.getInfo(); Point pnt = p.getInfo(); s.setNext (new Node<String> (“Adam”)); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

35 מחלקות עוטפות ערך החוליה חייב להיות טיפוס של עצם ולא טיפוס פשוט
כיצד ניצור חוליה המכילה טיפוס פשוט, למשל int? לכל טיפוס פשוט מוגדרת מחלקה מקבילה: Integer עבור int Double עבור double Character עבור char, וכן הלאה מחלקות אלה נקראות: מחלקות עוטפות (type wrapper classes) ההמרות מטיפוסי בסיס לעצמים עוטפים, וחזרה, נעשות אוטומטית על ידי המערכת © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

36 המרה אוטומטית מInteger ל-int
Node<Integer> n = new Node<Integer> (101); int a = n.getInfo(); המרה אוטומטית מint ל-Integer המרה אוטומטית מInteger ל-int © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

37 פעולות פנימיות וחיצוניות
פעולה הכלולה בהגדרת מחלקה A, בין אם היא פומבית, כלומר שייכת לממשק המחלקה, ובין אם היא פרטית, נקראת פעולה פנימית של המחלקה A . פעולה המופיעה בכל מחלקה אחרת היא פעולה חיצונית (יחסית ל-A). אם A<T> היא מחלקה גנרית , אזי השימוש בטיפוס הגנרי T מותר בפעולות הפנימיות שלה בלבד. בפעולות חיצוניות ל-A שמשתמשות בעצמים של A , יש להחליף את T בטיפוס קונקרטי . כלומר, עבור כל פעולה המקבלת פרמטרים מטיפוס מחלקה גנרית , יש לקבוע טיפוסים קונקרטיים לפרמטרים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

38 שימוש במחלקות גנריות בפעולות חיצוניות
בפעולות חיצוניות – לא נשתמש בטיפוס הכללי T. הטיפוס T יוחלף בטיפוס קונקרטי: כותרת הפעולה שהייתה במקור: public static int getChainSum (IntNode chain) תיראה כך: public static int getChainSum (Node<Integer> chain) ולא כך: public static int getChainSum (Node<T> chain) בדרך זו נמנעות הרבה טעויות ואי הבנות © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

39 מימוש המחלקה הגנרית ? ממשו את המחלקה הגנרית Node<T>
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

40 יעילות פעולות החוליה יעילות פעולות החוליה היא O(1)
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

41 שרשרת חוליות כמבנה רקורסיבי
שרשרת חוליות היא: חוליה יחידה או חוליה שיש בה הפניה לשרשרת חוליות . Node<T> t1 info next t2 t3 null חוליה שרשרת חוליות © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

42 הנחה סמויה: chain אינו null
חישוב סכום בשרשרת חוליות public static int getChainSum (Node<Integer> chain) { if (chain.getNext() == null) return chain.getInfo(); return chain.getInfo() + getChainSum (chain.getNext()); הנחה סמויה: chain אינו null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

43 הנחה סמויה: chain אינו null
אורך שרשרת החוליות public static int getChainLength (Node<String> chain) { if (chain.getNext() == null) return 1; return 1 + getChainLength (chain.getNext()); } הנחה סמויה: chain אינו null פעולה זו אינה תלויה בטיפוס מסוים ולכן יכולה הייתה להיכתב כפעולה גנרית. למרות זאת אנו בוחרים לכתוב פעולות חיצוניות רק עבור טיפוסים קונקרטיים. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

44 מיקום ערך x בשרשרת חוליות
public static Node<Integer> getPosition (Node<Integer> chain, int x) { if (chain.getInfo() == x) return chain; if (chain.getNext() == null) return null; return getPosition (chain.getNext(), x); } הסריקה נפסקת כאשר מוצאים את הערך שחיפשנו ממשו את הפעולה הזו בגישה איטרטיבית © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

46 ייצוג המחלקה public class StudentList {
private Node<Student> first; } כאשר ההפניה אינה null, היא פונה לתלמיד הראשון ברשימה כאשר ההפניה היא null, פירוש הדבר שהרשימה ריקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

49 נסו לכתוב את פעולת ההוספה בשורה אחת
הפעולה אינה שומרת על סדר ממוין. ההוספה מתבצעת לראש הרשימה. Node<Student> temp = new Node<Student> (student); temp.setNext (this.first); this.first = temp; ניצור חוליה חדשה Student temp info next null נסו לכתוב את פעולת ההוספה בשורה אחת this.first Student Student Student info next info next info next null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

51 פעולת סריקה לאיתור תלמיד
public Student getStudent (String name) { Node<Student> pos = this.first; while (pos != null) if (pos.getInfo().getName().compareTo(name) == 0) return pos.getInfo(); else pos = pos.getNext(); } return null; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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

55 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים
שרשרת דו -כיוונית T info BiDirNode<T> next BiDirNode <T> prev BiDirNode<T> פעולות... הפניה לחוליה הבאה הפניה לחוליה הקודמת null 4 7 5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

56 מבנים היררכיים ניתן להשתמש בחוליה שלה שתי הפניות לאותו הטיפוס
כרכיב יסוד של מבנה היררכי: החוליה תכיל הפניה אחת,left , לחוליה שעומדת באוסף לשמאלהּ, והפניה נוספת,right , לחוליה שלימינהּ © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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


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

מצגות קשורות


מודעות Google