A skew heap (or self-adjusting heap) is a
heap data structure
In computer science, a data structure is a data organization, management, and storage format that is usually chosen for efficient access to data. More precisely, a data structure is a collection of data values, the relationships among them, a ...
implemented as a
binary tree
In computer science, a binary tree is a k-ary k = 2 tree data structure in which each node has at most two children, which are referred to as the ' and the '. A recursive definition using just set theory notions is that a (non-empty) binary t ...
. Skew heaps are advantageous because of their ability to merge more quickly than binary heaps. In contrast with
binary heap
A binary heap is a heap data structure that takes the form of a binary tree. Binary heaps are a common way of implementing priority queues. The binary heap was introduced by J. W. J. Williams in 1964, as a data structure for heapsort.
A bin ...
s, there are no structural constraints, so there is no guarantee that the height of the tree is logarithmic. Only two conditions must be satisfied:
* The general heap order must be enforced
* Every operation (add, remove_min, merge) on two skew heaps must be done using a special ''skew heap merge''.
A skew heap is a self-adjusting form of a
leftist heap which attempts to maintain balance by unconditionally swapping all nodes in the merge path when merging two heaps. (The merge operation is also used when adding and removing values.)
With no structural constraints, it may seem that a skew heap would be horribly inefficient. However,
amortized complexity analysis can be used to demonstrate that all operations on a skew heap can be done in O(log ''n'').
In fact, with
denoting the
golden ratio
In mathematics, two quantities are in the golden ratio if their ratio is the same as the ratio of their sum to the larger of the two quantities. Expressed algebraically, for quantities a and b with a > b > 0,
where the Greek letter phi ( ...
, the exact amortized complexity is known to be log
φ ''n'' (approximately 1.44 log
2 ''n'').
[
]
Definition
Skew heaps may be described with the following
recursive
Recursion (adjective: ''recursive'') occurs when a thing is defined in terms of itself or of its type. Recursion is used in a variety of disciplines ranging from linguistics to logic. The most common application of recursion is in mathematics ...
definition:
*A heap with only one element is a skew heap.
*The result of ''skew merging'' two skew heaps
and
is also a skew heap.
Operations
Merging two heaps
When two skew heaps are to be merged, we can use a similar process as the merge of two
leftist heaps:
* Compare roots of two heaps; let be the heap with the smaller root, and q be the other heap. Let be the name of the resulting new heap.
* Let the root of r be the root of (the smaller root), and let r's right subtree be p's left subtree.
* Now, compute r's left subtree by recursively merging p's right subtree with q.
template
SkewNode* CSkewHeap::_Merge(SkewNode* root_1, SkewNode* root_2)
Before:
after
Non-recursive merging
Alternatively, there is a non-recursive approach which is more wordy, and does require some sorting at the outset.
*Split each heap into subtrees by cutting every path. (From the root node, sever the right node and make the right child its own subtree.) This will result in a set of trees in which the root either only has a left child or no children at all.
*Sort the subtrees in ascending order based on the value of the root node of each subtree.
*While there are still multiple subtrees, iteratively recombine the last two (from right to left).
** If the root of the second-to-last subtree has a left child, swap it to be the right child.
** Link the root of the last subtree as the left child of the second-to-last subtree.
Adding values
Adding a value to a skew heap is like merging a tree with one node together with the original tree.
Removing values
Removing the first value in a heap can be accomplished by removing the root and merging its child subtrees.
Implementation
In many functional languages, skew heaps become extremely simple to implement. Here is a complete sample implementation in Haskell.
data SkewHeap a = Empty
, Node a (SkewHeap a) (SkewHeap a)
singleton :: Ord a => a -> SkewHeap a
singleton x = Node x Empty Empty
union :: Ord a => SkewHeap a -> SkewHeap a -> SkewHeap a
Empty `union` t2 = t2
t1 `union` Empty = t1
t1@(Node x1 l1 r1) `union` t2@(Node x2 l2 r2)
, x1 <= x2 = Node x1 (t2 `union` r1) l1
, otherwise = Node x2 (t1 `union` r2) l2
insert :: Ord a => a -> SkewHeap a -> SkewHeap a
insert x heap = singleton x `union` heap
extractMin :: Ord a => SkewHeap a -> Maybe (a, SkewHeap a)
extractMin Empty = Nothing
extractMin (Node x l r) = Just (x, l `union` r)
References
{{reflist
External links
Lecture notes, Skew Heaps, York UniversityAnimations comparing leftist heaps and skew heaps, York University*
ttp://people.cis.ksu.edu/~rhowell/viewer/heapviewer.html Java applet for simulating heaps, Kansas State University
Binary trees
Heaps (data structures)