סוגי נתונים מופשטים (abstract data type)

Post on 02-Jan-2016

31 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

סוגי נתונים מופשטים (Abstract Data Type). בדר"כ כאשר אנו כותבים תוכנית אנו מתחייבים להגדיר את כל הנתונים באופן מדויק ( .(int, float, char - PowerPoint PPT Presentation

TRANSCRIPT

סוגי נתונים מופשטים (Abstract Data Type)

בדר"כ כאשר אנו כותבים תוכנית אנו מתחייבים להגדיר את כל הנתונים באופן

int, float, char.)מדויק ) אבל בתיאור של אלגוריתם אין צורך

בהגדרות מדויקות של כל הפרטים ואפילו אין צורך בייצוג קונקרטי של הזכרון בו

מאוכסנים הנתונים. למשל, בבעיית מיון ,a חשוב שלכל זוגSעבור קבוצת נתונים

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(:PtrPtr x Head)(While )not Outside)x(( and Key)x( <> value

x Next)x(

If Outside)x( Return nil

ElseReturn x

)ADT )Stackמחסנית אוסף סדור של אלמנטים כאשר

הכנסה והוצאה – דרך קצה אחד, הנקרא ראש המחסנית.

האחרון הנכנס הוא הראשון שיצא. LIFO: last –in, first out))

פעולות מופשטות על מחסנית

•Top)( value בדיקה מהו האיבר בראש המחסנית

•Pop)( value הוצאת איבר תמיד מראש המחסנית

•Push)x( הכנסת איבר תמיד לראש המחסנית

•MakeEmptyStack) (Ptrיצירת המחסנית

•IsEmptyStack)(בדיקה האם המחסנית ריקה

דוגמא לשימוש במחסנית

• רוצים לחשב 3(*1+5)ללא סוגריים: )infix(ביטוי

• 1 5 + 3 * )postfix(

• ? postfix -איך נתרגם את3*1+5ל :

דוגמא לשימוש במחסנית postfixחישוב ביטוי ב-

*3 + 5 1 נניח מחסנית ריקה:•בא מספר --- מכניסים למחסנית:•באה פעולה :•

איברים מהמחסנית 2מוציאים –מבצעים חישוב–מכניסים תוצאה למחסנית–

כאשר הסדרה הסתיימה : האיבר )היחיד( בראש •המחסנית הוא התשובה.

דוגמא לשימוש במחסניתסדרת הפעולות:

1 5 + 3* Push)1(Push)5(Pop)5(Pop)1(5+1Push)6(Push)3(Pop)3(Pop)6(3*6Push)18(

דוגמא לשימוש במחסנית מציאת ההוראה הבאה לבצוע

• main f g

• X5; a2; v3;

• f)X(; bg)a(; w5;

• Z8; c4;

דוגמא לשימוש במחסנית מציאת ההוראה הבאה לבצוע

( יחיד, והוא מכיל את pc )בקיצור: program counterקיים •כתובת ההוראה הבאה לבצוע

מקבל את כתובת ההוראה pcלאחר טעינת התכנית ה-•הראשונה

מחזור רגיל:• cpuטעינת ההוראה ל- – להוראה הבאהpcקידום ה-– cpuבצוע ההוראה שנטענה ל- –

בזהוי שההוראה היא קריאה לפונקציה:• למחסנית pcהכנסת ערך ה- – pcנתינת כתובת ההוראה הראשונה של הפונקציה ל- –

ביציאה מהפונקציה: • pcהוצאת ערך מהמחסנית ונתינתו ל- –

אם יוצאים מפונקציה והמחסנית ריקה - סיימנו•

דוגמא לשימוש במחסניתסדרת הפעולות:

Push)pc “z 8”(Push)pc “c 4”(Pc Pop)( /* c 4 */Pc Pop)( /* z 8 */ Pc Pop)( /* אבל המחסנית ריקה ... סיימנו!*/

•main f g •X5; a2; v3;•f)X(; bg)a(; w5;•Z8; c4;

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ההצגות הבסיסיות של על ידי:

מערך )בזכרון רציף(

רשימה מקושרת )בזכרון לא רציף(

(Priority Queue) עדיפות ADTתור

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)((

top related