
In
computer science
Computer science is the study of computation, information, and automation. Computer science spans Theoretical computer science, theoretical disciplines (such as algorithms, theory of computation, and information theory) to Applied science, ...
, a queap is a
priority queue
In computer science, a priority queue is an abstract data type similar to a regular queue (abstract data type), queue or stack (abstract data type), stack abstract data type.
In a priority queue, each element has an associated ''priority'', which ...
data structure
In computer science, a data structure is a data organization and storage format that is usually chosen for Efficiency, efficient Data access, access to data. More precisely, a data structure is a collection of data values, the relationships amo ...
. The data structure allows insertions and deletions of arbitrary elements, as well as retrieval of the highest-priority element. Each deletion takes
amortized time
In computer science, amortized analysis is a method for analyzing a given algorithm's complexity, or how much of a resource, especially time or memory, it takes to execute. The motivation for amortized analysis is that looking at the worst-case ...
logarithmic in the number of items that have been in the structure for a longer time than the removed item. Insertions take constant amortized time.
The data structure consists of a
doubly linked list
In computer science, a doubly linked list is a linked data structure that consists of a set of sequentially linked records called nodes. Each node contains three fields: two link fields (references to the previous and to the next node in the se ...
and a
2–4 tree data structure, each modified to keep track of its minimum-priority element. The basic operation of the structure is to keep newly inserted elements in the doubly linked list, until a deletion would remove one of the list items, at which point they are all moved into the 2–4 tree. The 2–4 tree stores its elements in insertion order, rather than the more conventional priority-sorted order.
Both the data structure and its name were devised by
John Iacono and
Stefan Langerman.
Description
A queap is a priority queue that inserts elements in ''O''(1) amortized time, and removes the minimum element in ''O''(log(''k'' + 2)) if there are ''k'' items that have been in the heap for a longer time than the element to be extracted. The queap has a property called the queueish property: the time to search for element ''x'' is O(lg ''q''(''x'')) where ''q''(''x'') is equal to ''n'' − 1 − ''w''(''x'') and ''w''(''x'') is the number of distinct items that has been accessed by operations such as searching, inserting, or deleting. ''q''(''x'') is defined as how many elements have not been accessed since ''x''
's last access. Indeed, the queueish property is the complement of the splay tree working set property: the time to search for element ''x'' is ''O''(lg ''w''(''x'')).
A queap can be represented by two data structures: a doubly linked list and a modified version of 2–4 tree. The doubly linked list, ''L'', is used for a series of insert and locate-min operations. The queap keeps a pointer to the minimum element stored in the list. To add element ''x'' to list ''l'', the element ''x'' is added to the end of the list and a bit variable in element ''x'' is set to one. This operation is done to determine if the element is either in the list or in a 2–4 tree.
A 2–4 tree is used when a delete operation occurs. If the item ''x'' is already in tree ''T'', the item is removed using the 2–4 tree delete operation. Otherwise, the item ''x'' is in list ''L'' (done by checking if the bit variable is set). All the elements stored in list ''L'' are then added to the 2–4 tree, setting the bit variable of each element to zero. ''x'' is then removed from ''T''.
A queap uses only the 2–4 tree structure properties, not a search tree. The modified 2–4 tree structure is as follows. Suppose list ''L'' has the following set of elements:
. When the deletion operation is invoked, the set of elements stored in ''L'' is then added to the leaves of the 2–4 tree in that order, proceeded by a dummy leaf containing an infinite key. Each internal node of ''T'' has a pointer
, which points to the smallest item in subtree ''v''. Each internal node on path ''P'' from the root to
has a pointer
, which points to the smallest key in
. The
pointers of each internal node on path ''P'' are ignored. The queap has a pointer to
, which points to the smallest element in ''T''.
An application of queaps includes a unique set of high priority events and extraction of the highest priority event for processing.
Operations
Let ''minL'' be a pointer that points to the minimum element in the doubly linked list ''L'',
be the minimum element stored in the 2–4 tree, ''T'', ''k'' be the number of elements stored in ''T'', and ''n'' be the total number of elements stored in queap ''Q''. The operations are as follows:
''New(Q):'' Initializes a new empty queap.
: Initialize an empty doubly linked list ''L'' and 2–4 tree ''T''. Set ''k'' and ''n'' to zero.
''Insert(Q, x):'' Add the element ''x'' to queap ''Q''.
: Insert the element ''x'' in list ''L''. Set the bit in element ''x'' to one to demonstrate that the element is in the list ''L''. Update the ''minL'' pointer if ''x'' is the smallest element in the list. Increment ''n'' by 1.
''Minimum(Q):'' Retrieve a pointer to the smallest element from queap ''Q''.
: If ''key(minL)'' < ''key''(
), return ''minL''. Otherwise return
.
''Delete(Q, x):'' Remove element x from queap ''Q''.
: If the bit of the element ''x'' is set to one, the element is stored in list ''L''. Add all the elements from ''L'' to ''T'', setting the bit of each element to zero. Each element is added to the parent of the right most child of ''T'' using the insert operation of the 2–4 tree. ''L'' becomes empty. Update
pointers for all the nodes ''v'' whose children are new/modified, and repeat the process with the next parent until the parent is equal to the root. Walk from the root to node
, and update the
values. Set ''k'' equal to ''n''.
: If the bit of the element ''x'' is set to zero, ''x'' is a leaf of ''T''. Delete x using the 2–4 tree delete operation. Starting from node ''x'', walk in ''T'' to node
, updating
and
pointers. Decrement n and k by 1.
''DeleteMin(Q):'' Delete and return the smallest element from queap ''Q''.
: Invoke the ''Minimum(Q)'' operation. The operation returns ''min''. Invoke the ''Delete(Q, min)'' operation. Return ''min''.
''CleanUp(Q):'' Delete all the elements in list ''L'' and tree ''T''.
: Starting from the first element in list ''L'', traverse the list, deleting each node.
: Starting from the root of the tree ''T'', traverse the tree using the
post-order traversal algorithm, deleting each node in the tree.
Analysis
The running time is analyzed using the
amortized analysis
In computer science, amortized analysis is a method for analyzing a given algorithm's complexity, or how much of a resource, especially time or memory, it takes to execute. The motivation for amortized analysis is that looking at the worst-case ...
. The potential function for queap Q will be
where
.
''Insert(Q, x):'' The cost of the operation is ''O(1)''. The size of list ''L'' grows by one, the potential increases by some constant ''c''.
''Minimum(Q):'' The operation does not alter the data structure so the amortized cost is equal to its actual cost, O(1).
''Delete(Q, x):'' There are two cases.
Case 1
If ''x'' is in tree ''T'', then the amortized cost is not modified. The delete operation is ''O(1)'' amortized 2–4 tree. Since ''x'' was removed from the tree,
and
pointers may need updating. At most, there will be
updates.
Case 2
If ''x'' is in list ''L'', then all the elements from ''L'' are inserted in ''T''. This has a cost of
of some constant ''a'', amortized over the 2–4 tree. After inserting and updating the
and
pointers, the total time spent is bounded by
. The second operation is to delete ''x'' from ''T'', and to walk on the path from x to
, correcting
and
values. The time is spent at most
. If
, then the amortized cost will be
.
''Delete(Q, x):'' is the addition of the amortized cost of ''Minimum(Q)'' and ''Delete(Q, x)'', which is
.
Code example
A small
Java
Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
implementation of a queap:
public class Queap
See also
*
Queue (data structure)
In computer science, a queue is a collection of entities that are maintained in a sequence and can be modified by the addition of entities at one end of the sequence and the removal of entities from the other end of the sequence. By convention, ...
*
Splay tree
A splay tree is a binary search tree with the additional property that recently accessed elements are quick to access again. Like self-balancing binary search trees, a splay tree performs basic operations such as insertion, look-up and removal ...
References
{{reflist
Heaps (data structures)
Algorithmic information theory
Articles with example Java code
Amortized data structures