12
§8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew heaps? O(log N) – What’s wrong? What is the total time for inserting N keys into an empty binary heap? According to Theorem 5.1 on p.156, the total time should be O(N)… Then what is the average time? Constant! So O(log N) for an insertion is NOT good enough! Structure: A binomial queue is not a heap-ordered tree, but rather a collection of heap-ordered trees, known as a forest. Each heap-ordered tree is a binomial tree. A binomial tree of height 0 is a one-node tree. A binomial tree, B k , of height k is formed by att aching a binomial tree, B k – 1 , to the root of anot her binomial tree, B k – 1 . B 0 B 1 B 2 B 3 1/12 Discussion 13: Discussion 13: B B k consists of a root consists of a root with with children, which are children, which are . . B B k has exactly has exactly nodes. nodes. The number of nodes at depth The number of nodes at depth d d is is . .

§8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

Embed Size (px)

Citation preview

Page 1: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

Haven’t we had enough about queues?

What is a binomial queue for?

Well, what is the averagetime for insertions with

leftist or skew heaps? O(log N) – What’s wrong?

What is the total time for inserting N keys into an empty binary heap?

According to Theorem 5.1 on p.156, the total time should be O(N)…

Then what is the average time?

Constant! So O(log N) for an insertion is

NOT good enough!

Structure:

A binomial queue is not a heap-ordered tree, but rather a collection of heap-ordered trees, known as a forest. Each heap-ordered tree is a binomial tree.

A binomial tree of height 0 is a one-node tree.A binomial tree, Bk, of height k is formed by attaching a binomial tree, Bk – 1, to the root of another binomial tree, Bk – 1.

B0 B1 B2 B3

1/12

Discussion 13:Discussion 13: BBkk consists of a root with consists of a root with childre childre

n, which aren, which are . . BBkk has exactly has exactly nodes. The n nodes. The n

umber of nodes at depth umber of nodes at depth dd is is . .

Page 2: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

【 Example 】 Represent a priority queue of size 13 by a collection of binomial trees.

Bk structure + heap order + one binomial tree for each height A priority queue of any size can be uniquely represented by a collection of binomial trees.

Solution: 13 = 20 + 021 + 22 + 23 = 11012

B0 B1 B2 B3

13 23

51 24

65

12

21 24

65

14

26 16

18

2/12

Page 3: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

Operations:

FindMin: The minimum key is in one of the roots.There are at most roots, hence Tp = O( ).log N log N

Note: We can remember the minimum and update whenever it is changed. Then this operation will take O(1).

Note: We can remember the minimum and update whenever it is changed. Then this operation will take O(1).

Merge: H1

H213

12

21 24

65

16

18

14

26

23

51 24

65

H1

1 1 0 2 = 6

+ 1 1 1 2 = 7

113 0

c

14

26 16

18

1

c

12

21 24

65

23

51 24

65

1

Tp = O( )log N

Must keep the trees in the binomial queue

sorted by height.

3/12

Page 4: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

Insert: a special case for merging.

【 Example 】 Insert 1, 2, 3, 4, 5, 6, 7 into an initially empty queue.

1

2

3

4

1

2 3

4

5

6

57

4/12

Discussion 14:Discussion 14: What is the average time What is the average time complexity of performing complexity of performing NN insertions on an initially insertions on an initially empty binomial queue? Prove your conclusion.empty binomial queue? Prove your conclusion.

Page 5: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

DeleteMin ( H ):

H 1314

26 16

18

12

21 24

65

23

51 24

65

H’ 1314

26 16

18

Step 1: FindMin in Bk

Step 2: Remove Bk from H

Step 3: Remove root from Bk 2124

65

23

51 24

65

H”

Step 4: Merge (H’, H”)

23

51 24

65

H 13

21 24

65

14

26 16

18

/* O(log N) */

/* O(1) */

/* O(log N) */

/* O(log N) */

5/12

Page 6: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

Implementation:

Binomial queue = array of binomial trees

DeleteMin

Merge

Find all the subtrees quickly

The children are ordered by their sizes

Operation Property Solution

6/12

Discussion 15:Discussion 15: How can we implement How can we implement the trees so that all the the trees so that all the subtrees can be accessesubtrees can be accessed quickly?d quickly?

Discussion 16:Discussion 16: In which order must we In which order must we link the subtrees?link the subtrees?

Page 7: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

typedef struct BinNode *Position;typedef struct Collection *BinQueue;typedef struct BinNode *BinTree; /* missing from p.176 */

struct BinNode {

ElementType Element;Position LeftChild;Position NextSibling;

} ;

struct Collection {

int CurrentSize; /* total number of nodes */BinTree TheTrees[ MaxTrees ];

} ;

7/12

Page 8: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

BinTreeCombineTrees( BinTree T1, BinTree T2 ){ /* merge equal-sized T1 and T2 */

if ( T1->Element > T2->Element )/* attach the larger one to the smaller one */return CombineTrees( T2, T1 );

/* insert T2 to the front of the children list of T1 */T2->NextSibling = T1->LeftChild;T1->LeftChild = T2;return T1;

} Tp = O( 1 )

12

24 21

65

14

16 26

18

T1

T2

8/12

Page 9: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

BinQueue Merge( BinQueue H1, BinQueue H2 ){ BinTree T1, T2, Carry = NULL;

int i, j;if ( H1->CurrentSize + H2-> CurrentSize > Capacity ) ErrorMessage();H1->CurrentSize += H2-> CurrentSize;for ( i=0, j=1; j<= H1->CurrentSize; i++, j*=2 ) { T1 = H1->TheTrees[i]; T2 = H2->TheTrees[i]; /*current trees */ switch( 4*!!Carry + 2*!!T2 + !!T1 ) {

case 0: /* 000 */ case 1: /* 001 */ break;

case 2: /* 010 */ H1->TheTrees[i] = T2; H2->TheTrees[i] = NULL; break;case 4: /* 100 */ H1->TheTrees[i] = Carry; Carry = NULL; break;case 3: /* 011 */ Carry = CombineTrees( T1, T2 );

H1->TheTrees[i] = H2->TheTrees[i] = NULL; break;case 5: /* 101 */ Carry = CombineTrees( T1, Carry );

H1->TheTrees[i] = NULL; break;case 6: /* 110 */ Carry = CombineTrees( T2, Carry );

H2->TheTrees[i] = NULL; break;case 7: /* 111 */ H1->TheTrees[i] = Carry;

Carry = CombineTrees( T1, T2 ); H2->TheTrees[i] = NULL; break;

} /* end switch */} /* end for-loop */return H1;

}9/12

Discussion 17:Discussion 17: What What does each case number does each case number mean?mean?

Page 10: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

§8 Binomial Queues

ElementType DeleteMin( BinQueue H ){ BinQueue DeletedQueue;

Position DeletedTree, OldRoot;ElementType MinItem = Infinity; /* the minimum item to be returned */int i, j, MinTree; /* MinTree is the index of the tree with the minimum item */

if ( IsEmpty( H ) ) { PrintErrorMessage(); return –Infinity; }

for ( i = 0; i < MaxTrees; i++) { /* Step 1: find the minimum item */ if( H->TheTrees[i] && H->TheTrees[i]->Element < MinItem ) {

MinItem = H->TheTrees[i]->Element; MinTree = i; } /* end if */} /* end for-i-loop */DeletedTree = H->TheTrees[ MinTree ]; H->TheTrees[ MinTree ] = NULL; /* Step 2: remove the MinTree from H => H’ */ OldRoot = DeletedTree; /* Step 3.1: remove the root */ DeletedTree = DeletedTree->LeftChild; free(OldRoot);DeletedQueue = Initialize(); /* Step 3.2: create H” */ DeletedQueue->CurrentSize = ( 1<<MinTree ) – 1; /* 2MinTree – 1 */for ( j = MinTree – 1; j >= 0; j – – ) { DeletedQueue->TheTrees[j] = DeletedTree; DeletedTree = DeletedTree->NextSibling; DeletedQueue->TheTrees[j]->NextSibling = NULL;} /* end for-j-loop */H->CurrentSize – = DeletedQueue->CurrentSize + 1;H = Merge( H, DeletedQueue ); /* Step 4: merge H’ and H” */ return MinItem;

}

10/12

This can be replaced by the actual number of roots

Home work:

p.183 5.29

Merge two given binomial queues

p. 183 5.31

Insert without calling Merge

Page 11: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

Research Project 7Amortized Analysis (23)

Amortized analysis considers the worst-case running time for any sequence of M operations. This contrasts with the more typical analysis in which a worst-case bound is given for any single operation. This project requires you to analyze the binomial queue operation Merge. You must introduce the potential function for Merge, illustrate the amortized running time bound, and prove your conclusions. Detailed requirements can be downloaded from

http://acm.zju.edu.cn/dsaa/

11/12

Page 12: §8 Binomial Queues Haven’t we had enough about queues? What is a binomial queue for? Well, what is the average time for insertions with leftist or skew

Research Project 8Fibonacci Heaps (23)

A Fibonacci heap is a heap data structure consisting of a forest of trees. It has a better amortized running time than a binomial heap. Fibonacci heaps were developed by Michael L. Fredman and Robert E. Tarjan in 1984 and first published in a scientific journal in 1987. The name of Fibonacci heap comes from Fibonacci numbers which are used in the running time analysis. This project requires you to introduce the Fibonacci heap and compare it with binomial heaps. Detailed requirements can be downloaded from

http://acm.zju.edu.cn/dsaa/

12/12