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

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

Jan 17, 2016

Download

Documents

Nora Daniel
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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());

}...}