Двійковий пошук

У цьому підручнику ви дізнаєтесь, як працює сортування за допомогою двійкового пошуку. Крім того, ви знайдете робочі приклади двійкового пошуку на мовах C, C ++, Java та Python.

Двійковий пошук - це алгоритм пошуку для знаходження позиції елемента у відсортованому масиві.

При такому підході елемент завжди шукається в середині частини масиву.

Двійковий пошук може бути реалізований лише за відсортованим списком елементів. Якщо елементи ще не відсортовані, спочатку нам потрібно відсортувати їх.

Робота двійкового пошуку

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

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

Рекурсивний метод слідує підходу розділити і завоювати.

Загальні кроки для обох методів обговорюються нижче.

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

Алгоритм двійкового пошуку

Метод ітерації

робити до тих пір, поки покажчики низький і високий не зустрінуться один з одним. mid = (низький + високий) / 2 if (x == arr (mid)) повернення 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 is on праворуч повертає binarySearch (arr, x, mid + 1, high) else // x знаходиться праворуч повертає 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
  • Під час налагодження двійковий пошук використовується для визначення місця, де трапляється помилка.

Цікаві статті...