Ricerca binaria
Lezione 10 di 26 del corso Gli array in C++ di Coddy.
Cercare in un array in tempo O(n) è una buona soluzione, ma può essere ulteriormente ottimizzata a O(log n) usando un metodo chiamato ricerca binaria.
Condizione per usare la ricerca binaria: Gli elementi dell'array devono essere ordinati in ordine crescente o decrescente.
Per esempio,
int Arr[]={1,2,3,4,5};
int Brr[]={5,3,9,6,7};In Arr, possiamo applicare la ricerca binaria per trovare un elemento, poiché tutti gli elementi di Arr sono ordinati in ordine crescente.
Non possiamo applicare la ricerca binaria a Brr, poiché gli elementi di Brr sono disposti casualmente.
Logica di base
Controlla l'elemento esattamente al centro dell'array,
- Se è uguale alla chiave, stampalo,
- se è minore dell'elemento chiave, cerca nella parte destra dell'array rimanente,
- se è maggiore, cerca nella parte sinistra dell'array rimanente.
Ripeti il processo finché non trovi l'elemento chiave che cerchi; altrimenti, restituisci -1.
Procedura dettagliata
1. Per prima cosa inizializziamo 2 variabili che indicano l'inizio e la fine dell'array. Poi usiamo un ciclo while con una condizione: l'inizio deve essere sempre minore della fine.
int s=0; //inizio
int e=n; //fine
while(s<=e){
}2. Trova l'elemento centrale calcolando (s+e)/2. Se mid è esattamente uguale alla chiave, restituiscilo.
int s=0; //inizio
int e=n; //fine
while(s<=e){
int mid=(s+e)/2; //Metà dell'array
if(arr[mid]==key){ //se è uguale, restituiscilo
return mid;
}
}3. Se l'elemento centrale è maggiore dell'elemento chiave, significa che la chiave deve trovarsi nella parte sinistra dell'array. Quindi spostiamo la fine dell'array a mid-1. Ora abbiamo un array di dimensione n/2, su cui ripetiamo questo processo.
int s=0; //inizio
int e=n; //fine
while(s<=e){
int mid=(s+e)/2; //Metà dell'array
if(arr[mid]==key){
return mid;
}
else if(arr[mid]>key){
e=mid-1; //Sposta la fine a mid-1
}
}4. Se nessuna di queste condizioni è vera, è chiaro che l'elemento deve essere maggiore dell'elemento centrale; quindi cerchiamo nella parte destra dell'array e, per farlo, spostiamo l'inizio dell'array alla posizione mid+1.
int s=0;
int e=n;
while(s<=e){
int mid=(s+e)/2;
if(arr[mid]==key){
return mid;
}
else if(arr[mid]>key){
e=mid-1;
}
else{
s=mid+1; //Sposta l'inizio a mid+1
}
}Eseguiamo il programma finché non troviamo l'elemento; se l'elemento non è presente, restituiamo -1.
Complessità temporale
A ogni passaggio, il numero di elementi si dimezza. Questo significa che il tempo di esecuzione di ogni passaggio è la metà di quello del passaggio precedente. In altre parole, il tempo si riduce in modo logaritmico, portando la complessità temporale della ricerca binaria a O(log n).
Sfida
FacileDato un array, la sua dimensione e un intero k, completa la funzione BinarySearch.
Restituisci l'indice della posizione in cui si trova l'elemento chiave; se la chiave non è presente, restituisci -1.
Provalo tu
#include<vector>
#include<iostream>
using namespace std;
int BinarySearch(vector<int>arr, int n, int key){
}
Tutte le lezioni di Gli array in C++
Esercitati da solo: Compilatore C++ online