fbpx
Wikipedia

Binary search algorithm

In computer science, binary search, also known as half-interval search,[1] logarithmic search,[2] or binary chop,[3] is a search algorithm that finds the position of a target value within a sorted array.[4][5] Binary search compares the target value to the middle element of the array. If they are not equal, the half in which the target cannot lie is eliminated and the search continues on the remaining half, again taking the middle element to compare to the target value, and repeating this until the target value is found. If the search ends with the remaining half being empty, the target is not in the array.

Binary search algorithm
Visualization of the binary search algorithm where 7 is the target value
ClassSearch algorithm
Data structureArray
Worst-case performanceO(log n)
Best-case performanceO(1)
Average performanceO(log n)
Worst-case space complexityO(1)
OptimalYes

Binary search runs in logarithmic time in the worst case, making comparisons, where is the number of elements in the array.[a][6] Binary search is faster than linear search except for small arrays. However, the array must be sorted first to be able to apply binary search. There are specialized data structures designed for fast searching, such as hash tables, that can be searched more efficiently than binary search. However, binary search can be used to solve a wider range of problems, such as finding the next-smallest or next-largest element in the array relative to the target even if it is absent from the array.

There are numerous variations of binary search. In particular, fractional cascading speeds up binary searches for the same value in multiple arrays. Fractional cascading efficiently solves a number of search problems in computational geometry and in numerous other fields. Exponential search extends binary search to unbounded lists. The binary search tree and B-tree data structures are based on binary search.

Algorithm Edit

Binary search works on sorted arrays. Binary search begins by comparing an element in the middle of the array with the target value. If the target value matches the element, its position in the array is returned. If the target value is less than the element, the search continues in the lower half of the array. If the target value is greater than the element, the search continues in the upper half of the array. By doing this, the algorithm eliminates the half in which the target value cannot lie in each iteration.[7]

Procedure Edit

Given an array   of   elements with values or records  sorted such that  , and target value  , the following subroutine uses binary search to find the index of   in  .[7]

  1. Set   to   and   to  .
  2. If  , the search terminates as unsuccessful.
  3. Set   (the position of the middle element) to the floor of  , which is the greatest integer less than or equal to  .
  4. If  , set   to   and go to step 2.
  5. If  , set   to   and go to step 2.
  6. Now  , the search is done; return  .

This iterative procedure keeps track of the search boundaries with the two variables   and  . The procedure may be expressed in pseudocode as follows, where the variable names and types remain the same as above, floor is the floor function, and unsuccessful refers to a specific value that conveys the failure of the search.[7]

 
binary-search
function binary_search(A, n, T) is L := 0 R := n − 1 while L ≤ R do m := floor((L + R) / 2) if A[m] < T then L := m + 1 else if A[m] > T then R := m − 1 else: return m return unsuccessful 

Alternatively, the algorithm may take the ceiling of  . This may change the result if the target value appears more than once in the array.

Alternative procedure Edit

In the above procedure, the algorithm checks whether the middle element ( ) is equal to the target ( ) in every iteration. Some implementations leave out this check during each iteration. The algorithm would perform this check only when one element is left (when  ). This results in a faster comparison loop, as one comparison is eliminated per iteration, while it requires only one more iteration on average.[8]

Hermann Bottenbruch published the first implementation to leave out this check in 1962.[8][9]

  1. Set   to   and   to  .
  2. While  ,
    1. Set   (the position of the middle element) to the ceiling of  , which is the least integer greater than or equal to  .
    2. If  , set   to  .
    3. Else,  ; set   to  .
  3. Now  , the search is done. If  , return  . Otherwise, the search terminates as unsuccessful.

Where ceil is the ceiling function, the pseudocode for this version is:

function binary_search_alternative(A, n, T) is L := 0 R := n − 1 while L != R do m := ceil((L + R) / 2) if A[m] > T then R := m − 1 else: L := m if A[L] = T then return L return unsuccessful 

Duplicate elements Edit

The procedure may return any index whose element is equal to the target value, even if there are duplicate elements in the array. For example, if the array to be searched was   and the target was  , then it would be correct for the algorithm to either return the 4th (index 3) or 5th (index 4) element. The regular procedure would return the 4th element (index 3) in this case. It does not always return the first duplicate (consider   which still returns the 4th element). However, it is sometimes necessary to find the leftmost element or the rightmost element for a target value that is duplicated in the array. In the above example, the 4th element is the leftmost element of the value 4, while the 5th element is the rightmost element of the value 4. The alternative procedure above will always return the index of the rightmost element if such an element exists.[9]

Procedure for finding the leftmost element Edit

To find the leftmost element, the following procedure can be used:[10]

  1. Set   to   and   to  .
  2. While  ,
    1. Set   (the position of the middle element) to the floor of  , which is the greatest integer less than or equal to  .
    2. If  , set   to  .
    3. Else,  ; set   to  .
  3. Return  .

If   and  , then   is the leftmost element that equals  . Even if   is not in the array,   is the rank of   in the array, or the number of elements in the array that are less than  .

Where floor is the floor function, the pseudocode for this version is:

function binary_search_leftmost(A, n, T): L := 0 R := n while L < R: m := floor((L + R) / 2) if A[m] < T: L := m + 1 else: R := m return L 

Procedure for finding the rightmost element Edit

To find the rightmost element, the following procedure can be used:[10]

  1. Set   to   and   to  .
  2. While  ,
    1. Set   (the position of the middle element) to the floor of  , which is the greatest integer less than or equal to  .
    2. If  , set   to  .
    3. Else,  ; set   to  .
  3. Return  .

If   and  , then   is the rightmost element that equals  . Even if   is not in the array,   is the number of elements in the array that are greater than  .

Where floor is the floor function, the pseudocode for this version is:

function binary_search_rightmost(A, n, T): L := 0 R := n while L < R: m := floor((L + R) / 2) if A[m] > T: R := m else: L := m + 1 return R - 1 

Approximate matches Edit

 
Binary search can be adapted to compute approximate matches. In the example above, the rank, predecessor, successor, and nearest neighbor are shown for the target value  , which is not in the array.

The above procedure only performs exact matches, finding the position of a target value. However, it is trivial to extend binary search to perform approximate matches because binary search operates on sorted arrays. For example, binary search can be used to compute, for a given value, its rank (the number of smaller elements), predecessor (next-smallest element), successor (next-largest element), and nearest neighbor. Range queries seeking the number of elements between two values can be performed with two rank queries.[11]

  • Rank queries can be performed with the procedure for finding the leftmost element. The number of elements less than the target value is returned by the procedure.[11]
  • Predecessor queries can be performed with rank queries. If the rank of the target value is  , its predecessor is  .[12]
  • For successor queries, the procedure for finding the rightmost element can be used. If the result of running the procedure for the target value is  , then the successor of the target value is  .[12]
  • The nearest neighbor of the target value is either its predecessor or successor, whichever is closer.
  • Range queries are also straightforward.[12] Once the ranks of the two values are known, the number of elements greater than or equal to the first value and less than the second is the difference of the two ranks. This count can be adjusted up or down by one according to whether the endpoints of the range should be considered to be part of the range and whether the array contains entries matching those endpoints.[13]

Performance Edit

 
A tree representing binary search. The array being searched here is  , and the target value is  .
 
The worst case is reached when the search reaches the deepest level of the tree, while the best case is reached when the target value is the middle element.

In terms of the number of comparisons, the performance of binary search can be analyzed by viewing the run of the procedure on a binary tree. The root node of the tree is the middle element of the array. The middle element of the lower half is the left child node of the root, and the middle element of the upper half is the right child node of the root. The rest of the tree is built in a similar fashion. Starting from the root node, the left or right subtrees are traversed depending on whether the target value is less or more than the node under consideration.[6][14]

In the worst case, binary search makes   iterations of the comparison loop, where the   notation denotes the floor function that yields the greatest integer less than or equal to the argument, and   is the binary logarithm. This is because the worst case is reached when the search reaches the deepest level of the tree, and there are always   levels in the tree for any binary search.

The worst case may also be reached when the target element is not in the array. If   is one less than a power of two, then this is always the case. Otherwise, the search may perform  iterations if the search reaches the deepest level of the tree. However, it may make   iterations, which is one less than the worst case, if the search ends at the second-deepest level of the tree.[15]

On average, assuming that each element is equally likely to be searched, binary search makes   iterations when the target element is in the array. This is approximately equal to   iterations. When the target element is not in the array, binary search makes   iterations on average, assuming that the range between and outside elements is equally likely to be searched.[14]

In the best case, where the target value is the middle element of the array, its position is returned after one iteration.[16]

In terms of iterations, no search algorithm that works only by comparing elements can exhibit better average and worst-case performance than binary search. The comparison tree representing binary search has the fewest levels possible as every level above the lowest level of the tree is filled completely.[b] Otherwise, the search algorithm can eliminate few elements in an iteration, increasing the number of iterations required in the average and worst case. This is the case for other search algorithms based on comparisons, as while they may work faster on some target values, the average performance over all elements is worse than binary search. By dividing the array in half, binary search ensures that the size of both subarrays are as similar as possible.[14]

Space complexity Edit

Binary search requires three pointers to elements, which may be array indices or pointers to memory locations, regardless of the size of the array. Therefore, the space complexity of binary search is   in the word RAM model of computation.

Derivation of average case Edit

The average number of iterations performed by binary search depends on the probability of each element being searched. The average case is different for successful searches and unsuccessful searches. It will be assumed that each element is equally likely to be searched for successful searches. For unsuccessful searches, it will be assumed that the intervals between and outside elements are equally likely to be searched. The average case for successful searches is the number of iterations required to search every element exactly once, divided by  , the number of elements. The average case for unsuccessful searches is the number of iterations required to search an element within every interval exactly once, divided by the   intervals.[14]

Successful searches Edit

In the binary tree representation, a successful search can be represented by a path from the root to the target node, called an internal path. The length of a path is the number of edges (connections between nodes) that the path passes through. The number of iterations performed by a search, given that the corresponding path has length  , is   counting the initial iteration. The internal path length is the sum of the lengths of all unique internal paths. Since there is only one path from the root to any single node, each internal path represents a search for a specific element. If there are   elements, which is a positive integer, and the internal path length is  , then the average number of iterations for a successful search  , with the one iteration added to count the initial iteration.[14]

Since binary search is the optimal algorithm for searching with comparisons, this problem is reduced to calculating the minimum internal path length of all binary trees with   nodes, which is equal to:[17]

 

For example, in a 7-element array, the root requires one iteration, the two elements below the root require two iterations, and the four elements below require three iterations. In this case, the internal path length is:[17]

 

The average number of iterations would be   based on the equation for the average case. The sum for   can be simplified to:[14]

 

Substituting the equation for   into the equation for  :[14]

 

For integer  , this is equivalent to the equation for the average case on a successful search specified above.

Unsuccessful searches Edit

Unsuccessful searches can be represented by augmenting the tree with external nodes, which forms an extended binary tree. If an internal node, or a node present in the tree, has fewer than two child nodes, then additional child nodes, called external nodes, are added so that each internal node has two children. By doing so, an unsuccessful search can be represented as a path to an external node, whose parent is the single element that remains during the last iteration. An external path is a path from the root to an external node. The external path length is the sum of the lengths of all unique external paths. If there are   elements, which is a positive integer, and the external path length is  , then the average number of iterations for an unsuccessful search  , with the one iteration added to count the initial iteration. The external path length is divided by   instead of   because there are   external paths, representing the intervals between and outside the elements of the array.[14]

This problem can similarly be reduced to determining the minimum external path length of all binary trees with   nodes. For all binary trees, the external path length is equal to the internal path length plus  .[17] Substituting the equation for  :[14]

 

Substituting the equation for   into the equation for  , the average case for unsuccessful searches can be determined:[14]

 

Performance of alternative procedure Edit

Each iteration of the binary search procedure defined above makes one or two comparisons, checking if the middle element is equal to the target in each iteration. Assuming that each element is equally likely to be searched, each iteration makes 1.5 comparisons on average. A variation of the algorithm checks whether the middle element is equal to the target at the end of the search. On average, this eliminates half a comparison from each iteration. This slightly cuts the time taken per iteration on most computers. However, it guarantees that the search takes the maximum number of iterations, on average adding one iteration to the search. Because the comparison loop is performed only   times in the worst case, the slight increase in efficiency per iteration does not compensate for the extra iteration for all but very large  .[c][18][19]

Running time and cache use Edit

In analyzing the performance of binary search, another consideration is the time required to compare two elements. For integers and strings, the time required increases linearly as the encoding length (usually the number of bits) of the elements increase. For example, comparing a pair of 64-bit unsigned integers would require comparing up to double the bits as comparing a pair of 32-bit unsigned integers. The worst case is achieved when the integers are equal. This can be significant when the encoding lengths of the elements are large, such as with large integer types or long strings, which makes comparing elements expensive. Furthermore, comparing floating-point values (the most common digital representation of real numbers) is often more expensive than comparing integers or short strings.

On most computer architectures, the processor has a hardware cache separate from RAM. Since they are located within the processor itself, caches are much faster to access but usually store much less data than RAM. Therefore, most processors store memory locations that have been accessed recently, along with memory locations close to it. For example, when an array element is accessed, the element itself may be stored along with the elements that are stored close to it in RAM, making it faster to sequentially access array elements that are close in index to each other (locality of reference). On a sorted array, binary search can jump to distant memory locations if the array is large, unlike algorithms (such as linear search and linear probing in hash tables) which access elements in sequence. This adds slightly to the running time of binary search for large arrays on most systems.[20]

Binary search versus other schemes Edit

Sorted arrays with binary search are a very inefficient solution when insertion and deletion operations are interleaved with retrieval, taking   time for each such operation. In addition, sorted arrays can complicate memory use especially when elements are often inserted into the array.[21] There are other data structures that support much more efficient insertion and deletion. Binary search can be used to perform exact matching and set membership (determining whether a target value is in a collection of values). There are data structures that support faster exact matching and set membership. However, unlike many other searching schemes, binary search can be used for efficient approximate matching, usually performing such matches in   time regardless of the type or structure of the values themselves.[22] In addition, there are some operations, like finding the smallest and largest element, that can be performed efficiently on a sorted array.[11]

Linear search Edit

Linear search is a simple search algorithm that checks every record until it finds the target value. Linear search can be done on a linked list, which allows for faster insertion and deletion than an array. Binary search is faster than linear search for sorted arrays except if the array is short, although the array needs to be sorted beforehand.[d][24] All sorting algorithms based on comparing elements, such as quicksort and merge sort, require at least   comparisons in the worst case.[25] Unlike linear search, binary search can be used for efficient approximate matching. There are operations such as finding the smallest and largest element that can be done efficiently on a sorted array but not on an unsorted array.[26]

Trees Edit

 
Binary search trees are searched using an algorithm similar to binary search.

A binary search tree is a binary tree data structure that works based on the principle of binary search. The records of the tree are arranged in sorted order, and each record in the tree can be searched using an algorithm similar to binary search, taking on average logarithmic time. Insertion and deletion also require on average logarithmic time in binary search trees. This can be faster than the linear time insertion and deletion of sorted arrays, and binary trees retain the ability to perform all the operations possible on a sorted array, including range and approximate queries.[22][27]

However, binary search is usually more efficient for searching as binary search trees will most likely be imperfectly balanced, resulting in slightly worse performance than binary search. This even applies to balanced binary search trees, binary search trees that balance their own nodes, because they rarely produce the tree with the fewest possible levels. Except for balanced binary search trees, the tree may be severely imbalanced with few internal nodes with two children, resulting in the average and worst-case search time approaching   comparisons.[e] Binary search trees take more space than sorted arrays.[29]

Binary search trees lend themselves to fast searching in external memory stored in hard disks, as binary search trees can be efficiently structured in filesystems. The B-tree generalizes this method of tree organization. B-trees are frequently used to organize long-term storage such as databases and filesystems.[30][31]

Hashing Edit

For implementing associative arrays, hash tables, a data structure that maps keys to records using a hash function, are generally faster than binary search on a sorted array of records.[32] Most hash table implementations require only amortized constant time on average.[f][34] However, hashing is not useful for approximate matches, such as computing the next-smallest, next-largest, and nearest key, as the only information given on a failed search is that the target is not present in any record.[35] Binary search is ideal for such matches, performing them in logarithmic time. Binary search also supports approximate matches. Some operations, like finding the smallest and largest element, can be done efficiently on sorted arrays but not on hash tables.[22]

Set membership algorithms Edit

A related problem to search is set membership. Any algorithm that does lookup, like binary search, can also be used for set membership. There are other algorithms that are more specifically suited for set membership. A bit array is the simplest, useful when the range of keys is limited. It compactly stores a collection of bits, with each bit representing a single key within the range of keys. Bit arrays are very fast, requiring only   time.[36] The Judy1 type of Judy array handles 64-bit keys efficiently.[37]

For approximate results, Bloom filters, another probabilistic data structure based on hashing, store a set of keys by encoding the keys using a bit array and multiple hash functions. Bloom filters are much more space-efficient than bit arrays in most cases and not much slower: with   hash functions, membership queries require only   time. However, Bloom filters suffer from false positives.[g][h][39]

Other data structures Edit

There exist data structures that may improve on binary search in some cases for both searching and other operations available for sorted arrays. For example, searches, approximate matches, and the operations available to sorted arrays can be performed more efficiently than binary search on specialized data structures such as van Emde Boas trees, fusion trees, tries, and bit arrays. These specialized data structures are usually only faster because they take advantage of the properties of keys with a certain attribute (usually keys that are small integers), and thus will be time or space consuming for keys that lack that attribute.[22] As long as the keys can be ordered, these operations can always be done at least efficiently on a sorted array regardless of the keys. Some structures, such as Judy arrays, use a combination of approaches to mitigate this while retaining efficiency and the ability to perform approximate matching.[37]

Variations Edit

Uniform binary search Edit

 
Uniform binary search stores the difference between the current and the two next possible middle elements instead of specific bounds.

Uniform binary search stores, instead of the lower and upper bounds, the difference in the index of the middle element from the current iteration to the next iteration. A lookup table containing the differences is computed beforehand. For example, if the array to be searched is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], the middle element ( ) would be 6. In this case, the middle element of the left subarray ([1, 2, 3, 4, 5]) is 3 and the middle element of the right subarray ([7, 8, 9, 10, 11]) is 9. Uniform binary search would store the value of 3 as both indices differ from 6 by this same amount.[40] To reduce the search space, the algorithm either adds or subtracts this change from the index of the middle element. Uniform binary search may be faster on systems where it is inefficient to calculate the midpoint, such as on decimal computers.[41]

Exponential search Edit

 
Visualization of exponential searching finding the upper bound for the subsequent binary search

Exponential search extends binary search to unbounded lists. It starts by finding the first element with an index that is both a power of two and greater than the target value. Afterwards, it sets that index as the upper bound, and switches to binary search. A search takes   iterations before binary search is started and at most   iterations of the binary search, where   is the position of the target value. Exponential search works on bounded lists, but becomes an improvement over binary search only if the target value lies near the beginning of the array.[42]

Interpolation search Edit

 
Visualization of interpolation search using linear interpolation. In this case, no searching is needed because the estimate of the target's location within the array is correct. Other implementations may specify another function for estimating the target's location.

Instead of calculating the midpoint, interpolation search estimates the position of the target value, taking into account the lowest and highest elements in the array as well as length of the array. It works on the basis that the midpoint is not the best guess in many cases. For example, if the target value is close to the highest element in the array, it is likely to be located near the end of the array.[43]

A common interpolation function is linear interpolation. If   is the array,   are the lower and upper bounds respectively, and   is the target, then the target is estimated to be about   of the way between   and  . When linear interpolation is used, and the distribution of the array elements is uniform or near uniform, interpolation search makes   comparisons.[43][44][45]

In practice, interpolation search is slower than binary search for small arrays, as interpolation search requires extra computation. Its time complexity grows more slowly than binary search, but this only compensates for the extra computation for large arrays.[43]

Fractional cascading Edit

 
In fractional cascading, each array has pointers to every second element of another array, so only one binary search has to be performed to search all the arrays.

Fractional cascading is a technique that speeds up binary searches for the same element in multiple sorted arrays. Searching each array separately requires   time, where   is the number of arrays. Fractional cascading reduces this to   by storing specific information in each array about each element and its position in the other arrays.[46][47]

Fractional cascading was originally developed to efficiently solve various computational geometry problems. Fractional cascading has been applied elsewhere, such as in data mining and Internet Protocol routing.[46]

Generalization to graphs Edit

Binary search has been generalized to work on certain types of graphs, where the target value is stored in a vertex instead of an array element. Binary search trees are one such generalization—when a vertex (node) in the tree is queried, the algorithm either learns that the vertex is the target, or otherwise which subtree the target would be located in. However, this can be further generalized as follows: given an undirected, positively weighted graph and a target vertex, the algorithm learns upon querying a vertex that it is equal to the target, or it is given an incident edge that is on the shortest path from the queried vertex to the target. The standard binary search algorithm is simply the case where the graph is a path. Similarly, binary search trees are the case where the edges to the left or right subtrees are given when the queried vertex is unequal to the target. For all undirected, positively weighted graphs, there is an algorithm that finds the target vertex in   queries in the worst case.[48]

Noisy binary search Edit

 
In noisy binary search, there is a certain probability that a comparison is incorrect.

Noisy binary search algorithms solve the case where the algorithm cannot reliably compare elements of the array. For each pair of elements, there is a certain probability that the algorithm makes the wrong comparison. Noisy binary search can find the correct position of the target with a given probability that controls the reliability of the yielded position. Every noisy binary search procedure must make at least   comparisons on average, where   is the binary entropy function and   is the probability that the procedure yields the wrong position.[49][50][51] The noisy binary search problem can be considered as a case of the Rényi-Ulam game,[52] a variant of Twenty Questions where the answers may be wrong.[53]

Quantum binary search Edit

Classical computers are bounded to the worst case of exactly   iterations when performing binary search. Quantum algorithms for binary search are still bounded to a proportion of   queries (representing iterations of the classical procedure), but the constant factor is less than one, providing for a lower time complexity on quantum computers. Any exact quantum binary search procedure—that is, a procedure that always yields the correct result—requires at least   queries in the worst case, where   is the natural logarithm.[54] There is an exact quantum binary search procedure that runs in   queries in the worst case.[55] In comparison, Grover's algorithm is the optimal quantum algorithm for searching an unordered list of elements, and it requires   queries.[56]

History Edit

The idea of sorting a list of items to allow for faster searching dates back to antiquity. The earliest known example was the Inakibit-Anu tablet from Babylon dating back to c. 200 BCE. The tablet contained about 500 sexagesimal numbers and their reciprocals sorted in lexicographical order, which made searching for a specific entry easier. In addition, several lists of names that were sorted by their first letter were discovered on the Aegean Islands. Catholicon, a Latin dictionary finished in 1286 CE, was the first work to describe rules for sorting words into alphabetical order, as opposed to just the first few letters.[9]

In 1946, John Mauchly made the first mention of binary search as part of the Moore School Lectures, a seminal and foundational college course in computing.[9] In 1957, William Wesley Peterson published the first method for interpolation search.[9][57] Every published binary search algorithm worked only for arrays whose length is one less than a power of two[i] until 1960, when Derrick Henry Lehmer published a binary search algorithm that worked on all arrays.[59] In 1962, Hermann Bottenbruch presented an ALGOL 60 implementation of binary search that placed the comparison for equality at the end, increasing the average number of iterations by one, but reducing to one the number of comparisons per iteration.[8] The uniform binary search was developed by A. K. Chandra of Stanford University in 1971.[9] In 1986, Bernard Chazelle and Leonidas J. Guibas introduced fractional cascading as a method to solve numerous search problems in computational geometry.[46][60][61]

Implementation issues Edit

Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky

When Jon Bentley assigned binary search as a problem in a course for professional programmers, he found that ninety percent failed to provide a correct solution after several hours of working on it, mainly because the incorrect implementations failed to run or returned a wrong answer in rare edge cases.[62] A study published in 1988 shows that accurate code for it is only found in five out of twenty textbooks.[63] Furthermore, Bentley's own implementation of binary search, published in his 1986 book Programming Pearls, contained an overflow error that remained undetected for over twenty years. The Java programming language library implementation of binary search had the same overflow bug for more than nine years.[64]

In a practical implementation, the variables used to represent the indices will often be of fixed size (integers), and this can result in an arithmetic overflow for very large arrays. If the midpoint of the span is calculated as  , then the value of   may exceed the range of integers of the data type used to store the midpoint, even if   and   are within the range. If   and   are nonnegative, this can be avoided by calculating the midpoint as  .[65]

An infinite loop may occur if the exit conditions for the loop are not defined correctly. Once   exceeds  , the search has failed and must convey the failure of the search. In addition, the loop must be exited when the target element is found, or in the case of an implementation where this check is moved to the end, checks for whether the search was successful or failed at the end must be in place. Bentley found that most of the programmers who incorrectly implemented binary search made an error in defining the exit conditions.[8][66]

Library support Edit

Many languages' standard libraries include binary search routines:

  • C provides the function bsearch() in its standard library, which is typically implemented via binary search, although the official standard does not require it so.[67]
  • C++'s Standard Template Library provides the functions binary_search(), lower_bound(), upper_bound() and equal_range().[68]
  • D's standard library Phobos, in std.range module provides a type SortedRange (returned by sort() and assumeSorted() functions) with methods contains(), equaleRange(), lowerBound() and trisect(), that use binary search techniques by default for ranges that offer random access.[69]
  • COBOL provides the SEARCH ALL verb for performing binary searches on COBOL ordered tables.[70]
  • Go's sort standard library package contains the functions Search, SearchInts, SearchFloat64s, and SearchStrings, which implement general binary search, as well as specific implementations for searching slices of integers, floating-point numbers, and strings, respectively.[71]
  • Java offers a set of overloaded binarySearch() static methods in the classes Arrays and Collections in the standard java.util package for performing binary searches on Java arrays and on Lists, respectively.[72][73]
  • Microsoft's .NET Framework 2.0 offers static generic versions of the binary search algorithm in its collection base classes. An example would be System.Array's method BinarySearch<T>(T[] array, T value).[74]
  • For Objective-C, the Cocoa framework provides the NSArray -indexOfObject:inSortedRange:options:usingComparator: method in Mac OS X 10.6+.[75] Apple's Core Foundation C framework also contains a CFArrayBSearchValues() function.[76]
  • Python provides the bisect module that keeps a list in sorted order without having to sort the list after each insertion.[77]
  • Ruby's Array class includes a bsearch method with built-in approximate matching.[78]

See also Edit

  • Bisection method – Algorithm for finding a zero of a function – the same idea used to solve equations in the real numbers
  • Multiplicative binary search – Binary search variation with simplified midpoint calculation

Notes and references Edit

  This article was submitted to WikiJournal of Science for external academic peer review in 2018 (reviewer reports). The updated content was reintegrated into the Wikipedia page under a CC-BY-SA-3.0 license (2019). The version of record as reviewed is: Anthony Lin; et al. (2 July 2019). "Binary search algorithm" (PDF). WikiJournal of Science. 2 (1): 5. doi:10.15347/WJS/2019.005. ISSN 2470-6345. Wikidata Q81434400.

Notes Edit

  1. ^ The   is Big O notation, and   is the logarithm. In Big O notation, the base of the logarithm does not matter since every logarithm of a given base is a constant factor of another logarithm of another base. That is,  , where   is a constant.
  2. ^ Any search algorithm based solely on comparisons can be represented using a binary comparison tree. An internal path is any path from the root to an existing node. Let   be the internal path length, the sum of the lengths of all internal paths. If each element is equally likely to be searched, the average case is   or simply one plus the average of all the internal path lengths of the tree. This is because internal paths represent the elements that the search algorithm compares to the target. The lengths of these internal paths represent the number of iterations after the root node. Adding the average of these lengths to the one iteration at the root yields the average case. Therefore, to minimize the average number of comparisons, the internal path length   must be minimized. It turns out that the tree for binary search minimizes the internal path length. Knuth 1998 proved that the external path length (the path length over all nodes where both children are present for each already-existing node) is minimized when the external nodes (the nodes with no children) lie within two consecutive levels of the tree. This also applies to internal paths as internal path length   is linearly related to external path length  . For any tree of   nodes,  . When each subtree has a similar number of nodes, or equivalently the array is divided into halves in each iteration, the external nodes as well as their interior parent nodes lie within two levels. It follows that binary search minimizes the number of average comparisons as its comparison tree has the lowest possible internal path length.[14]
  3. ^ Knuth 1998 showed on his MIX computer model, which Knuth designed as a representation of an ordinary computer, that the average running time of this variation for a successful search is   units of time compared to   units for regular binary search. The time complexity for this variation grows slightly more slowly, but at the cost of higher initial complexity. [18]
  4. ^ Knuth 1998 performed a formal time performance analysis of both of these search algorithms. On Knuth's MIX computer, which Knuth designed as a representation of an ordinary computer, binary search takes on average   units of time for a successful search, while linear search with a sentinel node at the end of the list takes   units. Linear search has lower initial complexity because it requires minimal computation, but it quickly outgrows binary search in complexity. On the MIX computer, binary search only outperforms linear search with a sentinel if  .[14][23]
  5. ^ Inserting the values in sorted order or in an alternating lowest-highest key pattern will result in a binary search tree that maximizes the average and worst-case search time.[28]
  6. ^ It is possible to search some hash table implementations in guaranteed constant time.[33]
  7. ^ This is because simply setting all of the bits which the hash functions point to for a specific key can affect queries for other keys which have a common hash location for one or more of the functions.[38]
  8. ^ There exist improvements of the Bloom filter which improve on its complexity or support deletion; for example, the cuckoo filter exploits cuckoo hashing to gain these advantages.[38]
  9. ^ That is, arrays of length 1, 3, 7, 15, 31 ...[58]

Citations Edit

  1. ^ Williams, Jr., Louis F. (22 April 1976). A modification to the half-interval search (binary search) method. Proceedings of the 14th ACM Southeast Conference. ACM. pp. 95–101. doi:10.1145/503561.503582. from the original on 12 March 2017. Retrieved 29 June 2018.
  2. ^ a b Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Binary search".
  3. ^ Butterfield & Ngondi 2016, p. 46.
  4. ^ Cormen et al. 2009, p. 39.
  5. ^ Weisstein, Eric W. "Binary search". MathWorld.
  6. ^ a b Flores, Ivan; Madpis, George (1 September 1971). "Average binary search length for dense ordered lists". Communications of the ACM. 14 (9): 602–603. doi:10.1145/362663.362752. ISSN 0001-0782. S2CID 43325465.
  7. ^ a b c Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Algorithm B".
  8. ^ a b c d Bottenbruch, Hermann (1 April 1962). "Structure and use of ALGOL 60". Journal of the ACM. 9 (2): 161–221. doi:10.1145/321119.321120. ISSN 0004-5411. S2CID 13406983. Procedure is described at p. 214 (§43), titled "Program for Binary Search".
  9. ^ a b c d e f Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "History and bibliography".
  10. ^ a b Kasahara & Morishita 2006, pp. 8–9.
  11. ^ a b c Sedgewick & Wayne 2011, §3.1, subsection "Rank and selection".
  12. ^ a b c Goldman & Goldman 2008, pp. 461–463.
  13. ^ Sedgewick & Wayne 2011, §3.1, subsection "Range queries".
  14. ^ a b c d e f g h i j k l Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Further analysis of binary search".
  15. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), "Theorem B".
  16. ^ Chang 2003, p. 169.
  17. ^ a b c Knuth 1997, §2.3.4.5 ("Path length").
  18. ^ a b Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Exercise 23".
  19. ^ Rolfe, Timothy J. (1997). "Analytic derivation of comparisons in binary search". ACM SIGNUM Newsletter. 32 (4): 15–19. doi:10.1145/289251.289255. S2CID 23752485.
  20. ^ Khuong, Paul-Virak; Morin, Pat (2017). "Array Layouts for Comparison-Based Searching". Journal of Experimental Algorithmics. 22. Article 1.3. arXiv:1509.05053. doi:10.1145/3053370. S2CID 23752485.
  21. ^ Knuth 1997, §2.2.2 ("Sequential Allocation").
  22. ^ a b c d Beame, Paul; Fich, Faith E. (2001). "Optimal bounds for the predecessor problem and related problems". Journal of Computer and System Sciences. 65 (1): 38–72. doi:10.1006/jcss.2002.1822.
  23. ^ Knuth 1998, Answers to Exercises (§6.2.1) for "Exercise 5".
  24. ^ Knuth 1998, §6.2.1 ("Searching an ordered table").
  25. ^ Knuth 1998, §5.3.1 ("Minimum-Comparison sorting").
  26. ^ Sedgewick & Wayne 2011, §3.2 ("Ordered symbol tables").
  27. ^ Sedgewick & Wayne 2011, §3.2 ("Binary Search Trees"), subsection "Order-based methods and deletion".
  28. ^ Knuth 1998, §6.2.2 ("Binary tree searching"), subsection "But what about the worst case?".
  29. ^ Sedgewick & Wayne 2011, §3.5 ("Applications"), "Which symbol-table implementation should I use?".
  30. ^ Knuth 1998, §5.4.9 ("Disks and Drums").
  31. ^ Knuth 1998, §6.2.4 ("Multiway trees").
  32. ^ Knuth 1998, §6.4 ("Hashing").
  33. ^ Knuth 1998, §6.4 ("Hashing"), subsection "History".
  34. ^ Dietzfelbinger, Martin; Karlin, Anna; Mehlhorn, Kurt; Meyer auf der Heide, Friedhelm; Rohnert, Hans; Tarjan, Robert E. (August 1994). "Dynamic perfect hashing: upper and lower bounds". SIAM Journal on Computing. 23 (4): 738–761. doi:10.1137/S0097539791194094.
  35. ^ Morin, Pat. "Hash tables" (PDF). p. 1. Archived (PDF) from the original on 9 October 2022. Retrieved 28 March 2016.
  36. ^ Knuth 2011, §7.1.3 ("Bitwise Tricks and Techniques").
  37. ^ a b Silverstein, Alan, Judy IV shop manual (PDF), Hewlett-Packard, pp. 80–81, archived (PDF) from the original on 9 October 2022
  38. ^ a b Fan, Bin; Andersen, Dave G.; Kaminsky, Michael; Mitzenmacher, Michael D. (2014). Cuckoo filter: practically better than Bloom. Proceedings of the 10th ACM International on Conference on Emerging Networking Experiments and Technologies. pp. 75–88. doi:10.1145/2674005.2674994.
  39. ^ Bloom, Burton H. (1970). "Space/time trade-offs in hash coding with allowable errors". Communications of the ACM. 13 (7): 422–426. CiteSeerX 10.1.1.641.9096. doi:10.1145/362686.362692. S2CID 7931252.
  40. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "An important variation".
  41. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Algorithm U".
  42. ^ Moffat & Turpin 2002, p. 33.
  43. ^ a b c Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Interpolation search".
  44. ^ Knuth 1998, §6.2.1 ("Searching an ordered table"), subsection "Exercise 22".
  45. ^ Perl, Yehoshua; Itai, Alon; Avni, Haim (1978). "Interpolation search—a log log n search". Communications of the ACM. 21 (7): 550–553. doi:10.1145/359545.359557. S2CID 11089655.
  46. ^ a b c Chazelle, Bernard; Liu, Ding (6 July 2001). Lower bounds for intersection searching and fractional cascading in higher dimension. 33rd ACM Symposium on Theory of Computing. ACM. pp. 322–329. doi:10.1145/380752.380818. ISBN 978-1-58113-349-3. Retrieved 30 June 2018.
  47. ^ Chazelle, Bernard; Liu, Ding (1 March 2004). "Lower bounds for intersection searching and fractional cascading in higher dimension" (PDF). Journal of Computer and System Sciences. 68 (2): 269–284. CiteSeerX 10.1.1.298.7772. doi:10.1016/j.jcss.2003.07.003. ISSN 0022-0000. Archived (PDF) from the original on 9 October 2022. Retrieved 30 June 2018.
  48. ^ Emamjomeh-Zadeh, Ehsan; Kempe, David; Singhal, Vikrant (2016). Deterministic and probabilistic binary search in graphs. 48th ACM Symposium on Theory of Computing. pp. 519–532. arXiv:1503.00805. doi:10.1145/2897518.2897656.
  49. ^ Ben-Or, Michael; Hassidim, Avinatan (2008). "The Bayesian learner is optimal for noisy binary search (and pretty good for quantum as well)" (PDF). 49th Symposium on Foundations of Computer Science. pp. 221–230. doi:10.1109/FOCS.2008.58. ISBN 978-0-7695-3436-7. Archived (PDF) from the original on 9 October 2022.
  50. ^ Pelc, Andrzej (1989). "Searching with known error probability". Theoretical Computer Science. 63 (2): 185–202. doi:10.1016/0304-3975(89)90077-7.
  51. ^ Rivest, Ronald L.; Meyer, Albert R.; Kleitman, Daniel J.; Winklmann, K. Coping with errors in binary search procedures. 10th ACM Symposium on Theory of Computing. doi:10.1145/800133.804351.
  52. ^ Pelc, Andrzej (2002). "Searching games with errors—fifty years of coping with liars". Theoretical Computer Science. 270 (1–2): 71–109. doi:10.1016/S0304-3975(01)00303-6.
  53. ^ Rényi, Alfréd (1961). "On a problem in information theory". Magyar Tudományos Akadémia Matematikai Kutató Intézetének Közleményei (in Hungarian). 6: 505–516. MR 0143666.
  54. ^ Høyer, Peter; Neerbek, Jan; Shi, Yaoyun (2002). "Quantum complexities of ordered searching, sorting, and element distinctness". Algorithmica. 34 (4): 429–448. arXiv:quant-ph/0102078. doi:10.1007/s00453-002-0976-3. S2CID 13717616.
  55. ^ Childs, Andrew M.; Landahl, Andrew J.; Parrilo, Pablo A. (2007). "Quantum algorithms for the ordered search problem via semidefinite programming". Physical Review A. 75 (3). 032335. arXiv:quant-ph/0608161. Bibcode:2007PhRvA..75c2335C. doi:10.1103/PhysRevA.75.032335. S2CID 41539957.
  56. ^ Grover, Lov K. (1996). A fast quantum mechanical algorithm for database search. 28th ACM Symposium on Theory of Computing. Philadelphia, PA. pp. 212–219. arXiv:quant-ph/9605043. doi:10.1145/237814.237866.
  57. ^ Peterson, William Wesley (1957). "Addressing for random-access storage". IBM Journal of Research and Development. 1 (2): 130–146. doi:10.1147/rd.12.0130.
  58. ^ "2n−1". OEIS A000225 8 June 2016 at the Wayback Machine. Retrieved 7 May 2016.
  59. ^ Lehmer, Derrick (1960). "Teaching combinatorial tricks to a computer". Proceedings of Symposia in Applied Mathematics. 10: 180–181. doi:10.1090/psapm/010. ISBN 9780821813102.
  60. ^ Chazelle, Bernard; Guibas, Leonidas J. (1986). "Fractional cascading: I. A data structuring technique" (PDF). Algorithmica. 1 (1–4): 133–162. CiteSeerX 10.1.1.117.8349. doi:10.1007/BF01840440. S2CID 12745042.
  61. ^ Chazelle, Bernard; Guibas, Leonidas J. (1986), "Fractional cascading: II. Applications" (PDF), Algorithmica, 1 (1–4): 163–191, doi:10.1007/BF01840441, S2CID 11232235
  62. ^ Bentley 2000, §4.1 ("The Challenge of Binary Search").
  63. ^ Pattis, Richard E. (1988). "Textbook errors in binary searching". SIGCSE Bulletin. 20: 190–194. doi:10.1145/52965.53012.
  64. ^ Bloch, Joshua (2 June 2006). "Extra, extra – read all about it: nearly all binary searches and mergesorts are broken". Google Research Blog. from the original on 1 April 2016. Retrieved 21 April 2016.
  65. ^ Ruggieri, Salvatore (2003). "On computing the semi-sum of two integers" (PDF). Information Processing Letters. 87 (2): 67–71. CiteSeerX 10.1.1.13.5631. doi:10.1016/S0020-0190(03)00263-1. (PDF) from the original on 3 July 2006. Retrieved 19 March 2016.
  66. ^ Bentley 2000, §4.4 ("Principles").
  67. ^ "bsearch – binary search a sorted table". The Open Group Base Specifications (7th ed.). The Open Group. 2013. from the original on 21 March 2016. Retrieved 28 March 2016.
  68. ^ Stroustrup 2013, p. 945.
  69. ^ "std.range - D Programming Language". dlang.org. Retrieved 29 April 2020.
  70. ^ Unisys (2012), COBOL ANSI-85 programming reference manual, vol. 1, pp. 598–601
  71. ^ "Package sort". The Go Programming Language. from the original on 25 April 2016. Retrieved 28 April 2016.
  72. ^ "java.util.Arrays". Java Platform Standard Edition 8 Documentation. Oracle Corporation. from the original on 29 April 2016. Retrieved 1 May 2016.
  73. ^ "java.util.Collections". Java Platform Standard Edition 8 Documentation. Oracle Corporation. from the original on 23 April 2016. Retrieved 1 May 2016.
  74. ^ "List<T>.BinarySearch method (T)". Microsoft Developer Network. from the original on 7 May 2016. Retrieved 10 April 2016.
  75. ^ "NSArray". Mac Developer Library. Apple Inc. from the original on 17 April 2016. Retrieved 1 May 2016.
  76. ^ "CFArray". Mac Developer Library. Apple Inc. from the original on 20 April 2016. Retrieved 1 May 2016.
  77. ^ "8.6. bisect — Array bisection algorithm". The Python Standard Library. Python Software Foundation. from the original on 25 March 2018. Retrieved 26 March 2018.
  78. ^ Fitzgerald 2015, p. 152.

Sources Edit

External links Edit

  • Comparisons and benchmarks of a variety of binary search implementations in C 25 September 2019 at the Wayback Machine

binary, search, algorithm, this, article, about, searching, finite, sorted, array, searching, continuous, function, values, bisection, method, computer, science, binary, search, also, known, half, interval, search, logarithmic, search, binary, chop, search, al. This article is about searching a finite sorted array For searching continuous function values see bisection method In computer science binary search also known as half interval search 1 logarithmic search 2 or binary chop 3 is a search algorithm that finds the position of a target value within a sorted array 4 5 Binary search compares the target value to the middle element of the array If they are not equal the half in which the target cannot lie is eliminated and the search continues on the remaining half again taking the middle element to compare to the target value and repeating this until the target value is found If the search ends with the remaining half being empty the target is not in the array Binary search algorithmVisualization of the binary search algorithm where 7 is the target valueClassSearch algorithmData structureArrayWorst case performanceO log n Best case performanceO 1 Average performanceO log n Worst case space complexityO 1 OptimalYesBinary search runs in logarithmic time in the worst case making O log n displaystyle O log n comparisons where n displaystyle n is the number of elements in the array a 6 Binary search is faster than linear search except for small arrays However the array must be sorted first to be able to apply binary search There are specialized data structures designed for fast searching such as hash tables that can be searched more efficiently than binary search However binary search can be used to solve a wider range of problems such as finding the next smallest or next largest element in the array relative to the target even if it is absent from the array There are numerous variations of binary search In particular fractional cascading speeds up binary searches for the same value in multiple arrays Fractional cascading efficiently solves a number of search problems in computational geometry and in numerous other fields Exponential search extends binary search to unbounded lists The binary search tree and B tree data structures are based on binary search Contents 1 Algorithm 1 1 Procedure 1 1 1 Alternative procedure 1 2 Duplicate elements 1 2 1 Procedure for finding the leftmost element 1 2 2 Procedure for finding the rightmost element 1 3 Approximate matches 2 Performance 2 1 Space complexity 2 2 Derivation of average case 2 2 1 Successful searches 2 2 2 Unsuccessful searches 2 2 3 Performance of alternative procedure 2 3 Running time and cache use 3 Binary search versus other schemes 3 1 Linear search 3 2 Trees 3 3 Hashing 3 4 Set membership algorithms 3 5 Other data structures 4 Variations 4 1 Uniform binary search 4 2 Exponential search 4 3 Interpolation search 4 4 Fractional cascading 4 5 Generalization to graphs 4 6 Noisy binary search 4 7 Quantum binary search 5 History 6 Implementation issues 7 Library support 8 See also 9 Notes and references 9 1 Notes 9 2 Citations 9 3 Sources 10 External linksAlgorithm EditBinary search works on sorted arrays Binary search begins by comparing an element in the middle of the array with the target value If the target value matches the element its position in the array is returned If the target value is less than the element the search continues in the lower half of the array If the target value is greater than the element the search continues in the upper half of the array By doing this the algorithm eliminates the half in which the target value cannot lie in each iteration 7 Procedure Edit Given an array A displaystyle A nbsp of n displaystyle n nbsp elements with values or records A 0 A 1 A 2 A n 1 displaystyle A 0 A 1 A 2 ldots A n 1 nbsp sorted such that A 0 A 1 A 2 A n 1 displaystyle A 0 leq A 1 leq A 2 leq cdots leq A n 1 nbsp and target value T displaystyle T nbsp the following subroutine uses binary search to find the index of T displaystyle T nbsp in A displaystyle A nbsp 7 Set L displaystyle L nbsp to 0 displaystyle 0 nbsp and R displaystyle R nbsp to n 1 displaystyle n 1 nbsp If L gt R displaystyle L gt R nbsp the search terminates as unsuccessful Set m displaystyle m nbsp the position of the middle element to the floor of L R 2 displaystyle frac L R 2 nbsp which is the greatest integer less than or equal to L R 2 displaystyle frac L R 2 nbsp If A m lt T displaystyle A m lt T nbsp set L displaystyle L nbsp to m 1 displaystyle m 1 nbsp and go to step 2 If A m gt T displaystyle A m gt T nbsp set R displaystyle R nbsp to m 1 displaystyle m 1 nbsp and go to step 2 Now A m T displaystyle A m T nbsp the search is done return m displaystyle m nbsp This iterative procedure keeps track of the search boundaries with the two variables L displaystyle L nbsp and R displaystyle R nbsp The procedure may be expressed in pseudocode as follows where the variable names and types remain the same as above floor is the floor function and unsuccessful refers to a specific value that conveys the failure of the search 7 nbsp binary searchfunction binary search A n T is L 0 R n 1 while L R do m floor L R 2 if A m lt T then L m 1 else if A m gt T then R m 1 else return m return unsuccessful Alternatively the algorithm may take the ceiling of L R 2 displaystyle frac L R 2 nbsp This may change the result if the target value appears more than once in the array Alternative procedure Edit In the above procedure the algorithm checks whether the middle element m displaystyle m nbsp is equal to the target T displaystyle T nbsp in every iteration Some implementations leave out this check during each iteration The algorithm would perform this check only when one element is left when L R displaystyle L R nbsp This results in a faster comparison loop as one comparison is eliminated per iteration while it requires only one more iteration on average 8 Hermann Bottenbruch published the first implementation to leave out this check in 1962 8 9 Set L displaystyle L nbsp to 0 displaystyle 0 nbsp and R displaystyle R nbsp to n 1 displaystyle n 1 nbsp While L R displaystyle L neq R nbsp Set m displaystyle m nbsp the position of the middle element to the ceiling of L R 2 displaystyle frac L R 2 nbsp which is the least integer greater than or equal to L R 2 displaystyle frac L R 2 nbsp If A m gt T displaystyle A m gt T nbsp set R displaystyle R nbsp to m 1 displaystyle m 1 nbsp Else A m T displaystyle A m leq T nbsp set L displaystyle L nbsp to m displaystyle m nbsp Now L R displaystyle L R nbsp the search is done If A L T displaystyle A L T nbsp return L displaystyle L nbsp Otherwise the search terminates as unsuccessful Where ceil is the ceiling function the pseudocode for this version is function binary search alternative A n T is L 0 R n 1 while L R do m ceil L R 2 if A m gt T then R m 1 else L m if A L T then return L return unsuccessful Duplicate elements Edit The procedure may return any index whose element is equal to the target value even if there are duplicate elements in the array For example if the array to be searched was 1 2 3 4 4 5 6 7 displaystyle 1 2 3 4 4 5 6 7 nbsp and the target was 4 displaystyle 4 nbsp then it would be correct for the algorithm to either return the 4th index 3 or 5th index 4 element The regular procedure would return the 4th element index 3 in this case It does not always return the first duplicate consider 1 2 4 4 4 5 6 7 displaystyle 1 2 4 4 4 5 6 7 nbsp which still returns the 4th element However it is sometimes necessary to find the leftmost element or the rightmost element for a target value that is duplicated in the array In the above example the 4th element is the leftmost element of the value 4 while the 5th element is the rightmost element of the value 4 The alternative procedure above will always return the index of the rightmost element if such an element exists 9 Procedure for finding the leftmost element Edit To find the leftmost element the following procedure can be used 10 Set L displaystyle L nbsp to 0 displaystyle 0 nbsp and R displaystyle R nbsp to n displaystyle n nbsp While L lt R displaystyle L lt R nbsp Set m displaystyle m nbsp the position of the middle element to the floor of L R 2 displaystyle frac L R 2 nbsp which is the greatest integer less than or equal to L R 2 displaystyle frac L R 2 nbsp If A m lt T displaystyle A m lt T nbsp set L displaystyle L nbsp to m 1 displaystyle m 1 nbsp Else A m T displaystyle A m geq T nbsp set R displaystyle R nbsp to m displaystyle m nbsp Return L displaystyle L nbsp If L lt n displaystyle L lt n nbsp and A L T displaystyle A L T nbsp then A L displaystyle A L nbsp is the leftmost element that equals T displaystyle T nbsp Even if T displaystyle T nbsp is not in the array L displaystyle L nbsp is the rank of T displaystyle T nbsp in the array or the number of elements in the array that are less than T displaystyle T nbsp Where floor is the floor function the pseudocode for this version is function binary search leftmost A n T L 0 R n while L lt R m floor L R 2 if A m lt T L m 1 else R m return L Procedure for finding the rightmost element Edit To find the rightmost element the following procedure can be used 10 Set L displaystyle L nbsp to 0 displaystyle 0 nbsp and R displaystyle R nbsp to n displaystyle n nbsp While L lt R displaystyle L lt R nbsp Set m displaystyle m nbsp the position of the middle element to the floor of L R 2 displaystyle frac L R 2 nbsp which is the greatest integer less than or equal to L R 2 displaystyle frac L R 2 nbsp If A m gt T displaystyle A m gt T nbsp set R displaystyle R nbsp to m displaystyle m nbsp Else A m T displaystyle A m leq T nbsp set L displaystyle L nbsp to m 1 displaystyle m 1 nbsp Return R 1 displaystyle R 1 nbsp If R gt 0 displaystyle R gt 0 nbsp and A R 1 T displaystyle A R 1 T nbsp then A R 1 displaystyle A R 1 nbsp is the rightmost element that equals T displaystyle T nbsp Even if T displaystyle T nbsp is not in the array n R displaystyle n R nbsp is the number of elements in the array that are greater than T displaystyle T nbsp Where floor is the floor function the pseudocode for this version is function binary search rightmost A n T L 0 R n while L lt R m floor L R 2 if A m gt T R m else L m 1 return R 1 Approximate matches Edit nbsp Binary search can be adapted to compute approximate matches In the example above the rank predecessor successor and nearest neighbor are shown for the target value 5 displaystyle 5 nbsp which is not in the array The above procedure only performs exact matches finding the position of a target value However it is trivial to extend binary search to perform approximate matches because binary search operates on sorted arrays For example binary search can be used to compute for a given value its rank the number of smaller elements predecessor next smallest element successor next largest element and nearest neighbor Range queries seeking the number of elements between two values can be performed with two rank queries 11 Rank queries can be performed with the procedure for finding the leftmost element The number of elements less than the target value is returned by the procedure 11 Predecessor queries can be performed with rank queries If the rank of the target value is r displaystyle r nbsp its predecessor is r 1 displaystyle r 1 nbsp 12 For successor queries the procedure for finding the rightmost element can be used If the result of running the procedure for the target value is r displaystyle r nbsp then the successor of the target value is r 1 displaystyle r 1 nbsp 12 The nearest neighbor of the target value is either its predecessor or successor whichever is closer Range queries are also straightforward 12 Once the ranks of the two values are known the number of elements greater than or equal to the first value and less than the second is the difference of the two ranks This count can be adjusted up or down by one according to whether the endpoints of the range should be considered to be part of the range and whether the array contains entries matching those endpoints 13 Performance Edit nbsp A tree representing binary search The array being searched here is 20 30 40 50 80 90 100 displaystyle 20 30 40 50 80 90 100 nbsp and the target value is 40 displaystyle 40 nbsp nbsp The worst case is reached when the search reaches the deepest level of the tree while the best case is reached when the target value is the middle element In terms of the number of comparisons the performance of binary search can be analyzed by viewing the run of the procedure on a binary tree The root node of the tree is the middle element of the array The middle element of the lower half is the left child node of the root and the middle element of the upper half is the right child node of the root The rest of the tree is built in a similar fashion Starting from the root node the left or right subtrees are traversed depending on whether the target value is less or more than the node under consideration 6 14 In the worst case binary search makes log 2 n 1 textstyle lfloor log 2 n 1 rfloor nbsp iterations of the comparison loop where the textstyle lfloor rfloor nbsp notation denotes the floor function that yields the greatest integer less than or equal to the argument and log 2 textstyle log 2 nbsp is the binary logarithm This is because the worst case is reached when the search reaches the deepest level of the tree and there are always log 2 n 1 textstyle lfloor log 2 n 1 rfloor nbsp levels in the tree for any binary search The worst case may also be reached when the target element is not in the array If n textstyle n nbsp is one less than a power of two then this is always the case Otherwise the search may perform log 2 n 1 textstyle lfloor log 2 n 1 rfloor nbsp iterations if the search reaches the deepest level of the tree However it may make log 2 n textstyle lfloor log 2 n rfloor nbsp iterations which is one less than the worst case if the search ends at the second deepest level of the tree 15 On average assuming that each element is equally likely to be searched binary search makes log 2 n 1 2 log 2 n 1 log 2 n 2 n displaystyle lfloor log 2 n rfloor 1 2 lfloor log 2 n rfloor 1 lfloor log 2 n rfloor 2 n nbsp iterations when the target element is in the array This is approximately equal to log 2 n 1 displaystyle log 2 n 1 nbsp iterations When the target element is not in the array binary search makes log 2 n 2 2 log 2 n 1 n 1 displaystyle lfloor log 2 n rfloor 2 2 lfloor log 2 n rfloor 1 n 1 nbsp iterations on average assuming that the range between and outside elements is equally likely to be searched 14 In the best case where the target value is the middle element of the array its position is returned after one iteration 16 In terms of iterations no search algorithm that works only by comparing elements can exhibit better average and worst case performance than binary search The comparison tree representing binary search has the fewest levels possible as every level above the lowest level of the tree is filled completely b Otherwise the search algorithm can eliminate few elements in an iteration increasing the number of iterations required in the average and worst case This is the case for other search algorithms based on comparisons as while they may work faster on some target values the average performance over all elements is worse than binary search By dividing the array in half binary search ensures that the size of both subarrays are as similar as possible 14 Space complexity Edit Binary search requires three pointers to elements which may be array indices or pointers to memory locations regardless of the size of the array Therefore the space complexity of binary search is O 1 displaystyle O 1 nbsp in the word RAM model of computation Derivation of average case Edit The average number of iterations performed by binary search depends on the probability of each element being searched The average case is different for successful searches and unsuccessful searches It will be assumed that each element is equally likely to be searched for successful searches For unsuccessful searches it will be assumed that the intervals between and outside elements are equally likely to be searched The average case for successful searches is the number of iterations required to search every element exactly once divided by n displaystyle n nbsp the number of elements The average case for unsuccessful searches is the number of iterations required to search an element within every interval exactly once divided by the n 1 displaystyle n 1 nbsp intervals 14 Successful searches Edit In the binary tree representation a successful search can be represented by a path from the root to the target node called an internal path The length of a path is the number of edges connections between nodes that the path passes through The number of iterations performed by a search given that the corresponding path has length l displaystyle l nbsp is l 1 displaystyle l 1 nbsp counting the initial iteration The internal path length is the sum of the lengths of all unique internal paths Since there is only one path from the root to any single node each internal path represents a search for a specific element If there are n displaystyle n nbsp elements which is a positive integer and the internal path length is I n displaystyle I n nbsp then the average number of iterations for a successful search T n 1 I n n displaystyle T n 1 frac I n n nbsp with the one iteration added to count the initial iteration 14 Since binary search is the optimal algorithm for searching with comparisons this problem is reduced to calculating the minimum internal path length of all binary trees with n displaystyle n nbsp nodes which is equal to 17 I n k 1 n log 2 k displaystyle I n sum k 1 n left lfloor log 2 k right rfloor nbsp For example in a 7 element array the root requires one iteration the two elements below the root require two iterations and the four elements below require three iterations In this case the internal path length is 17 k 1 7 log 2 k 0 2 1 4 2 2 8 10 displaystyle sum k 1 7 left lfloor log 2 k right rfloor 0 2 1 4 2 2 8 10 nbsp The average number of iterations would be 1 10 7 2 3 7 displaystyle 1 frac 10 7 2 frac 3 7 nbsp based on the equation for the average case The sum for I n displaystyle I n nbsp can be simplified to 14 I n k 1 n log 2 k n 1 log 2 n 1 2 log 2 n 1 1 2 displaystyle I n sum k 1 n left lfloor log 2 k right rfloor n 1 left lfloor log 2 n 1 right rfloor 2 left lfloor log 2 n 1 right rfloor 1 2 nbsp Substituting the equation for I n displaystyle I n nbsp into the equation for T n displaystyle T n nbsp 14 T n 1 n 1 log 2 n 1 2 log 2 n 1 1 2 n log 2 n 1 2 log 2 n 1 log 2 n 2 n displaystyle T n 1 frac n 1 left lfloor log 2 n 1 right rfloor 2 left lfloor log 2 n 1 right rfloor 1 2 n lfloor log 2 n rfloor 1 2 lfloor log 2 n rfloor 1 lfloor log 2 n rfloor 2 n nbsp For integer n displaystyle n nbsp this is equivalent to the equation for the average case on a successful search specified above Unsuccessful searches Edit Unsuccessful searches can be represented by augmenting the tree with external nodes which forms an extended binary tree If an internal node or a node present in the tree has fewer than two child nodes then additional child nodes called external nodes are added so that each internal node has two children By doing so an unsuccessful search can be represented as a path to an external node whose parent is the single element that remains during the last iteration An external path is a path from the root to an external node The external path length is the sum of the lengths of all unique external paths If there are n displaystyle n nbsp elements which is a positive integer and the external path length is E n displaystyle E n nbsp then the average number of iterations for an unsuccessful search T n E n n 1 displaystyle T n frac E n n 1 nbsp with the one iteration added to count the initial iteration The external path length is divided by n 1 displaystyle n 1 nbsp instead of n displaystyle n nbsp because there are n 1 displaystyle n 1 nbsp external paths representing the intervals between and outside the elements of the array 14 This problem can similarly be reduced to determining the minimum external path length of all binary trees with n displaystyle n nbsp nodes For all binary trees the external path length is equal to the internal path length plus 2 n displaystyle 2n nbsp 17 Substituting the equation for I n displaystyle I n nbsp 14 E n I n 2 n n 1 log 2 n 1 2 log 2 n 1 1 2 2 n n 1 log 2 n 2 2 log 2 n 1 displaystyle E n I n 2n left n 1 left lfloor log 2 n 1 right rfloor 2 left lfloor log 2 n 1 right rfloor 1 2 right 2n n 1 lfloor log 2 n rfloor 2 2 lfloor log 2 n rfloor 1 nbsp Substituting the equation for E n displaystyle E n nbsp into the equation for T n displaystyle T n nbsp the average case for unsuccessful searches can be determined 14 T n n 1 log 2 n 2 2 log 2 n 1 n 1 log 2 n 2 2 log 2 n 1 n 1 displaystyle T n frac n 1 lfloor log 2 n rfloor 2 2 lfloor log 2 n rfloor 1 n 1 lfloor log 2 n rfloor 2 2 lfloor log 2 n rfloor 1 n 1 nbsp Performance of alternative procedure Edit Each iteration of the binary search procedure defined above makes one or two comparisons checking if the middle element is equal to the target in each iteration Assuming that each element is equally likely to be searched each iteration makes 1 5 comparisons on average A variation of the algorithm checks whether the middle element is equal to the target at the end of the search On average this eliminates half a comparison from each iteration This slightly cuts the time taken per iteration on most computers However it guarantees that the search takes the maximum number of iterations on average adding one iteration to the search Because the comparison loop is performed only log 2 n 1 textstyle lfloor log 2 n 1 rfloor nbsp times in the worst case the slight increase in efficiency per iteration does not compensate for the extra iteration for all but very large n textstyle n nbsp c 18 19 Running time and cache use Edit In analyzing the performance of binary search another consideration is the time required to compare two elements For integers and strings the time required increases linearly as the encoding length usually the number of bits of the elements increase For example comparing a pair of 64 bit unsigned integers would require comparing up to double the bits as comparing a pair of 32 bit unsigned integers The worst case is achieved when the integers are equal This can be significant when the encoding lengths of the elements are large such as with large integer types or long strings which makes comparing elements expensive Furthermore comparing floating point values the most common digital representation of real numbers is often more expensive than comparing integers or short strings On most computer architectures the processor has a hardware cache separate from RAM Since they are located within the processor itself caches are much faster to access but usually store much less data than RAM Therefore most processors store memory locations that have been accessed recently along with memory locations close to it For example when an array element is accessed the element itself may be stored along with the elements that are stored close to it in RAM making it faster to sequentially access array elements that are close in index to each other locality of reference On a sorted array binary search can jump to distant memory locations if the array is large unlike algorithms such as linear search and linear probing in hash tables which access elements in sequence This adds slightly to the running time of binary search for large arrays on most systems 20 Binary search versus other schemes EditSorted arrays with binary search are a very inefficient solution when insertion and deletion operations are interleaved with retrieval taking O n textstyle O n nbsp time for each such operation In addition sorted arrays can complicate memory use especially when elements are often inserted into the array 21 There are other data structures that support much more efficient insertion and deletion Binary search can be used to perform exact matching and set membership determining whether a target value is in a collection of values There are data structures that support faster exact matching and set membership However unlike many other searching schemes binary search can be used for efficient approximate matching usually performing such matches in O log n textstyle O log n nbsp time regardless of the type or structure of the values themselves 22 In addition there are some operations like finding the smallest and largest element that can be performed efficiently on a sorted array 11 Linear search Edit Linear search is a simple search algorithm that checks every record until it finds the target value Linear search can be done on a linked list which allows for faster insertion and deletion than an array Binary search is faster than linear search for sorted arrays except if the array is short although the array needs to be sorted beforehand d 24 All sorting algorithms based on comparing elements such as quicksort and merge sort require at least O n log n textstyle O n log n nbsp comparisons in the worst case 25 Unlike linear search binary search can be used for efficient approximate matching There are operations such as finding the smallest and largest element that can be done efficiently on a sorted array but not on an unsorted array 26 Trees Edit nbsp Binary search trees are searched using an algorithm similar to binary search A binary search tree is a binary tree data structure that works based on the principle of binary search The records of the tree are arranged in sorted order and each record in the tree can be searched using an algorithm similar to binary search taking on average logarithmic time Insertion and deletion also require on average logarithmic time in binary search trees This can be faster than the linear time insertion and deletion of sorted arrays and binary trees retain the ability to perform all the operations possible on a sorted array including range and approximate queries 22 27 However binary search is usually more efficient for searching as binary search trees will most likely be imperfectly balanced resulting in slightly worse performance than binary search This even applies to balanced binary search trees binary search trees that balance their own nodes because they rarely produce the tree with the fewest possible levels Except for balanced binary search trees the tree may be severely imbalanced with few internal nodes with two children resulting in the average and worst case search time approaching n textstyle n nbsp comparisons e Binary search trees take more space than sorted arrays 29 Binary search trees lend themselves to fast searching in external memory stored in hard disks as binary search trees can be efficiently structured in filesystems The B tree generalizes this method of tree organization B trees are frequently used to organize long term storage such as databases and filesystems 30 31 Hashing Edit For implementing associative arrays hash tables a data structure that maps keys to records using a hash function are generally faster than binary search on a sorted array of records 32 Most hash table implementations require only amortized constant time on average f 34 However hashing is not useful for approximate matches such as computing the next smallest next largest and nearest key as the only information given on a failed search is that the target is not present in any record 35 Binary search is ideal for such matches performing them in logarithmic time Binary search also supports approximate matches Some operations like finding the smallest and largest element can be done efficiently on sorted arrays but not on hash tables 22 Set membership algorithms Edit A related problem to search is set membership Any algorithm that does lookup like binary search can also be used for set membership There are other algorithms that are more specifically suited for set membership A bit array is the simplest useful when the range of keys is limited It compactly stores a collection of bits with each bit representing a single key within the range of keys Bit arrays are very fast requiring only O 1 textstyle O 1 nbsp time 36 The Judy1 type of Judy array handles 64 bit keys efficiently 37 For approximate results Bloom filters another probabilistic data structure based on hashing store a set of keys by encoding the keys using a bit array and multiple hash functions Bloom filters are much more space efficient than bit arrays in most cases and not much slower with k textstyle k nbsp hash functions membership queries require only O k textstyle O k nbsp time However Bloom filters suffer from false positives g h 39 Other data structures Edit There exist data structures that may improve on binary search in some cases for both searching and other operations available for sorted arrays For example searches approximate matches and the operations available to sorted arrays can be performed more efficiently than binary search on specialized data structures such as van Emde Boas trees fusion trees tries and bit arrays These specialized data structures are usually only faster because they take advantage of the properties of keys with a certain attribute usually keys that are small integers and thus will be time or space consuming for keys that lack that attribute 22 As long as the keys can be ordered these operations can always be done at least efficiently on a sorted array regardless of the keys Some structures such as Judy arrays use a combination of approaches to mitigate this while retaining efficiency and the ability to perform approximate matching 37 Variations EditUniform binary search Edit Main article Uniform binary search nbsp Uniform binary search stores the difference between the current and the two next possible middle elements instead of specific bounds Uniform binary search stores instead of the lower and upper bounds the difference in the index of the middle element from the current iteration to the next iteration A lookup table containing the differences is computed beforehand For example if the array to be searched is 1 2 3 4 5 6 7 8 9 10 11 the middle element m displaystyle m nbsp would be 6 In this case the middle element of the left subarray 1 2 3 4 5 is 3 and the middle element of the right subarray 7 8 9 10 11 is 9 Uniform binary search would store the value of 3 as both indices differ from 6 by this same amount 40 To reduce the search space the algorithm either adds or subtracts this change from the index of the middle element Uniform binary search may be faster on systems where it is inefficient to calculate the midpoint such as on decimal computers 41 Exponential search Edit Main article Exponential search nbsp Visualization of exponential searching finding the upper bound for the subsequent binary searchExponential search extends binary search to unbounded lists It starts by finding the first element with an index that is both a power of two and greater than the target value Afterwards it sets that index as the upper bound and switches to binary search A search takes log 2 x 1 textstyle lfloor log 2 x 1 rfloor nbsp iterations before binary search is started and at most log 2 x textstyle lfloor log 2 x rfloor nbsp iterations of the binary search where x textstyle x nbsp is the position of the target value Exponential search works on bounded lists but becomes an improvement over binary search only if the target value lies near the beginning of the array 42 Interpolation search Edit Main article Interpolation search nbsp Visualization of interpolation search using linear interpolation In this case no searching is needed because the estimate of the target s location within the array is correct Other implementations may specify another function for estimating the target s location Instead of calculating the midpoint interpolation search estimates the position of the target value taking into account the lowest and highest elements in the array as well as length of the array It works on the basis that the midpoint is not the best guess in many cases For example if the target value is close to the highest element in the array it is likely to be located near the end of the array 43 A common interpolation function is linear interpolation If A displaystyle A nbsp is the array L R displaystyle L R nbsp are the lower and upper bounds respectively and T displaystyle T nbsp is the target then the target is estimated to be about T A L A R A L displaystyle T A L A R A L nbsp of the way between L displaystyle L nbsp and R displaystyle R nbsp When linear interpolation is used and the distribution of the array elements is uniform or near uniform interpolation search makes O log log n textstyle O log log n nbsp comparisons 43 44 45 In practice interpolation search is slower than binary search for small arrays as interpolation search requires extra computation Its time complexity grows more slowly than binary search but this only compensates for the extra computation for large arrays 43 Fractional cascading Edit Main article Fractional cascading nbsp In fractional cascading each array has pointers to every second element of another array so only one binary search has to be performed to search all the arrays Fractional cascading is a technique that speeds up binary searches for the same element in multiple sorted arrays Searching each array separately requires O k log n textstyle O k log n nbsp time where k textstyle k nbsp is the number of arrays Fractional cascading reduces this to O k log n textstyle O k log n nbsp by storing specific information in each array about each element and its position in the other arrays 46 47 Fractional cascading was originally developed to efficiently solve various computational geometry problems Fractional cascading has been applied elsewhere such as in data mining and Internet Protocol routing 46 Generalization to graphs Edit Binary search has been generalized to work on certain types of graphs where the target value is stored in a vertex instead of an array element Binary search trees are one such generalization when a vertex node in the tree is queried the algorithm either learns that the vertex is the target or otherwise which subtree the target would be located in However this can be further generalized as follows given an undirected positively weighted graph and a target vertex the algorithm learns upon querying a vertex that it is equal to the target or it is given an incident edge that is on the shortest path from the queried vertex to the target The standard binary search algorithm is simply the case where the graph is a path Similarly binary search trees are the case where the edges to the left or right subtrees are given when the queried vertex is unequal to the target For all undirected positively weighted graphs there is an algorithm that finds the target vertex in O log n displaystyle O log n nbsp queries in the worst case 48 Noisy binary search Edit nbsp In noisy binary search there is a certain probability that a comparison is incorrect Noisy binary search algorithms solve the case where the algorithm cannot reliably compare elements of the array For each pair of elements there is a certain probability that the algorithm makes the wrong comparison Noisy binary search can find the correct position of the target with a given probability that controls the reliability of the yielded position Every noisy binary search procedure must make at least 1 t log 2 n H p 10 H p displaystyle 1 tau frac log 2 n H p frac 10 H p nbsp comparisons on average where H p p log 2 p 1 p log 2 1 p displaystyle H p p log 2 p 1 p log 2 1 p nbsp is the binary entropy function and t displaystyle tau nbsp is the probability that the procedure yields the wrong position 49 50 51 The noisy binary search problem can be considered as a case of the Renyi Ulam game 52 a variant of Twenty Questions where the answers may be wrong 53 Quantum binary search Edit Classical computers are bounded to the worst case of exactly log 2 n 1 textstyle lfloor log 2 n 1 rfloor nbsp iterations when performing binary search Quantum algorithms for binary search are still bounded to a proportion of log 2 n textstyle log 2 n nbsp queries representing iterations of the classical procedure but the constant factor is less than one providing for a lower time complexity on quantum computers Any exact quantum binary search procedure that is a procedure that always yields the correct result requires at least 1 p ln n 1 0 22 log 2 n textstyle frac 1 pi ln n 1 approx 0 22 log 2 n nbsp queries in the worst case where ln textstyle ln nbsp is the natural logarithm 54 There is an exact quantum binary search procedure that runs in 4 log 605 n 0 433 log 2 n textstyle 4 log 605 n approx 0 433 log 2 n nbsp queries in the worst case 55 In comparison Grover s algorithm is the optimal quantum algorithm for searching an unordered list of elements and it requires O n displaystyle O sqrt n nbsp queries 56 History EditThe idea of sorting a list of items to allow for faster searching dates back to antiquity The earliest known example was the Inakibit Anu tablet from Babylon dating back to c 200 BCE The tablet contained about 500 sexagesimal numbers and their reciprocals sorted in lexicographical order which made searching for a specific entry easier In addition several lists of names that were sorted by their first letter were discovered on the Aegean Islands Catholicon a Latin dictionary finished in 1286 CE was the first work to describe rules for sorting words into alphabetical order as opposed to just the first few letters 9 In 1946 John Mauchly made the first mention of binary search as part of the Moore School Lectures a seminal and foundational college course in computing 9 In 1957 William Wesley Peterson published the first method for interpolation search 9 57 Every published binary search algorithm worked only for arrays whose length is one less than a power of two i until 1960 when Derrick Henry Lehmer published a binary search algorithm that worked on all arrays 59 In 1962 Hermann Bottenbruch presented an ALGOL 60 implementation of binary search that placed the comparison for equality at the end increasing the average number of iterations by one but reducing to one the number of comparisons per iteration 8 The uniform binary search was developed by A K Chandra of Stanford University in 1971 9 In 1986 Bernard Chazelle and Leonidas J Guibas introduced fractional cascading as a method to solve numerous search problems in computational geometry 46 60 61 Implementation issues EditAlthough the basic idea of binary search is comparatively straightforward the details can be surprisingly tricky Donald Knuth 2 When Jon Bentley assigned binary search as a problem in a course for professional programmers he found that ninety percent failed to provide a correct solution after several hours of working on it mainly because the incorrect implementations failed to run or returned a wrong answer in rare edge cases 62 A study published in 1988 shows that accurate code for it is only found in five out of twenty textbooks 63 Furthermore Bentley s own implementation of binary search published in his 1986 book Programming Pearls contained an overflow error that remained undetected for over twenty years The Java programming language library implementation of binary search had the same overflow bug for more than nine years 64 In a practical implementation the variables used to represent the indices will often be of fixed size integers and this can result in an arithmetic overflow for very large arrays If the midpoint of the span is calculated as L R 2 displaystyle frac L R 2 nbsp then the value of L R displaystyle L R nbsp may exceed the range of integers of the data type used to store the midpoint even if L displaystyle L nbsp and R displaystyle R nbsp are within the range If L displaystyle L nbsp and R displaystyle R nbsp are nonnegative this can be avoided by calculating the midpoint as L R L 2 displaystyle L frac R L 2 nbsp 65 An infinite loop may occur if the exit conditions for the loop are not defined correctly Once L displaystyle L nbsp exceeds R displaystyle R nbsp the search has failed and must convey the failure of the search In addition the loop must be exited when the target element is found or in the case of an implementation where this check is moved to the end checks for whether the search was successful or failed at the end must be in place Bentley found that most of the programmers who incorrectly implemented binary search made an error in defining the exit conditions 8 66 Library support EditMany languages standard libraries include binary search routines C provides the function bsearch in its standard library which is typically implemented via binary search although the official standard does not require it so 67 C s Standard Template Library provides the functions binary search lower bound upper bound and equal range 68 D s standard library Phobos in std range module provides a type SortedRange returned by sort and assumeSorted functions with methods contains equaleRange lowerBound and trisect that use binary search techniques by default for ranges that offer random access 69 COBOL provides the SEARCH ALL verb for performing binary searches on COBOL ordered tables 70 Go s sort standard library package contains the functions Search SearchInts SearchFloat64s and SearchStrings which implement general binary search as well as specific implementations for searching slices of integers floating point numbers and strings respectively 71 Java offers a set of overloaded binarySearch static methods in the classes Arrays and Collections in the standard java util package for performing binary searches on Java arrays and on Lists respectively 72 73 Microsoft s NET Framework 2 0 offers static generic versions of the binary search algorithm in its collection base classes An example would be System Array s method BinarySearch lt T gt T array T value 74 For Objective C the Cocoa framework provides the NSArray indexOfObject inSortedRange options usingComparator method in Mac OS X 10 6 75 Apple s Core Foundation C framework also contains a CFArrayBSearchValues function 76 Python provides the bisect module that keeps a list in sorted order without having to sort the list after each insertion 77 Ruby s Array class includes a bsearch method with built in approximate matching 78 See also EditBisection method Algorithm for finding a zero of a function the same idea used to solve equations in the real numbers Multiplicative binary search Binary search variation with simplified midpoint calculationNotes and references Edit nbsp This article was submitted to WikiJournal of Science for external academic peer review in 2018 reviewer reports The updated content was reintegrated into the Wikipedia page under a CC BY SA 3 0 license 2019 The version of record as reviewed is Anthony Lin et al 2 July 2019 Binary search algorithm PDF WikiJournal of Science 2 1 5 doi 10 15347 WJS 2019 005 ISSN 2470 6345 Wikidata Q81434400 Notes Edit The O displaystyle O nbsp is Big O notation and log displaystyle log nbsp is the logarithm In Big O notation the base of the logarithm does not matter since every logarithm of a given base is a constant factor of another logarithm of another base That is log b n log k n log k b displaystyle log b n log k n div log k b nbsp where log k b displaystyle log k b nbsp is a constant Any search algorithm based solely on comparisons can be represented using a binary comparison tree An internal path is any path from the root to an existing node Let I displaystyle I nbsp be the internal path length the sum of the lengths of all internal paths If each element is equally likely to be searched the average case is 1 I n displaystyle 1 frac I n nbsp or simply one plus the average of all the internal path lengths of the tree This is because internal paths represent the elements that the search algorithm compares to the target The lengths of these internal paths represent the number of iterations after the root node Adding the average of these lengths to the one iteration at the root yields the average case Therefore to minimize the average number of comparisons the internal path length I displaystyle I nbsp must be minimized It turns out that the tree for binary search minimizes the internal path length Knuth 1998 proved that the external path length the path length over all nodes where both children are present for each already existing node is minimized when the external nodes the nodes with no children lie within two consecutive levels of the tree This also applies to internal paths as internal path length I displaystyle I nbsp is linearly related to external path length E displaystyle E nbsp For any tree of n displaystyle n nbsp nodes I E 2 n displaystyle I E 2n nbsp When each subtree has a similar number of nodes or equivalently the array is divided into halves in each iteration the external nodes as well as their interior parent nodes lie within two levels It follows that binary search minimizes the number of average comparisons as its comparison tree has the lowest possible internal path length 14 Knuth 1998 showed on his MIX computer model which Knuth designed as a representation of an ordinary computer that the average running time of this variation for a successful search is 17 5 log 2 n 17 textstyle 17 5 log 2 n 17 nbsp units of time compared to 18 log 2 n 16 textstyle 18 log 2 n 16 nbsp units for regular binary search The time complexity for this variation grows slightly more slowly but at the cost of higher initial complexity 18 Knuth 1998 performed a formal time performance analysis of both of these search algorithms On Knuth s MIX computer which Knuth designed as a representation of an ordinary computer binary search takes on average 18 log n 16 textstyle 18 log n 16 nbsp units of time for a successful search while linear search with a sentinel node at the end of the list takes 1 75 n 8 5 n mod 2 4 n textstyle 1 75n 8 5 frac n text mod 2 4n nbsp units Linear search has lower initial complexity because it requires minimal computation but it quickly outgrows binary search in complexity On the MIX computer binary search only outperforms linear search with a sentinel if n gt 44 textstyle n gt 44 nbsp 14 23 Inserting the values in sorted order or in an alternating lowest highest key pattern will result in a binary search tree that maximizes the average and worst case search time 28 It is possible to search some hash table implementations in guaranteed constant time 33 This is because simply setting all of the bits which the hash functions point to for a specific key can affect queries for other keys which have a common hash location for one or more of the functions 38 There exist improvements of the Bloom filter which improve on its complexity or support deletion for example the cuckoo filter exploits cuckoo hashing to gain these advantages 38 That is arrays of length 1 3 7 15 31 58 Citations Edit Williams Jr Louis F 22 April 1976 A modification to the half interval search binary search method Proceedings of the 14th ACM Southeast Conference ACM pp 95 101 doi 10 1145 503561 503582 Archived from the original on 12 March 2017 Retrieved 29 June 2018 a b Knuth 1998 6 2 1 Searching an ordered table subsection Binary search Butterfield amp Ngondi 2016 p 46 Cormen et al 2009 p 39 Weisstein Eric W Binary search MathWorld a b Flores Ivan Madpis George 1 September 1971 Average binary search length for dense ordered lists Communications of the ACM 14 9 602 603 doi 10 1145 362663 362752 ISSN 0001 0782 S2CID 43325465 a b c Knuth 1998 6 2 1 Searching an ordered table subsection Algorithm B a b c d Bottenbruch Hermann 1 April 1962 Structure and use of ALGOL 60 Journal of the ACM 9 2 161 221 doi 10 1145 321119 321120 ISSN 0004 5411 S2CID 13406983 Procedure is described at p 214 43 titled Program for Binary Search a b c d e f Knuth 1998 6 2 1 Searching an ordered table subsection History and bibliography a b Kasahara amp Morishita 2006 pp 8 9 a b c Sedgewick amp Wayne 2011 3 1 subsection Rank and selection a b c Goldman amp Goldman 2008 pp 461 463 Sedgewick amp Wayne 2011 3 1 subsection Range queries a b c d e f g h i j k l Knuth 1998 6 2 1 Searching an ordered table subsection Further analysis of binary search Knuth 1998 6 2 1 Searching an ordered table Theorem B Chang 2003 p 169 a b c Knuth 1997 2 3 4 5 Path length a b Knuth 1998 6 2 1 Searching an ordered table subsection Exercise 23 Rolfe Timothy J 1997 Analytic derivation of comparisons in binary search ACM SIGNUM Newsletter 32 4 15 19 doi 10 1145 289251 289255 S2CID 23752485 Khuong Paul Virak Morin Pat 2017 Array Layouts for Comparison Based Searching Journal of Experimental Algorithmics 22 Article 1 3 arXiv 1509 05053 doi 10 1145 3053370 S2CID 23752485 Knuth 1997 2 2 2 Sequential Allocation a b c d Beame Paul Fich Faith E 2001 Optimal bounds for the predecessor problem and related problems Journal of Computer and System Sciences 65 1 38 72 doi 10 1006 jcss 2002 1822 Knuth 1998 Answers to Exercises 6 2 1 for Exercise 5 Knuth 1998 6 2 1 Searching an ordered table Knuth 1998 5 3 1 Minimum Comparison sorting Sedgewick amp Wayne 2011 3 2 Ordered symbol tables Sedgewick amp Wayne 2011 3 2 Binary Search Trees subsection Order based methods and deletion Knuth 1998 6 2 2 Binary tree searching subsection But what about the worst case Sedgewick amp Wayne 2011 3 5 Applications Which symbol table implementation should I use Knuth 1998 5 4 9 Disks and Drums Knuth 1998 6 2 4 Multiway trees Knuth 1998 6 4 Hashing Knuth 1998 6 4 Hashing subsection History Dietzfelbinger Martin Karlin Anna Mehlhorn Kurt Meyer auf der Heide Friedhelm Rohnert Hans Tarjan Robert E August 1994 Dynamic perfect hashing upper and lower bounds SIAM Journal on Computing 23 4 738 761 doi 10 1137 S0097539791194094 Morin Pat Hash tables PDF p 1 Archived PDF from the original on 9 October 2022 Retrieved 28 March 2016 Knuth 2011 7 1 3 Bitwise Tricks and Techniques a b Silverstein Alan Judy IV shop manual PDF Hewlett Packard pp 80 81 archived PDF from the original on 9 October 2022 a b Fan Bin Andersen Dave G Kaminsky Michael Mitzenmacher Michael D 2014 Cuckoo filter practically better than Bloom Proceedings of the 10th ACM International on Conference on Emerging Networking Experiments and Technologies pp 75 88 doi 10 1145 2674005 2674994 Bloom Burton H 1970 Space time trade offs in hash coding with allowable errors Communications of the ACM 13 7 422 426 CiteSeerX 10 1 1 641 9096 doi 10 1145 362686 362692 S2CID 7931252 Knuth 1998 6 2 1 Searching an ordered table subsection An important variation Knuth 1998 6 2 1 Searching an ordered table subsection Algorithm U Moffat amp Turpin 2002 p 33 a b c Knuth 1998 6 2 1 Searching an ordered table subsection Interpolation search Knuth 1998 6 2 1 Searching an ordered table subsection Exercise 22 Perl Yehoshua Itai Alon Avni Haim 1978 Interpolation search a log log n search Communications of the ACM 21 7 550 553 doi 10 1145 359545 359557 S2CID 11089655 a b c Chazelle Bernard Liu Ding 6 July 2001 Lower bounds for intersection searching and fractional cascading in higher dimension 33rd ACM Symposium on Theory of Computing ACM pp 322 329 doi 10 1145 380752 380818 ISBN 978 1 58113 349 3 Retrieved 30 June 2018 Chazelle Bernard Liu Ding 1 March 2004 Lower bounds for intersection searching and fractional cascading in higher dimension PDF Journal of Computer and System Sciences 68 2 269 284 CiteSeerX 10 1 1 298 7772 doi 10 1016 j jcss 2003 07 003 ISSN 0022 0000 Archived PDF from the original on 9 October 2022 Retrieved 30 June 2018 Emamjomeh Zadeh Ehsan Kempe David Singhal Vikrant 2016 Deterministic and probabilistic binary search in graphs 48th ACM Symposium on Theory of Computing pp 519 532 arXiv 1503 00805 doi 10 1145 2897518 2897656 Ben Or Michael Hassidim Avinatan 2008 The Bayesian learner is optimal for noisy binary search and pretty good for quantum as well PDF 49th Symposium on Foundations of Computer Science pp 221 230 doi 10 1109 FOCS 2008 58 ISBN 978 0 7695 3436 7 Archived PDF from the original on 9 October 2022 Pelc Andrzej 1989 Searching with known error probability Theoretical Computer Science 63 2 185 202 doi 10 1016 0304 3975 89 90077 7 Rivest Ronald L Meyer Albert R Kleitman Daniel J Winklmann K Coping with errors in binary search procedures 10th ACM Symposium on Theory of Computing doi 10 1145 800133 804351 Pelc Andrzej 2002 Searching games with errors fifty years of coping with liars Theoretical Computer Science 270 1 2 71 109 doi 10 1016 S0304 3975 01 00303 6 Renyi Alfred 1961 On a problem in information theory Magyar Tudomanyos Akademia Matematikai Kutato Intezetenek Kozlemenyei in Hungarian 6 505 516 MR 0143666 Hoyer Peter Neerbek Jan Shi Yaoyun 2002 Quantum complexities of ordered searching sorting and element distinctness Algorithmica 34 4 429 448 arXiv quant ph 0102078 doi 10 1007 s00453 002 0976 3 S2CID 13717616 Childs Andrew M Landahl Andrew J Parrilo Pablo A 2007 Quantum algorithms for the ordered search problem via semidefinite programming Physical Review A 75 3 032335 arXiv quant ph 0608161 Bibcode 2007PhRvA 75c2335C doi 10 1103 PhysRevA 75 032335 S2CID 41539957 Grover Lov K 1996 A fast quantum mechanical algorithm for database search 28th ACM Symposium on Theory of Computing Philadelphia PA pp 212 219 arXiv quant ph 9605043 doi 10 1145 237814 237866 Peterson William Wesley 1957 Addressing for random access storage IBM Journal of Research and Development 1 2 130 146 doi 10 1147 rd 12 0130 2n 1 OEIS A000225 Archived 8 June 2016 at the Wayback Machine Retrieved 7 May 2016 Lehmer Derrick 1960 Teaching combinatorial tricks to a computer Proceedings of Symposia in Applied Mathematics 10 180 181 doi 10 1090 psapm 010 ISBN 9780821813102 Chazelle Bernard Guibas Leonidas J 1986 Fractional cascading I A data structuring technique PDF Algorithmica 1 1 4 133 162 CiteSeerX 10 1 1 117 8349 doi 10 1007 BF01840440 S2CID 12745042 Chazelle Bernard Guibas Leonidas J 1986 Fractional cascading II Applications PDF Algorithmica 1 1 4 163 191 doi 10 1007 BF01840441 S2CID 11232235 Bentley 2000 4 1 The Challenge of Binary Search Pattis Richard E 1988 Textbook errors in binary searching SIGCSE Bulletin 20 190 194 doi 10 1145 52965 53012 Bloch Joshua 2 June 2006 Extra extra read all about it nearly all binary searches and mergesorts are broken Google Research Blog Archived from the original on 1 April 2016 Retrieved 21 April 2016 Ruggieri Salvatore 2003 On computing the semi sum of two integers PDF Information Processing Letters 87 2 67 71 CiteSeerX 10 1 1 13 5631 doi 10 1016 S0020 0190 03 00263 1 Archived PDF from the original on 3 July 2006 Retrieved 19 March 2016 Bentley 2000 4 4 Principles bsearch binary search a sorted table The Open Group Base Specifications 7th ed The Open Group 2013 Archived from the original on 21 March 2016 Retrieved 28 March 2016 Stroustrup 2013 p 945 std range D Programming Language dlang org Retrieved 29 April 2020 Unisys 2012 COBOL ANSI 85 programming reference manual vol 1 pp 598 601 Package sort The Go Programming Language Archived from the original on 25 April 2016 Retrieved 28 April 2016 java util Arrays Java Platform Standard Edition 8 Documentation Oracle Corporation Archived from the original on 29 April 2016 Retrieved 1 May 2016 java util Collections Java Platform Standard Edition 8 Documentation Oracle Corporation Archived from the original on 23 April 2016 Retrieved 1 May 2016 List lt T gt BinarySearch method T Microsoft Developer Network Archived from the original on 7 May 2016 Retrieved 10 April 2016 NSArray Mac Developer Library Apple Inc Archived from the original on 17 April 2016 Retrieved 1 May 2016 CFArray Mac Developer Library Apple Inc Archived from the original on 20 April 2016 Retrieved 1 May 2016 8 6 bisect Array bisection algorithm The Python Standard Library Python Software Foundation Archived from the original on 25 March 2018 Retrieved 26 March 2018 Fitzgerald 2015 p 152 Sources Edit Bentley Jon 2000 Programming pearls 2nd ed Addison Wesley ISBN 978 0 201 65788 3 Butterfield Andrew Ngondi Gerard E 2016 A dictionary of computer science 7th ed Oxford UK Oxford University Press ISBN 978 0 19 968897 5 Chang Shi Kuo 2003 Data structures and algorithms ISBN 978 981 238 348 8 a href Template Cite book html title Template Cite book cite book a work ignored help Cormen Thomas H Leiserson Charles E Rivest Ronald L Stein Clifford 2009 Introduction to algorithms 3rd ed MIT Press and McGraw Hill ISBN 978 0 262 03384 8 Fitzgerald Michael 2015 Ruby pocket reference Sebastopol California O Reilly Media ISBN 978 1 4919 2601 7 Goldman Sally A Goldman Kenneth J 2008 A practical guide to data structures and algorithms using Java Boca Raton Florida CRC Press ISBN 978 1 58488 455 2 Kasahara Masahiro Morishita Shinichi 2006 Large scale genome sequence processing London UK Imperial College Press ISBN 978 1 86094 635 6 Knuth Donald 1997 Fundamental algorithms The Art of Computer Programming Vol 1 3rd ed Reading MA Addison Wesley Professional ISBN 978 0 201 89683 1 Knuth Donald 1998 Sorting and searching The Art of Computer Programming Vol 3 2nd ed Reading MA Addison Wesley Professional ISBN 978 0 201 89685 5 Knuth Donald 2011 Combinatorial algorithms The Art of Computer Programming Vol 4A 1st ed Reading MA Addison Wesley Professional ISBN 978 0 201 03804 0 Moffat Alistair Turpin Andrew 2002 Compression and coding algorithms Hamburg Germany Kluwer Academic Publishers doi 10 1007 978 1 4615 0935 6 ISBN 978 0 7923 7668 2 Sedgewick Robert Wayne Kevin 2011 Algorithms 4th ed Upper Saddle River New Jersey Addison Wesley Professional ISBN 978 0 321 57351 3 Condensed web version nbsp book version nbsp Stroustrup Bjarne 2013 The C programming language 4th ed Upper Saddle River New Jersey Addison Wesley Professional ISBN 978 0 321 56384 2 External links Edit nbsp The Wikibook Algorithm implementation has a page on the topic of Binary search NIST Dictionary of Algorithms and Data Structures binary search Comparisons and benchmarks of a variety of binary search implementations in C Archived 25 September 2019 at the Wayback Machine Retrieved from https en wikipedia org w index php title Binary search algorithm amp oldid 1179842586, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.