Quadratic probing
Quadratic probing is an open addressing scheme in computer programming for resolving hash collisions in hash tables. Quadratic probing operates by taking the original hash index and adding successive values of an arbitrary quadratic polynomial until an open slot is found.
An example sequence using quadratic probing is:
Quadratic probing is often recommended as an alternative to linear probing because it incurs less clustering. Quadratic probing exhibits better locality of reference than many other hash table such as chaining; however, for queries, quadratic probing does not have as good locality as linear probing, causing the latter to be faster in some settings.
History
Quadratic probing was first introduced by Ward Douglas Maurer in 1968. Several subsequent variations of the data structure were proposed in the 1970s in order to guarantee that the probe sequence hits every slot without cycling prematurely. Quadratic probing is widely believed to avoid the clustering effects that make linear probing slow at high load factors. It serves as the basis for many widely used high-performance hash-tables, including Google's open-source Abseil hash table.It is conjectured that quadratic probing, when filled to full, supports insertions in expected time. Proving this, or even proving any non-trivial time bound for quadratic probing remains open. The closest result, due to Kuszmaul and Xi, shows that, at load factors of less than, insertions take expected time.
Quadratic function
Let h be a hash function that maps an element k to an integer in, where m is the size of the table. Let the ith probe position for a value k be given by the functionwhere c2 ≠ 0 . For a given hash table, the values of c1 and c2 remain constant.
Examples:
- If, then the probe sequence will be
- For m = 2n, a good choice for the constants are c1 = c2 = 1/2, as the values of h for i in are all distinct. This leads to a probe sequence of where the values increase by 1, 2, 3,...
- For prime m > 2, most choices of c1 and c2 will make h distinct for i in . Such choices include c1 = c2 = 1/2, c1 = c2 = 1, and c1 = 0, c2 = 1. However, there are only m/2 distinct probes for a given element, requiring other techniques to guarantee that insertions will succeed when the load factor exceeds 1/2.
- For, where m, n, and p are integer greater or equal 2, then gives cycle of all distinct probes. It can be computed in loop as:, and
- For any m, full cycle with quadratic probing can be achieved by rounding up m to closest power of 2, compute probe index:, and skip iteration when. There is maximum skipped iterations, and these iterations do not refer to memory, so it is fast operation on most modern processors. Rounding up m can be computed by:
uint64_t roundUp2