Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable.

Similar presentations


Presentation on theme: "1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable."— Presentation transcript:

1 1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable

2 2

3 3 תור – מבנה נתונים אבסטרקטי public interface Queue { public void enqueue(Object o); public Object dequeue(); public boolean isEmpty(); }

4 4 תור – שימושים בעולם התוכנה השימושים של תורים בעולם התוכנה מזכירים מאוד תורים במציאות : מקלדת שידור סרט באינטרנט (YouTube) שימוש ברשת לטובת מימוש של טלפון (VoIP) ועוד...

5 5 מימוש נאיבי לתור front = 0 numOfElements = 0

6 6 מימוש נאיבי לתור front = 0 enqueue (A) A numOfElements = 1

7 7 מימוש נאיבי לתור front = 0 enqueue (B) A B numOfElements = 2

8 8 מימוש נאיבי לתור front = 0 enqueue (C) A B numOfElements = 3 C

9 9 מימוש נאיבי לתור front = 1 dequeue () B numOfElements = 2 C

10 10 מימוש נאיבי לתור front = 1 enqueue (D) B numOfElements = 3 C D

11 11 מימוש נאיבי לתור front = 2 dequeue () numOfElements = 2 C D

12 12 תור מעגלי בעל קיבולת חסומה A B C 0 2 3 n-1 1 front numOfElements = 3

13 13 תור מעגלי בעל קיבולת חסומה B C 0 2 3 n-1 1 front numOfElements = 2 dequeue ()

14 14 תור מעגלי בעל קיבולת חסומה B C 0 2 3 n-1 1 front numOfElements = 3 enqueue (D) D

15 15 תור מעגלי בעל קיבולת חסומה W X 0 1 n-1 front numOfElements = 4 n-2 U V

16 תור מעגלי בעל קיבולת חסומה public class CircularQueue implements Queue{ private Array arr; private int front, numOfElements, capacity; public CircularQueue(int capacity){ this.capacity = capacity; arr = new FixedSizeArray(capacity); front = 0; numOfElements = 0; }

17 תור מעגלי בעל קיבולת חסומה public Object dequeue(){ if (isEmpty()){ throw new EmptyQueueException(); } Object res = arr.get(front); arr.set(front, null); front = (front+1) % capacity; numOfElements = numOfElements-1; return res; }

18 תור מעגלי בעל קיבולת חסומה public void enqueue(Object o){ if (numOfElements == arr.size()){ throw new RuntimeException( "Queue is full!"); } arr.set((front + numOfElements) % capacity, o); numOfElements = numOfElements+1; } public boolean isEmpty(){ return numOfElements == 0; } } //class CircularQueue

19 19 יצירת סוג חדש של Exception class EmptyQueueException extends RuntimeException{ public EmptyQueueException(){ super(); } }//class EmptyQueueException

20 20 מימוש תור בעזרת מחסנית public class QueueAsStack implements Queue{ private Stack stack; public QueueAsStack () { stack = new StackAsArray(); } public boolean isEmpty() {// easy... return stack.isEmpty(); } public void enqueue(Object o) {//quit easy as well... stack.push(o); } }

21 21 מימוש תור בעזרת מחסנית public Object dequeue() { // hard work... if (stack.isEmpty()) throw new EmptyQueueException(); Stack auxStack = new StackAsArray(); while(!stack.isEmpty()) auxStack.push(stack.pop()); Object ret = auxStack.pop(); while(!auxStack.isEmpty()) stack.push(auxStack.pop()); return ret; } }//class QueueAsStack

22 22 ניתוח הפעולות ( לתור ולמחסנית ) פעולות יעילות הכנסת מספר קטן של פריטים הוצאת איבר ראשון פעולות לא יעילות הכנסת מספר גדול של פריטים ( תלוי במימוש המערך ) מציאת איבר בעל ערך מינימאלי מציאת איבר בעל מפתח מסוים

23 23 Iterator כיצד ניתן לאפשר בנאי מעתיק של מבנה הנתונים Set שלמדנו ? כיצד ניתן לבצע חיתוך או איחוד בין שתי קבוצות ? ישנו צורך בפונקציונאליות חשובה ברוב מבני הנתונים שעד כה התעלמנו ממנה – היכולת לעבור על כל האיברים.

24 24 Iterator public interface Iterator{ public boolean hasNext(); public Object next(); public void remove(); } public interface Iterable { public Iterator iterator(); }

25 25 נעדכן את ממשק הקבוצה public interface Set extends Iterable{ public void add(Object data); public void remove(Object data); public boolean contains(Object data); public int size(); }

26 26 נוסיף את השיטה הדרושה במימוש הקבוצה public class SetAsArray implements Set { private Array arr; private int size; //... public Iterator iterator() { return new ArrayIterator(arr, size); } }

27 27 נגדיר איטרטור עבור מערכים public class ArrayIterator implements Iterator { private Array arr; private int nextIx, size; public ArrayIterator(Array arr, int size) { this.arr = arr; this.size = size; nextIx = 0; }

28 28 נגדיר איטרטור עבור מערכים public boolean hasNext() { return nextIx < size; } public Object next() { if (!hasNext()) throw new NoSuchElementException(); nextIx = nextIx+1; return arr.get(nextIx-1); } public void remove() { throw new UnsupportedOperationException(); } } //class ArrayIterator

29 29 נוסיף בנאי מעתיק במימוש הקבוצה public class SetAsArray implements Set { private Array arr; int size; public SetAsArray(){ arr = new DynamicArray(); size = 0; } public SetAsArray(Set toCopy){ this(); if (toCopy == null) throw new NullPointerException("arguemnt to constructor is null"); Iterator iter = toCopy.iterator(); while (iter.hasNext()) add(iter.next()); }... }


Download ppt "1 מבוא למדעי המחשב הרצאה 21: Queue, Iterator & Iterable."

Similar presentations


Ads by Google