Merging two binomial queues is like doing binary addition. For example, consider the addition of and :
+ | |||||||
|
In the next step, we add the from and the from . Combining the two s we get a which we carry to the next column. Since there are no s left, the result does not contain any. The addition continues in a similar manner until all the columns have been added up.
Program gives an implementation of this addition algorithm. The Merge member function of the BinomialQueue class takes a reference to a BinomialQueue and adds its subtrees to this binomial queue.
Program: BinomialQueue Class Merge Member Function Definition
Each iteration of the main loop of the algorithm (lines 12-24) computes the ``bit'' of the result--the bit is a binomial tree of order i. At most three terms need to be considered: the carry from the preceding iteration and two s, one from each of the queues that are being merged.
Two functions, Sum and Carry, compute the result required in each iteration. Program defines both Sum and Carry. Notice that the Sum function simply selects and returns one of its arguments. Therefore, the running time for Sum is clearly O(1).
Program: BinomialQueue Class Sum and Carry Member Function Definitions
In the worst case, the Carry function calls the Add function to combine two BinomialTrees into one. Therefore, the worst-case running time for Carry is
Suppose the Merge routine of Program is used to combine a binomial queue with n items with another that contains m items. Since the resulting priority queue contains n+m items, there are at most binomial trees in the result. Thus, the running time for the Merge operation is