queue data structure (w/ php egs)

59
Queue data structure Roman R

Upload: roman-rodomanskyy

Post on 06-Aug-2015

76 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Queue Data Structure (w/ php egs)

Queue data structure

Roman R

Page 2: Queue Data Structure (w/ php egs)

# todo- php impl of Queue as Linked List- persistent queue (using 5 stacks)- persistent queue (using 6 stacks)- deque impl (double-end queue)- change rair => tail, start => head, etc- add gif-animation for algo

2

Page 3: Queue Data Structure (w/ php egs)

Queue: definition

data structureset of itemsearliest added item may be accessed (FIFO)has two ends (head and rair/tail)push (into tail) and pop (from head)

3

Page 4: Queue Data Structure (w/ php egs)

Queue: examples IRL

- lines of people (line in a grocery store, buy a movie ticket)- conveyor belt- waiting lists- access to shared resources (e.g. printer jobs)- things that are in "time order"- events in Windows- keyboard strokes- video frames

4

Page 5: Queue Data Structure (w/ php egs)

Queue: types

- queue as array- circular queue

- priority queue- deque

- input restricted- output restricted

- persistent queue

5

Page 6: Queue Data Structure (w/ php egs)

Queue: interface

enqueue (put) - add to the taildequeue (get + delete) - get from the head

empty(Q):boolcount(Q):intfront(Q):item - peek (just get)

6

Page 7: Queue Data Structure (w/ php egs)

Queue: axioms

new() returns a queueadd(v, new()).isEmpty() = falsefront(add(v, new())) = vremove(add(v, new())) = new()front(add(v, add(w, Q))) = front(add(w, Q))remove(add(v, add(w, Q))) = add(v, remove(add(w, Q)))

Q - queue; v and w - values;

7

Page 8: Queue Data Structure (w/ php egs)

Queue: basic example

initial -> | | | | (assume 3 element capacity)enqueue(a) -> |a| | | enqueue(b) -> |a|b| |enqueue(c) -> |a|b|c|dequeue() -> | |b|c| (returns a)dequeue() -> | | |c| (returns b)dequeue() -> | | | | (returns c) (all gone!)

head |a|b|c| tail

8

Page 9: Queue Data Structure (w/ php egs)

Queue: implementation

- as Array- Cyclic Array

- as Linked List (doubly)- as Stack (2 or 6)

9

Page 10: Queue Data Structure (w/ php egs)

as array and two integer variables start and end

start = head of queueend = element that will be filled when new el will come

@todo on images replace front->start, back->end

Queue: implementation using Array

10

Page 11: Queue Data Structure (w/ php egs)

Queue: implementation using Array

enqueue(item): item => q[end], end++dequeue(): item <= q[start], start++

if Queue not full- put element at end Q[tail] <- elem- increment tail tail <- tail + 1

11

Page 12: Queue Data Structure (w/ php egs)

int A[10]front = -1tail = -1function isEmpty() { front == -1 && tail == -1 }function isFull() { tail == size(A)-1 }function enqueue(v) {

if isFull() -> error Queue is fullif isEmpty() front <- tail <- 0 else tail+=1

A[tail] = v}

Queue: implementation using Array

12

Page 13: Queue Data Structure (w/ php egs)

Queue: implementation using Array

13

Page 14: Queue Data Structure (w/ php egs)

Queue: implementation using Array

14

Page 15: Queue Data Structure (w/ php egs)

Queue: implementation using Array

15

Page 16: Queue Data Structure (w/ php egs)

Queue: implementation using Arrayfunction dequeue() {

if isEmpty() -> error Queue is emptyelseif front == tail

front <- rear <- -1else

front += 1}

16

Page 17: Queue Data Structure (w/ php egs)

Queue: implementation using Array

17

Page 18: Queue Data Structure (w/ php egs)

Queue: implementation using Array

18

Page 19: Queue Data Structure (w/ php egs)

no end on arraywrapping aroundring buffer / circular bufferpush/pop - O(1)

when item inserted to rair, tails’s pointer moves upwardswhen item deleted, head’s pointer moves downwards

current_position = inext_position = (i + 1) % Nprev_position = (N + i - 1) % N

Queue: implementation Cyclic Array

19

Page 20: Queue Data Structure (w/ php egs)

function isFull() {(tail + 1 ) % N == head

}

function enqueue(v) {if isFull() -> error Queue is fullif isEmpty() front <- tail <- 0else tail = (tail + 1) % N

A[tail] = v}

function dequeue() {if isEmpty() -> error Queue is emptyelseif front == tail front <- rear <- -1else front = (front + 1) % N}

Queue: implementation Cyclic Array

20

Page 21: Queue Data Structure (w/ php egs)

Queue: implementation using Array: pros & cons

pros- minor memory savings (compared with

LinkedList impl)- easier to developcons- fixed size- when is full, need create new arary, with

reallocation of memory and copy all els to the new array (costly process, O(n))

21

Page 22: Queue Data Structure (w/ php egs)

Queue: implementation using Linked List

one way Linked List (based on the work with dynamic memory)insertion/removal: at head O(1), at tail O(n)

http://www.cosc.canterbury.ac.nz/mukundan/dsal/LinkQueueAppl.html

22

Page 23: Queue Data Structure (w/ php egs)

Queue: implementation using Linked List

insert: create a node, update tail pointertraversal is complex, O(n)

23

Page 24: Queue Data Structure (w/ php egs)

Queue: implementation using Linked List

O(1)

24

Page 25: Queue Data Structure (w/ php egs)

class Node { Object data Node next}

class Queue { Node front Node rear}

isEmpty() { return rear == null}

Queue: implementation using Linked List

25

function enqueue(x) {

newNode = new Node

newNode->data = x

if isEmpty()

front = newNode

else

rear->next = newNode

rear = newNode

}

function dequeue(d) { temp = front if front = null { return } if front == rear { front = rear = null } else { front = front->next } free(temp)}

Page 26: Queue Data Structure (w/ php egs)

<?php@todo

Queue: php implementation using Linked List

26

Page 27: Queue Data Structure (w/ php egs)

Queue: implementation using Linked List: pros & cons

pros- size is limited by memory capacity

cons- requires more memory- more memory is fragmented

27

Page 28: Queue Data Structure (w/ php egs)

Queue: implementation using 2 Stacks

- leftStack for push- rightStack for pop- push-/pop- -Left/-Right

28

Page 29: Queue Data Structure (w/ php egs)

Queue: implementation using 2 Stacks: example

procedure enqueue(x):S1.push(x)

function dequeue():if S1 is empty and S2 is empty:

error: stack is empty

while S1 isn’t empty:S2.push(S1.pop())

return S2.pop()

29

Page 30: Queue Data Structure (w/ php egs)

Queue: implementation using 2 Stacks: pros & cons

Эту реализацию несложно модифицировать для получения минимума в текущей очереди за O(1).

Если leftStack не пуст, то операция pop может выполняться O(n) времени, в отличии от других реализаций, где pop всегда выполняется за O(1).

30

Page 31: Queue Data Structure (w/ php egs)

Queue: implementation using 6 Stacks

- on 2 stack - worst case O(n) for operation- persistent queue

31

Page 32: Queue Data Structure (w/ php egs)

Queue: implementation using 6 Stacks: example

@ todo

32

Page 33: Queue Data Structure (w/ php egs)

pros- ??? O(1)- can be improved to persistent queue, if use persistent stack

cons- longer than the average operation is performed- more memory consumption- the greater complexity of implementation

Queue: implementation using 6 Stacks: pros & cons

33

Page 34: Queue Data Structure (w/ php egs)

Queue: php (SPL)

SplQueue

34

class SplQueue extends SplDoublyLinkedList implements Iterator, ArrayAccess, Countable {

mixed dequeue ()void enqueue ($value)void setIteratorMode ($mode) // IT_MODE_DELETE, IT_MODE_KEEP, SplDoublyLinkedList::IT_MODE_FIFO,

+ inherited methods from SplDoublyLinkedList}

Page 35: Queue Data Structure (w/ php egs)

Queue: php (SPL) IRL

@todo

35

Page 36: Queue Data Structure (w/ php egs)

Queue: php (SPL)

$queue = new SplQueue();$queue->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);

$queue->enqueue(1);$queue->enqueue(2);$queue->enqueue(3);

print_r($queue->dequeue());print_r($queue->dequeue());

print_r($queue);

36

Output:12SplQueue Object (

[flags:SplDoublyLinkedList:private] => 1[dllist:SplDoublyLinkedList:private] => Array

([0] => 3

))

Page 37: Queue Data Structure (w/ php egs)

class Queue { public function enqueue($item) { } public function dequeue() { } public function count() { }}

Queue: implementation in php

37

Page 38: Queue Data Structure (w/ php egs)

class Queue {private $_queue = array();

public function enqueue($item) {$this->_queue[] = $item;

}

public function dequeue() {return array_shift($this->_queue);

}

public function count() {return count($this->_queue);

}}

Queue: implementation in php (using Array)

38

Page 39: Queue Data Structure (w/ php egs)

class Queue {private $_queue = array();private $_headPosition = null,

$_tailPosition = null;

public function enqueue($item) {$this->_queue[] = $item;

if ($this->count() == 1) {$this->_headPosition

= 0;$this->_tailPosition

= 0;}$this->rewind();

}

public function count() {return count($this->_queue);

}

Queue: implementation in php (using Array)

39

public function dequeue() {

$item = $this->_queue[$this->_headPosition];

$this->_headPosition++;

return $item;

}

public function hasNext() {

return isset($this->_queue[$this->_headPosition]);

}

public function rewind() {

$this->_tailPosition = $this->_headPosition;

}

}

Page 40: Queue Data Structure (w/ php egs)

Priority Queue: definition

abstract data typeeach element has a "priority" attrpop will find element with highest priority

40

Page 41: Queue Data Structure (w/ php egs)

- bandwidth management- discrete event simulation- job scheduling- Dijkstra's algorithm- Huffman coding- Best-first search algorithms- ROAM triangulation algorithm- Prim's algorithm for minimum spanning tree

Priority Queue: examples IRL

41

Page 42: Queue Data Structure (w/ php egs)

Priority Queue: types

ascending (min) priority queuedescending (max) priority queue

42

Page 43: Queue Data Structure (w/ php egs)

Priority Queue: interface

insert - insert with priorityfind-minimum (or maximum)delete-minimum (or maximum)compare

meld - join two priority queuesdelete an arbitrary itemdecrease-key (increase) the priority of a item

43

Page 44: Queue Data Structure (w/ php egs)

Priority Queue: basic example

44

Page 45: Queue Data Structure (w/ php egs)

Priority Queue: implementation

array (unordered, ordered)linked-list (unordered and reverse-ordered)binary heap

45

Page 46: Queue Data Structure (w/ php egs)

Priority Queue: implementation as Unordered Array

class QueueAsUnorderedArray { ...foreach..}

http://algs4.cs.princeton.edu/24pq/UnorderedArrayMaxPQ.java.html

46

Page 47: Queue Data Structure (w/ php egs)

Priority Queue: implementation as Ordered Array

class QueueAsOrderedArray { ...foreach..}

http://algs4.cs.princeton.edu/24pq/OrderedArrayMaxPQ.java.html

47

Page 48: Queue Data Structure (w/ php egs)

Priority Queue: implementation as Linked List

48

Page 49: Queue Data Structure (w/ php egs)

Priority Queue: implementation as Heap

Heap-based priority queueinsert/deleteMin = O(log n)

49

Page 50: Queue Data Structure (w/ php egs)

SplPriorityQueue impl using max-heap

Priority Queue: php (SPL)

50

public bool isEmpty ()

public mixed key ()

public void next ()

public void recoverFromCorruption ()

public void rewind ()

public void setExtractFlags ($flags)

public mixed top ()

public bool valid ()

}

class SplPriorityQueue implements Iterator, Countable {

public __construct ()

public int compare ($priority1, $priority2)

public int count ()

public mixed current ()

public mixed extract ()

public void insert ($value, $priority)

Page 51: Queue Data Structure (w/ php egs)

count: 4array { "data" => "D", "priority" => 9 }array { "data" => "B", "priority" => 6 }array { "data" => "A", "priority" => 3 }array { "data" => "C", "priority" => 1 }

$queue = new SplPriorityQueue;$queue->insert('A', 3); // A3$queue->insert('B', 6); // B6, A3$queue->insert('C', 1); // B6, A3, C1$queue->insert('D', 9); // D9, B6, A3, C1

echo 'count: ' . $queue->count();

$queue->setExtractFlags(SplPriorityQueue::EXTR_BOTH);

while($queue->valid()){ var_dump($queue->current()); $queue->next(); }

Priority Queue: php (SPL)

51

Page 52: Queue Data Structure (w/ php egs)

Priority Queue: php (SplMinHeap SPL)

52

class SplMinHeapextends SplHeap implements Iterator , Countable {

protected int compare ($value1, $value2)

+ inherited methods from SplHeap}

SplMinHeap stores minimal el on head

Page 53: Queue Data Structure (w/ php egs)

Priority Queue: php (SplMinHeap SPL)

$pq = new SplMinHeap;

$pq->insert(array(3, 'Clear drains'));$pq->insert(array(4, 'Feed cat'));$pq->insert(array(5, 'Make tea'));$pq->insert(array(1, 'Solve RC tasks'));$pq->insert(array(2, 'Tax return'));

while (!$pq->isEmpty()) { print_r($pq->extract());}

53

Page 54: Queue Data Structure (w/ php egs)

Priority Queue: php (unordered array)

54

Page 55: Queue Data Structure (w/ php egs)

double-ended queueels can be added to head or tailis generalization of both stack and queue

DEQueue: definition

55

Page 56: Queue Data Structure (w/ php egs)

input restricted deque- restricts insertion of els at one end only- allow deletion of both ends

output restricted deque- restricts deletion of els at one end only- allows insertion to both ends

Deque: types

56

Page 57: Queue Data Structure (w/ php egs)

double linked-list (with two additional reference variables to refer the first and last items)

Deque: implementation

57

Page 58: Queue Data Structure (w/ php egs)

addLeft(item)addRight(item)isEmpty()front()back()dequeueLeft()dequeueRight()

Deque: interface

58

Page 59: Queue Data Structure (w/ php egs)

# resources- http://xlinux.nist.gov/dads//HTML/queue.html- http://algs4.cs.princeton.edu/24pq/- https://www.doc.ic.ac.uk/~ar3/lectures/ProgrammingII/LargePrintOut/Lecture5PrintOut.pdf- http://neerc.ifmo.ru/wiki/index.php?title=Очередь- http://neerc.ifmo.ru/wiki/index.php?title=Персистентная_очередь

- http://habrahabr.ru/post/241231/- @ http://habrahabr.ru/post/240519/

- https://www.youtube.com/watch?v=okr-XE8yTO8 implementation Queue as Array- https://www.youtube.com/watch?v=A5_XdiK4J8A implementation Queue as Linked `List- https://www.cs.usfca.edu/~galles/visualization/QueueArray.html- https://www.cs.usfca.edu/~galles/visualization/QueueLL.html

59