260 likes | 382 Views
סוגי נתונים מופשטים (Abstract Data Type). בדר"כ כאשר אנו כותבים תוכנית אנו מתחייבים להגדיר את כל הנתונים באופן מדויק ( .(int, float, char
E N D
סוגי נתונים מופשטים(Abstract Data Type) בדר"כ כאשר אנו כותבים תוכנית אנו מתחייבים להגדיר את כל הנתונים באופן מדויק ( .(int, float, char אבל בתיאור של אלגוריתם אין צורך בהגדרות מדויקות של כל הפרטים ואפילו אין צורך בייצוג קונקרטי של הזכרון בו מאוכסנים הנתונים. למשל, בבעיית מיון עבור קבוצת נתונים S חשוב שלכל זוג a, b S או a<b או a>b או .a=bלא משנה מאיזה סוג נתונים אבל חשוב שניתן להשוות ביניהם.
סוגי נתונים מופשטים(Abstract Data Types) הגדרה: אוסף נתונים ופעולות עליהם ללא פרטים למימוש נקרא סוגנתונים מופשט .(ADT) הכי חשוב באילו פעולות תומך ADT מסוים
רשימה ADT (List)היא סידרה של אלמנטיםL={x1,x2,…, xn}|L| מסמן אורך הסדרה .
ההצגות הבסיסיות של רשימהעל ידי:מערך (בזכרון רציף) רשימה מקושרת (בזכרון לא רציף)
פעולות מופשטות על רשימהפעולות בסיסיות • Head() Ptr • Next(Ptr) Ptr מיקום של האיבר הבא • Prev(Ptr) Ptr • Key(Ptr) value • Insert(Ptr,newPtr) Head() • Delete(Ptr) Head() • MakeEmptyList()יצירת הרשימה • Length() value • Outside(Ptr) boolean אמת – מחוץ לגבולות
פעולות מופשטות על רשימהפעולות מורכבות • Access(index)value • ListSearch(value)Ptr • IsEmptyList()בדיקה האם הרשימה ריקה
פעולות מופשטות על רשימהדוגמא ListSearch(value):Ptr Ptr x Head() While (not Outside(x)) and Key(x) <> value x Next(x) If Outside(x) Return nil Else Return x
מחסנית ADT(Stack)אוסף סדור של אלמנטים כאשר הכנסה והוצאה – דרך קצה אחד, הנקרא ראש המחסנית.האחרון הנכנס הוא הראשון שיצא. LIFO: last –in, first out))
פעולות מופשטות על מחסנית • Top() valueבדיקה מהו האיבר בראש המחסנית • Pop() valueהוצאת איבר תמיד מראש המחסנית • Push(x)הכנסת איבר תמיד לראש המחסנית • MakeEmptyStack( )Ptrיצירת המחסנית • IsEmptyStack()בדיקה האם המחסנית ריקה
דוגמא לשימוש במחסנית • ללא סוגריים:(1+5)*3 רוצים לחשב ביטוי(infix) • 1 5 + 3 * (postfix) • ? postfix ל-1+5*3איך נתרגם את :
דוגמא לשימוש במחסניתחישוב ביטוי ב-postfix • נניח מחסנית ריקה:1 5 + 3 * • בא מספר --- מכניסים למחסנית: • באה פעולה : • מוציאים 2 איברים מהמחסנית • מבצעים חישוב • מכניסים תוצאה למחסנית • כאשר הסדרה הסתיימה : האיבר (היחיד) בראש המחסנית הוא התשובה.
דוגמא לשימוש במחסניתסדרת הפעולות:1 5 + 3 * Push(1) Push(5) Pop(5) Pop(1) 5+1 Push(6) Push(3) Pop(3) Pop(6) 3*6 Push(18)
דוגמא לשימוש במחסניתמציאת ההוראה הבאה לבצוע • main f g • X5; a2; v3; • f(X); bg(a); w5; • Z8; c4;
דוגמא לשימוש במחסניתמציאת ההוראה הבאה לבצוע • קיים program counter (בקיצור: pc) יחיד, והוא מכיל את כתובת ההוראה הבאה לבצוע • לאחר טעינת התכנית ה-pc מקבל את כתובת ההוראה הראשונה • מחזור רגיל: • טעינת ההוראה ל- cpu • קידום ה-pc להוראה הבאה • בצוע ההוראה שנטענה ל- cpu • בזהוי שההוראה היא קריאה לפונקציה: • הכנסת ערך ה- pc למחסנית • נתינת כתובת ההוראה הראשונה של הפונקציה ל- pc • ביציאה מהפונקציה: • הוצאת ערך מהמחסנית ונתינתו ל- pc • אם יוצאים מפונקציה והמחסנית ריקה - סיימנו
דוגמא לשימוש במחסניתסדרת הפעולות: • main f g • X5; a2; v3; • f(X); bg(a); w5; • Z8; c4; Push(pc “z 8”) Push(pc “c 4”) Pc Pop() /* c 4 */ Pc Pop() /* z 8 */ Pc Pop() /* אבל המחסנית ריקה ... סיימנו!*/
ההצגות הבסיסיות של Stack על ידי:מערך (בזכרון רציף) רשימה מקושרת (בזכרון לא רציף)
class Stack{ int stack[]; int head;//head of stack int n; //size of the stack //........................................................... public Stack(int n){ stack = new int[n]; head = 0; this.n = n; } //......................................................... public boolean empty(){ return (head == 0); } //........................................................... public boolean full(){ return (head == n); } //...........................................................
public int pop(){ if (this.empty()){ System.out.println("The stack is empty");//underflow error return 0; }else{ int el = stack[head-1]; head--; return el; } } //........................................................... public void push(int el){ if (this.full()){ System.out.println("The stack is full");//overflow error }else{ stack[head] =el; head++; } } //...........................................................
//...........................................................//........................................................... public static void main(String args[]){ Stack s = new Stack (5); for(int i=0;i<7;i++) s.push(i); for(int i=0;i<6;i++) System.out.println(s.pop()+" "); } } The stack is full The stack is full 4 3 2 1 0 The stack is empty 0 Process Exit...
תור ADT(Queue)אוסף סדור של אלמנטים כאשר הכנסה דרך קצה אחד, הנקרא סוף התור; הוצאה דרך קצה האחר הנקרא ראש התור.אלמנטים הראשון הנכנס הוא הראשון שיצא. FIFO: first –in, first -out))
פעולות מופשטות על התור • Front() valueבדיקה מהו האיבר ראשון בתור • Dequeue() valueהוצאת איבר תמיד מראש התור • Enqueue(x)הכנסתאיבר תמיד לסוף התור • MakeEmptyQueue( )יצירת התור • IsEmptyQueue()בדיקה האם התור ריק
Queue תור הדפסה פשוט Queue X2; YX+3; Z5; דוגמאות תור:
ההצגות הבסיסיות של Queue על ידי:מערך (בזכרון רציף) רשימה מקושרת (בזכרון לא רציף)
תור ADT עדיפות (Priority Queue)כל אלמנט כולל שדה נוסף Priorityאוסף סדור של אלמנטים כאשר הכנסה דרך קצה אחד; הוצאה דרך קצה האחר.האלמנט בעל ה- Priority המקסימלי (מינימלי) הוא הראשון שיצא.
פעולות על תור עדיפות • Maximum() value מחזיר איבר בעל עדיפות מקסימלית בתור • Extract_Max() valueהוצאת איבר בעל עדיפות מקסימלית • AddPriorityQueue (x) הוספתאיבר לתור MakeEmptyPriorityQueue( )יצירת התור • IsEmptyPriorityQueue( )בדיקה האם התור ריק • PriorityQueueSort(set X )
to schedule jobs on a shared computer: When a job is finished, the highest-priority job is selected from the pending (by Extract_Max()) A new job can be added to the queue at any time (by AddPriorityQueue()) דוגמאות תורעדיפות: