Lecture
When the search for some element must be carried out in an ordered sequence in ascending or descending order, then we apply the binary (binary) search algorithm. The method uses the “divide and conquer” strategy, namely: a given sequence is divided into two equal parts and the search is performed in one of these parts, which then also divides in two, and so on until the presence of the desired element or its absence is detected. Using this operation, halving the search area each time, is only possible on the basis of the fact that the sequence elements are pre-ordered. Having found the middle element (it is not difficult to do this, knowing the number of elements in the array), and comparing its value with the desired one, we can confidently say where the required element is located relative to the middle element.
Further, we will assume that the elements of the array are arranged in ascending order, since there is no significant difference in how they are ordered: ascending or descending value. We also denote the boundaries of the search zone by left and right - the leftmost and rightmost elements, respectively.
The progress of the algorithm, divided into stages, is as follows:
The table below shows a specific integer array, and step-by-step execution of a binary search algorithm applied to its elements. To save space in the table, left, right and mid are replaced by a, b and c.
There is a sequence of integers arranged in ascending order, and the key is the number 16. Initially, the boundary elements are the elements with numbers 1 and 9, and the values 1 and 81. The number of the middle element is calculated, for which the formula is usually used (right + left) / 2, or left + (right-left) / 2 (further, the second formula will be used in the programs as the most resistant to overflows). After comparison, it turns out that the desired element is less than the average, and therefore the subsequent search is performed in the left part of the sequence. The algorithm continues to run in a similar way, until the desired element is found at step 4.
It should be noted that much less time is required here than if we used linear search, but unlike linear search, binary works only with arrays whose elements are ordered, which undoubtedly gives it negative specificity.
one 2 3 four five 6 7 eight 9 ten eleven 12 13 14 15 sixteen 17 18 nineteen 20 21 22 23 24 25 26 27 28 29 thirty 31 | #include "stdafx.h" #include <iostream> using namespace std; const int N = 10; // binary search int BinarySearch (int A [], int key) { int left = 0, right = N, mid; while (left <= right) { mid = left + (right-left) / 2; if (key <A [mid]) right = mid-1; else if (key> A [mid]) left = mid + 1; else return mid; } return -1; } // main function void main () { setlocale (LC_ALL, "Rus"); int i, key; int A [N]; cout << "Search Item>"; cin >> key; // enter key cout << "Source array:"; for (i = 0; i <N; i ++) // fill and output array {A [i] = N * i; cout << A [i] << ""; } if (BinarySearch (A, key) == - 1) cout << "\ nItement not found"; else cout << "\ nItem number:" << BinarySearch (A, key) +1; system ("pause >> void"); } |
one 2 3 four five 6 7 eight 9 ten eleven 12 13 14 15 sixteen 17 18 nineteen 20 21 22 23 24 25 26 27 28 29 | program BinSearch; uses crt; const N = 10; type Arr = array [1..N] of integer; var mid, left, right, key, i: integer; A: Arr; {binary search} function BinarySearch (A: Arr; key: integer): integer; begin left: = 1; right: = N; while left <= right do begin mid: = left + (right-left) div 2; if (key <A [mid]) then right: = mid-1 else if (key> A [mid]) then left: = mid + 1 else begin BinarySearch: = mid; exit; end; end; BinarySearch: = - 1; end; {main program block} begin write ('search element>'); read (key); {key entry} write ('Source array:'); for i: = 1 to N do {fill and output array} begin A [i]: = N * i; write (A [i], ''); end; writeln; if (BinarySearch (A, key) = - 1) then write ('Element not found') else write ('Element number:', BinarySearch (A, key)); end. |
In the program, it would be possible to implement an array check for the presence of elements in it, but since it is filled, regardless of the user, by a strictly defined number of constant values, this is not necessary.
In the case when the first mid value coincides with the key, then it is considered that the algorithm was executed in its best time O (1). In average and worst case, the algorithm has a running time of O (log n ), which is much faster than a linear search that requires linear time.
Comments
To leave a comment
Algorithms
Terms: Algorithms