אחסון (אירגון) מידע DATA DATA DATA Link Link Link … … הערה: כל יחידה מכילה 2 שדות – מידע וקישור ליחידות אחרות. מטרה: אחסון ועיבוד מספר רב של יחידות מידע. מילת מפתח – יעילות! 1. יעילות האחסון (מקום) – תוספת של מקום מעל ההכרחי, ניצול מקום. 2. יעילות העיבוד (זמן) – זמן עבור ביצוע פעולות על המידע. כגון חיפוש, מחיקה, הכנסת, גישה לאיבר במבנה...
דרך מוכרת: מערך – אחסון סידרתי. אחסון לינארי סידרתי דרך מוכרת: מערך – אחסון סידרתי. מאפיינים: 1. מקום: מוגבל, ביזבוז כללי, חסכוני לכל יחידה. ...O(1), גישה לאיבר - O(n)2. זמן: הכנסה,הוצאה - הערה: ניתן לפתור חלק מהבעיות, אבל... מסקנה: באופן כללי לא מספק.
אחסון לינארי מקושר DATA DATA DATA HEAD TAIL NEXT POINTER NEXT POINTER NULL . . .
הוספת איבר Pointer P-new Start
הוספת איבר Pointer Start P-new
מחיקת איבר Pointer Start מחק את זה
מחיקת איבר מחק את זה Pointer Start
מסקנה: שיפור מסוים ביחס למערך, הבעיה העיקרית – זמן גישה. רשימה מקושרת מאפיינים: 1. מקום: לא מוגבל, אין ביזבוז באופן כללי, הוספה של מצביע. ...O(n), גישה לאיבר - O(1)2. זמן: הכנסה,הוצאה - מסקנה: שיפור מסוים ביחס למערך, הבעיה העיקרית – זמן גישה.
רשימה מקושרת דו-כיוונית DATA NEXT PRE DATA NEXT PRE DATA NEXT PRE שיפור יחסי בזמן גישה, הוספת מצביע.
(מחסנית) Stackמימוש 1: מילת מפתח: LIFO אינטואיציה: מחסנית רובה, ניירות על השולחן פקודות: 1. S <- MAKE () 2. TOP (S) 3. POP (S) 4. PUSH (S) 5. EMPTY (S) הערה: פקודות נוספות לא אפשריות
מחסנית במערך i-top 1st 2nd 1. S <- MAKE () 2. TOP (S) 3. POP (S) 4. PUSH (S) 5. EMPTY (S)
סיבוכיות (מחסנית במערך) בעיה: מה עושים כשמערך מתמלא? פתרון: שיטת ההכפלה Doubling 1) הקצה מקום מסוים לטבלה (n) 2) כשהמקום מתמלא והטבלה מכילה n אלמנטים: א) הקצה מקום חדש לטבלה בגודל 2n ב) העתק איברים לטבלה החדשה. ג) שחרר טבלה ישנה.
סיבוכיות (מחסנית במערך) 1) עבור פעולת ׂPER OPERATION) : INSERT) אם אין הכפלה (O(1 אם יש הכפלה (O(n AMORTIZED COST חשוב זמן ממוצע עבור פעולה במקרה הגרוע ביותר. שווה ל: T(n)/n , כאשר (T(n הוא סכום הפעולות על n איברים. AMORTIZED COST O(1)
מחסנית ברשימה מקושרת p-top p-top p-top 1. S <- MAKE () 2. TOP (S) 3. POP (S) 4. PUSH (S) 5. EMPTY (S)
שימוש במחסנית תוכנית לבדיקת פלינדרום: w$wR דוגמא: abcda$adcba ({[]})(] בדיקת תקינות של סוגרים: ({[]})([(){}[{}]]) קריאה לפונקציות: Prog A . x= 17 Call B B() x =7 Call C return C() . x =3 return x=17 x=7
שימוש נוסף במחסנית יצוג ביטוי אלגברי: -+ABC: Prefixא. A+B-C: Infixב. AB+C-: Postfixג. שאלות: ?Postfix, Infix, Prefix1. מה הצורך ב- 2. מה הקשר החזותי בין השיטות? 3. איך מחסנית עוזרת בחישוב הביטוי?
Postfixחישוב ביטוי אלגברי push(S, s) הוא אופרנד -s אם2.1 push(pop(S), s, pop(S)) אחרת - 2.2 ?
דוגמא Infix: 2 * ( 2 + 3 ) + 3 * 4 - 5 * 6 * ( 7 - 4 - 2 ) Postfix: 2 3 + 2 * 3 4 * + 7 4 – 2 – 6 * 5 * - + 3 2 5 2 * 3 4 * + 7 4 – 2 – 6 * 5 * -
דוגמא 5 2 * 3 4 * + 7 4 – 2 – 6 * 5 * - * 2 5 10 3 4 * + 7 4 – 2 – 6 * 5 * -
דוגמא 10 3 4 * + 7 4 – 2 – 6 * 5 * - * 4 3 10 10 12 + 7 4 – 2 – 6 * 5 * -
דוגמא 10 12 + 7 4 – 2 – 6 * 5 * - + 12 10 22 7 4 – 2 – 6 * 5 * -
דוגמא 22 7 4 – 2 – 6 * 5 * - - 4 7 22 22 3 2 – 6 * 5 * -
דוגמא 22 3 2 – 6 * 5 * - - 2 3 22 22 1 6 * 5 * -
דוגמא 22 1 6 * 5 * - * 6 1 22 22 6 5 * -
דוגמא 22 6 5 * - * 5 6 22 22 30 -
דוגמא 22 30 - - 30 22 -8
Postfix ל-Infixהמרה מ- הערות: 1. קדימויות של אופרטורים... 2. קדימויות של סוגריים... 3. מבנה נתונים... 4. סדר של אופרנדים...
אלגוריתם המרה 1. אתחל מחסנית ריקה S(מחסנית האופרטורים). 2.1 אם s אופרנד - תדפיס s 2.2 אחרת: 2.1.1 כל עוד S לא ריקה ו-top(S) קודם ל-s תדפיס pop(S) 2.1.2 push(S, s) 3. כל עוד S לא ריקה – תדפיס pop(S) הערה: מה לגבי סוגריים?
תור - Queue In Out מילת מפתח: FIFO פקודות : 1) Q <- MAKE() 2) ENQUEUE (x,Q) : INSERT (x,END (Q),Q) 3) FRONT (Q) : RET (FIRST (Q), Q) 4) DEQUEUE (Q) : DELETE (FIRST (Q), Q) 5) EMPTY (Q) : TRUE | FALSE
שימו לב: ניתן להכניס רק N-1 איברים!!!!!! תור במערך 1 2 N FRONT - על ראשון, REAR - על אחרון N 1 2 F=R => ריק F+k=R => kאיברים R=F-1=> מלא QUEUE Q.REAR Q.FRONT שימו לב: ניתן להכניס רק N-1 איברים!!!!!!
תור ברשימה מקושרת rear rear front front 1) Q <- MAKE() 2) ENQUEUE (x,Q) : INSERT (x,END (Q),Q) 3) FRONT (Q) : RET (FIRST (Q), Q) 4) DEQUEUE (Q) : DELETE (FIRST (Q), Q) 5) EMPTY (Q) : TRUE | FALSE
שימושים Queue: תור למדפסת .
תור קדימויות In Out שינוי: הוספת מפתח k לכל איבר. הוצאת איבר נעשית לפי המפתח הזה. דוגמאות: עבודת מעבד, מערכת הפעלה, תזמון עבודותVIP, ...
תור קדימויות שינויים בולטים: FRONT(Q) = Maximum(Q) (Minimum(Q)) DEQUEUE(Q) = ExtractMaximum(Q) (ExtractMinimum(Q)) איך לממש? מה סיבוכיות המימוש הנאיבי?