Ricerca binaria

  1. Algoritmo di ricerca binaria
  2. Esempio di ricerca binaria
  3. Implementazione dell’algoritmo di ricerca binaria
  4. Complessità dell’algoritmo di ricerca binaria
Ricerca binaria

La ricerca binaria è l’algoritmo di ricerca più popolare ed efficiente. In effetti, è l’algoritmo di ricerca più veloce. Proprio come l’ordinamento a salti, richiede anche l’ordinamento dell’array. Si basa sull’approccio divide et impera in cui dividiamo la matrice in due metà e quindi confrontiamo l’elemento che stiamo cercando con l’elemento centrale. Se l’elemento centrale corrisponde, restituiamo l’indice dell’elemento centrale; in caso contrario, ci spostiamo nella metà sinistra e destra a seconda del valore dell’elemento.

Algoritmo di ricerca binaria

Supponiamo di avere un array non ordinato A[] contenente n elementi e di voler trovare un elemento X.

  • Imposta lo come 0 e hi come n - 1.
  • Mentre lo < hi:
    • Impostare mid = lo + (hi - lo) / 2.
    • se A[mid] == X restituisce mid.
    • se A[mid] <X allora lo = mid + 1.
    • altrimenti se A[mid]> X allora hi= mid-1.
  • L’elemento non è stato trovato, quindi restituisci -1.

Esempio di ricerca binaria

Supponiamo di avere l’array: (1, 2, 3, 4, 5, 6, 7, 8, 9) e di voler trovare X - 8.

  • Imposta lo come 0 e hi come 8.
  • Calcola mid come 4. Poiché A[mid] <X, imposta lo = 4 + 1 = 5.
  • Calcola mid come 6. Poiché A[mid] <X, imposta lo = 6 + 1 = 7.
  • Calcola metà come 7. Poiché A[mid] == 8, restituisci 7.

Implementazione dell’algoritmo di ricerca binaria

#include <bits/stdc++.h>
using namespace std;

int binarySearch(int arr[], int lo, int hi, int x) {
  while (lo <= hi) {
    int m = lo + (hi - lo) / 2;
    if (arr[m] == x) return m;
    if (arr[m] < x)
      lo = m + 1;
    else
      hi = m - 1;
  }
  return -1;
}

int main(void) {
  int n = 9;
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  int x = 8;
  int result = binarySearch(arr, 0, n - 1, x);
  if (result == -1) {
    cout << "Element not found !!";
  } else
    cout << "Element found at index " << result;
  return 0;
}

Complessità dell’algoritmo di ricerca binaria

Complessità temporale

  • Case nella media

Quando eseguiamo la ricerca binaria, cerchiamo in una metà e scartiamo l’altra metà, riducendo la dimensione dell’array della metà ogni volta.

L’espressione per complessità temporale è data dalla ricorrenza.

T(n) = T(n/2) + k , k is a constant.

Questo risultato di questa ricorrenza dà logn, e la complessità temporale è dell’ordine di O(logn). È più veloce sia della ricerca lineare che della ricerca per salto.

  • Caso migliore

Il caso migliore si verifica quando l’elemento centrale è l’elemento che stiamo cercando e viene restituito nella prima iterazione. La complessità temporale nel migliore dei casi è O(1).

  • Nel peggiore dei casi

La complessità temporale del caso peggiore è la stessa della complessità temporale del caso medio. La complessità temporale nel caso peggiore è O(logn).

Complessità spaziale

La complessità dello spazio di questo algoritmo è O(1) nel caso di implementazione iterativa perché non richiede alcuna struttura dati diversa dalle variabili temporanee.

Nel caso di implementazione ricorsiva, la complessità dello spazio è O(logn) a causa dello spazio richiesto dallo stack di chiamate ricorsive.

Ti piacciono i nostri tutorial? Iscriviti a DelftStack su YouTube per aiutarci a creare altre guide video di alta qualità. Iscriviti
Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn