Бинарный поиск

В этом руководстве вы узнаете, как работает сортировка двоичного поиска. Также вы найдете рабочие примеры двоичного поиска на C, C ++, Java и Python.

Двоичный поиск - это поисковый алгоритм для поиска позиции элемента в отсортированном массиве.

При таком подходе поиск элемента всегда выполняется в середине части массива.

Двоичный поиск может быть реализован только по отсортированному списку элементов. Если элементы еще не отсортированы, нам нужно сначала их отсортировать.

Двоичный поиск работает

Алгоритм двоичного поиска может быть реализован двумя способами, которые обсуждаются ниже.

  1. Итерационный метод
  2. Рекурсивный метод

Рекурсивный метод следует подходу «разделяй и властвуй».

Общие шаги для обоих методов обсуждаются ниже.

  1. Массив, в котором должен выполняться поиск: Начальный массив
    Позвольте x = 4быть элементом, в котором будет выполняться поиск.
  2. Установите два указателя low и high в нижнюю и верхнюю позиции соответственно. Установка указателей
  3. Найдите средний элемент в середине массива, т.е. (arr(low + high)) / 2 = 6. Средний элемент
  4. Если x == mid, то верните mid. Или сравните искомый элемент с m.
  5. Если x> mid, сравните x со средним элементом элементов справа от mid. Это делается путем установки низкого значения low = mid + 1.
  6. В противном случае сравните x со средним элементом элементов в левой части mid. Это делается путем установки высокого значения high = mid - 1. Нахождение среднего элемента
  7. Повторяйте шаги с 3 по 6, пока низкий уровень не встретится с высоким. Средний элемент
  8. x = 4найден. Найденный

Алгоритм двоичного поиска

Метод итерации

делайте, пока указатели не встретятся друг с другом. mid = (low + high) / 2 if (x == arr (mid)) return mid else if (x> A (mid)) // x находится справа low = mid + 1 else // x находится на левая сторона высокая = средняя - 1

Рекурсивный метод

 binarySearch (arr, x, low, high) if low> high return False else mid = (low + high) / 2 if x == arr (mid) return mid else if x <data (mid) // x находится на правая сторона return binarySearch (arr, x, mid + 1, high) else // x находится справа return binarySearch (arr, x, low, mid - 1)

Примеры Python, Java, C / C ++ (итерационный метод)

Python Java C C ++
 # Binary Search in python def binarySearch(array, x, low, high): # Repeat until the pointers low and high meet each other while low <= high: mid = low + (high - low)//2 if array(mid) == x: return mid elif array(mid) < x: low = mid + 1 else: high = mid - 1 return -1 array = (3, 4, 5, 6, 7, 8, 9) x = 4 result = binarySearch(array, x, 0, len(array)-1) if result != -1: print("Element is present at index " + str(result)) else: print("Not found")
 // Binary Search in Java class BinarySearch ( int binarySearch(int array(), int x, int low, int high) ( // Repeat until the pointers low and high meet each other while (low <= high) ( int mid = low + (high - low) / 2; if (array(mid) == x) return mid; if (array(mid) < x) low = mid + 1; else high = mid - 1; ) return -1; ) public static void main(String args()) ( BinarySearch ob = new BinarySearch(); int array() = ( 3, 4, 5, 6, 7, 8, 9 ); int n = array.length; int x = 4; int result = ob.binarySearch(array, x, 0, n - 1); if (result == -1) System.out.println("Not found"); else System.out.println("Element found at index " + result); ) )
 // Binary Search in C #include int binarySearch(int array(), int x, int low, int high) ( // Repeat until the pointers low and high meet each other while (low <= high) ( int mid = low + (high - low) / 2; if (array(mid) == x) return mid; if (array(mid) < x) low = mid + 1; else high = mid - 1; ) return -1; ) int main(void) ( int array() = (3, 4, 5, 6, 7, 8, 9); int n = sizeof(array) / sizeof(array(0)); int x = 4; int result = binarySearch(array, x, 0, n - 1); if (result == -1) printf("Not found"); else printf("Element is found at index %d", result); return 0; )
 // Binary Search in C++ #include using namespace std; int binarySearch(int array(), int x, int low, int high) ( // Repeat until the pointers low and high meet each other while (low <= high) ( int mid = low + (high - low) / 2; if (array(mid) == x) return mid; if (array(mid) < x) low = mid + 1; else high = mid - 1; ) return -1; ) int main(void) ( int array() = (3, 4, 5, 6, 7, 8, 9); int x = 4; int n = sizeof(array) / sizeof(array(0)); int result = binarySearch(array, x, 0, n - 1); if (result == -1) printf("Not found"); else printf("Element is found at index %d", result); )

Примеры Python, Java, C / C ++ (рекурсивный метод)

Python Java C C ++
 # Binary Search in python def binarySearch(array, x, low, high): if high>= low: mid = low + (high - low)//2 # If found at mid, then return it if array(mid) == x: return mid # Search the left half elif array(mid)> x: return binarySearch(array, x, low, mid-1) # Search the right half else: return binarySearch(array, x, mid + 1, high) else: return -1 array = (3, 4, 5, 6, 7, 8, 9) x = 4 result = binarySearch(array, x, 0, len(array)-1) if result != -1: print("Element is present at index " + str(result)) else: print("Not found")
 // Binary Search in Java class BinarySearch ( int binarySearch(int array(), int x, int low, int high) ( if (high>= low) ( int mid = low + (high - low) / 2; // If found at mid, then return it if (array(mid) == x) return mid; // Search the left half if (array(mid)> x) return binarySearch(array, x, low, mid - 1); // Search the right half return binarySearch(array, x, mid + 1, high); ) return -1; ) public static void main(String args()) ( BinarySearch ob = new BinarySearch(); int array() = ( 3, 4, 5, 6, 7, 8, 9 ); int n = array.length; int x = 4; int result = ob.binarySearch(array, x, 0, n - 1); if (result == -1) System.out.println("Not found"); else System.out.println("Element found at index " + result); ) )
 // Binary Search in C #include int binarySearch(int array(), int x, int low, int high) ( if (high>= low) ( int mid = low + (high - low) / 2; // If found at mid, then return it if (array(mid) == x) return mid; // Search the left half if (array(mid)> x) return binarySearch(array, x, low, mid - 1); // Search the right half return binarySearch(array, x, mid + 1, high); ) return -1; ) int main(void) ( int array() = (3, 4, 5, 6, 7, 8, 9); int n = sizeof(array) / sizeof(array(0)); int x = 4; int result = binarySearch(array, x, 0, n - 1); if (result == -1) printf("Not found"); else printf("Element is found at index %d", result); )
 // Binary Search in C++ #include using namespace std; int binarySearch(int array(), int x, int low, int high) ( if (high>= low) ( int mid = low + (high - low) / 2; // If found at mid, then return it if (array(mid) == x) return mid; // Search the left half if (array(mid)> x) return binarySearch(array, x, low, mid - 1); // Search the right half return binarySearch(array, x, mid + 1, high); ) return -1; ) int main(void) ( int array() = (3, 4, 5, 6, 7, 8, 9); int x = 4; int n = sizeof(array) / sizeof(array(0)); int result = binarySearch(array, x, 0, n - 1); if (result == -1) printf("Not found"); else printf("Element is found at index %d", result); )

Сложность двоичного поиска

Временные сложности

  • Сложность наилучшего случая :O(1)
  • Средняя сложность дела :O(log n)
  • Сложность наихудшего случая :O(log n)

Космическая сложность

Пространственная сложность двоичного поиска составляет O(n).

Приложения двоичного поиска

  • В библиотеках Java, .Net, C ++ STL
  • Во время отладки используется двоичный поиск, чтобы точно определить место, где произошла ошибка.

Интересные статьи...