74 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Freecodecamp Algorithm Binary Search Guide
							 | 
						|||
| 
								 | 
							
								localeTitle: Алгоритм Freecodecamp для двоичного поиска
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								Бинарный поиск - это алгоритм поиска, который находит позицию целевого значения в отсортированном массиве.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## пример
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								На приведенной выше иллюстрации показана работа алгоритма бинарного поиска в отсортированном массиве, когда целевое значение равно **4** .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Алгоритм
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Двоичный поиск работает на отсортированных массивах. Бинарный поиск начинается с сравнения среднего элемента массива с целевым значением. Если целевое значение соответствует среднему элементу, возвращается его позиция в массиве. Если целевое значение меньше или больше среднего элемента, поиск продолжает нижнюю или верхнюю половину массива соответственно новому среднему элементу, исключая вторую часть из рассмотрения.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Псевдокод для алгоритма бинарного поиска выглядит следующим образом:
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								BinarySearch(A<a href='https://repl.it/CWZq/158' target='_blank' rel='nofollow'>0..N-1], value) { 
							 | 
						|||
| 
								 | 
							
								  low = 0 
							 | 
						|||
| 
								 | 
							
								  high = N - 1 
							 | 
						|||
| 
								 | 
							
								  while (low <= high) { 
							 | 
						|||
| 
								 | 
							
								    // invariants: value > A[i] for all i < low 
							 | 
						|||
| 
								 | 
							
								                   value < A[i] for all i > high 
							 | 
						|||
| 
								 | 
							
								    mid = (low + high) / 2 
							 | 
						|||
| 
								 | 
							
								    if (A[mid] > value) 
							 | 
						|||
| 
								 | 
							
								      high = mid - 1 
							 | 
						|||
| 
								 | 
							
								    else if (A[mid] < value) 
							 | 
						|||
| 
								 | 
							
								      low = mid + 1 
							 | 
						|||
| 
								 | 
							
								    else 
							 | 
						|||
| 
								 | 
							
								      return mid 
							 | 
						|||
| 
								 | 
							
								  } 
							 | 
						|||
| 
								 | 
							
								  return not_found // value would be inserted at index "low" 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## сложность
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   Наихудшая производительность: **O (log n)**
							 | 
						|||
| 
								 | 
							
								*   Лучшая производительность: **O (1)**
							 | 
						|||
| 
								 | 
							
								*   Средняя производительность: **O (log n)**
							 | 
						|||
| 
								 | 
							
								*   Худшая сложность пространства: **O (1)** для итеративного; **O (log n)** для рекурсивного.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Реализация C ++
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								int binarySearch(int arr[], int value, int left, int right) { 
							 | 
						|||
| 
								 | 
							
								  int middle; 
							 | 
						|||
| 
								 | 
							
								  while (left <= right) { 
							 | 
						|||
| 
								 | 
							
								    middle = (left + right) / 2; 
							 | 
						|||
| 
								 | 
							
								    if (arr[middle] == value) 
							 | 
						|||
| 
								 | 
							
								      return middle; 
							 | 
						|||
| 
								 | 
							
								    else if (arr[middle] > value) 
							 | 
						|||
| 
								 | 
							
								      right = middle - 1; 
							 | 
						|||
| 
								 | 
							
								    else 
							 | 
						|||
| 
								 | 
							
								      left = middle + 1; 
							 | 
						|||
| 
								 | 
							
								  } 
							 | 
						|||
| 
								 | 
							
								  return -1; 
							 | 
						|||
| 
								 | 
							
								 } 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								: rocket: \[Run Code ## Python Implementation
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								def binary_search(l, value): 
							 | 
						|||
| 
								 | 
							
								    low = 0 
							 | 
						|||
| 
								 | 
							
								    high = len(l)-1 
							 | 
						|||
| 
								 | 
							
								    while low <= high: 
							 | 
						|||
| 
								 | 
							
								        mid = (low+high)//2 
							 | 
						|||
| 
								 | 
							
								        if l<a href='https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":rocket:"' target='_blank' rel='nofollow'>mid] > value: high = mid-1 
							 | 
						|||
| 
								 | 
							
								        elif l[mid] < value: low = mid+1 
							 | 
						|||
| 
								 | 
							
								        else: return mid 
							 | 
						|||
| 
								 | 
							
								    return -1 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								 [Код запуска](https://repl.it/CWZi/2)
							 |