MarketOpen addressing
Company Profile

Open addressing

Open addressing, or closed hashing, is a method of collision resolution in hash tables. With this method a hash collision is resolved by probing, or searching through alternative locations in the array until either the target record is found, or an unused array slot is found, which indicates that there is no such key in the table. Well-known probe sequences include:Linear probingin which the interval between probes is fixed — often set to 1. Quadratic probingin which the interval between probes increases linearly. Double hashingin which the interval between probes is fixed for each record but is computed by another hash function.

Example pseudocode
The following pseudocode is an implementation of an open addressing hash table with linear probing and single-slot stepping, a common approach that is effective if the hash function is good. Each of the lookup, set and remove functions use a common internal function find_slot to locate the array slot that either does or should contain a given key. record pair { key, value, occupied flag (initially unset) } var pair slot[0], slot[1], ..., slot[num_slots - 1] function find_slot(key) i := hash(key) modulo num_slots // search until we either find the key, or find an empty slot. while (slot[i] is occupied) and (slot[i].key ≠ key) i := (i + 1) modulo num_slots return i function lookup(key) i := find_slot(key) if slot[i] is occupied // key is in table return slot[i].value else // key is not in table return not found function set(key, value) i := find_slot(key) if slot[i] is occupied // we found our key slot[i].value := value return if the table is almost full rebuild the table larger (note 1) i := find_slot(key) mark slot[i] as occupied slot[i].key := key slot[i].value := value ; note 1 : Rebuilding the table requires allocating a larger array and recursively using the set operation to insert all the elements of the old array into the new larger array. It is common to increase the array size exponentially, for example by doubling the old array size. function remove(key) i := find_slot(key) if slot[i] is unoccupied return // key is not in the table mark slot[i] as unoccupied j := i loop (note 2) j := (j + 1) modulo num_slots if slot[j] is unoccupied exit loop k := hash(slot[j].key) modulo num_slots // determine if k lies cyclically in (i,j] // i ≤ j: | i..k..j | // i > j: |.k..j i....| or |....j i..k.| if i ≤ j if (i < k) and (k ≤ j) continue loop else if (k ≤ j) or (i < k) continue loop mark slot[i] as occupied slot[i].key := slot[j].key slot[i].value := slot[j].value mark slot[j] as unoccupied i := j ; note 2 : For all records in a cluster, there must be no vacant slots between their natural hash position and their current position (else lookups will terminate before finding the record). At this point in the pseudocode, is a vacant slot that might be invalidating this property for subsequent records in the cluster. is such a subsequent record. is the raw hash where the record at would naturally land in the hash table if there were no collisions. This test is asking if the record at is invalidly positioned with respect to the required properties of a cluster now that is vacant. Another technique for removal is simply to mark the slot as deleted. However this eventually requires rebuilding the table simply to remove deleted records. The methods above provide O(1) updating and removal of existing records, with occasional rebuilding if the high-water mark of the table size grows. The O(1) remove method above is only possible in linearly probed hash tables with single-slot stepping. In the case where many records are to be deleted in one operation, marking the slots for deletion and later rebuilding may be more efficient. ==Performance==
Performance
Assuming an ideal hash function (one that uniformly distributes all elements of the universe), and a random choice of elements from the universe, the performance of the linear probing method is: EU_n = \frac{1}{2}\left(1+\frac{1}{1-\alpha}\right) + \Theta(\frac{1}{m}) ES_n = \frac{1}{2}\left(1+\frac{1}{(1-\alpha)^2}\right) + \Theta(\frac{1}{m}) Here n is the number of elements in the table, m the table size, \alpha=n/m the load factor, U_n the number of probes in an unsuccessful search and S_n the number of probes in a successful search. Note that the expectation deteriorates to infinity when the load factor approaches 1. ==See also==
tickerdossier.comtickerdossier.substack.com