Download presentation
Presentation is loading. Please wait.
Published byNora Daniel Modified over 9 years ago
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()); }... }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.