29
1 בבבב בבבבב בבבבב בבבבב21 : Queue, Iterator & Iterable

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

Embed Size (px)

Citation preview

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

1

מבוא למדעי המחשב

: 21הרצאה Queue, Iterator & Iterable

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

2

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

3

תור – מבנה נתונים אבסטרקטי

public interface Queue {

public void enqueue(Object o);

public Object dequeue();

public boolean isEmpty();

}

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

4

תור – שימושים בעולם התוכנה השימושים של תורים בעולם התוכנה

מזכירים מאוד תורים במציאות:

מקלדת

( שידור סרט באינטרנטYouTube)

( שימוש ברשת לטובת מימוש של טלפוןVoIP)

...ועוד

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

5

מימוש נאיבי לתור

front = 0 numOfElements = 0

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

6

מימוש נאיבי לתור

front = 0

enqueue )A(

A

numOfElements = 1

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

7

מימוש נאיבי לתור

front = 0

enqueue )B(

A B

numOfElements = 2

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

8

מימוש נאיבי לתור

front = 0

enqueue )C(

A B

numOfElements = 3

C

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

9

מימוש נאיבי לתור

front = 1

dequeue )(

B

numOfElements = 2

C

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

10

מימוש נאיבי לתור

front = 1

enqueue )D(

B

numOfElements = 3

C D

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

11

מימוש נאיבי לתור

front = 2

dequeue )(

numOfElements = 2

C D

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

12

תור מעגלי בעל קיבולת חסומה

A

BC

0

23

n-1

1front

numOfElements = 3

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

13

תור מעגלי בעל קיבולת חסומה

BC

0

23

n-1

1

front

numOfElements = 2

dequeue )(

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

14

תור מעגלי בעל קיבולת חסומה

BC

0

23

n-1

1

front

numOfElements = 3

enqueue )D(

D

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

15

תור מעגלי בעל קיבולת חסומה

W

X0

1

n-1

front

numOfElements = 4

n-2U

V

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

תור מעגלי בעל קיבולת חסומה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;

}

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

תור מעגלי בעל קיבולת חסומה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;

}

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

תור מעגלי בעל קיבולת חסומה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

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

19

Exceptionיצירת סוג חדש של class EmptyQueueException extends RuntimeException{

public EmptyQueueException(){

super();

}

}//class EmptyQueueException

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

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

}

}

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

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

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

22

ניתוח הפעולות )לתור ולמחסנית(פעולות יעילות

הכנסת מספר קטן של פריטים הוצאת איבר ראשון

פעולות לא יעילות הכנסת מספר גדול של פריטים )תלוי

במימוש המערך(מציאת איבר בעל ערך מינימאלימציאת איבר בעל מפתח מסוים

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

23

Iterator כיצד ניתן לאפשר בנאי מעתיק של מבנה

שלמדנו?Setהנתונים כיצד ניתן לבצע חיתוך או איחוד בין שתי

קבוצות? ישנו צורך בפונקציונאליות חשובה ברוב

מבני הנתונים שעד כה התעלמנו ממנה – היכולת לעבור על כל האיברים.

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

24

Iteratorpublic interface Iterator{public boolean hasNext();public Object next();public void remove();

}public interface Iterable {public Iterator iterator();

}

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

25

נעדכן את ממשק הקבוצה

public interface Set extends Iterable{public void add(Object data);public void remove(Object data);public boolean contains(Object data);public int size();

}

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

26

נוסיף את השיטה הדרושה במימוש הקבוצה

public class SetAsArray implements Set {

private Array arr;private int size;

// ...

public Iterator iterator() {return new ArrayIterator(arr, size);

}}

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

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;

}

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

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

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

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

}...}