edubun
Italiano

Ricerca: ricerca lineare e binaria

Per trovare un nome in una lista ordinata di un milione, la ricerca binaria non ha mai bisogno di più di 20 controlli.

Cercare un valore

La ricerca è il problema di trovare dove si trova un valore in una raccolta, o di scoprire che non c'è. Lo fa il tuo telefono quando digiti il nome di un contatto, lo fa un negozio quando controlla se un articolo è disponibile, e lo fa un correttore ortografico per ogni parola che scrivi. L'input è una lista e un valore cercato. L'output è la posizione del valore cercato, oppure un segnale come -1 che significa «non trovato».

Ricerca lineare: uno alla volta

Il metodo più semplice è partire da sinistra e controllare un valore dopo l'altro finché trovi l'obiettivo o la lista finisce. Questa è la ricerca lineare. Funziona su qualsiasi lista, ordinata o no. Il suo costo dipende dalla fortuna: se l'obiettivo è il primo, basta un controllo; se è l'ultimo o manca, controlli ogni valore. Per una lista di n valori il caso peggiore è di n controlli. Una lista lunga il doppio può richiedere il doppio dei controlli, ed è da qui che viene il nome «lineare»: il lavoro cresce in linea retta con la dimensione.

function linearSearch(list, target) {
  for (let i = 0; i < list.length; i++) {
    if (list[i] === target) return i;  // trovato
  }
  return -1;                             // controllato tutto
}

Ricerca binaria: dimezza quello che resta

Se la lista è ordinata, puoi fare molto meglio. Pensa al gioco dell'indovina il numero: qualcuno sceglie un numero da 1 a 100 e risponde solo «più alto» o «più basso». Un giocatore furbo prova prima 50. Qualunque sia la risposta, metà delle possibilità sparisce. Il tentativo successivo è il centro di ciò che resta, e così via. La ricerca binaria fa esattamente questo con una lista ordinata. Tiene due indicatori, lo e hi, attorno alla parte in cui l'obiettivo potrebbe ancora trovarsi. Controlla il valore centrale. Se è l'obiettivo, ha finito. Se il valore centrale è più piccolo dell'obiettivo, anche tutto ciò che sta alla sua sinistra è più piccolo, quindi lo si sposta oltre il centro. Se è più grande, hi si sposta prima del centro. Quando lo supera hi, non resta nulla e l'obiettivo non è nella lista.

function binarySearch(list, target) {
  let lo = 0, hi = list.length - 1;
  while (lo <= hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (list[mid] === target) return mid;
    if (list[mid] < target) lo = mid + 1;  // obiettivo a destra
    else hi = mid - 1;                     // obiettivo a sinistra
  }
  return -1;
}
Caricamento

Trascina per ruotare. Scorri o avvicina le dita per lo zoom.

Una lista ordinata di 31 numeri. Scegli un obiettivo, poi esegui passo per passo la ricerca binaria e quella lineare e confronta il numero di controlli.

Quanti controlli?

Ogni controllo della ricerca binaria almeno dimezza la parte che resta. Partendo da n valori, dopo un controllo ne restano al massimo circa n/2, dopo due circa n/4, e così via finché resta un solo valore. Il numero di dimezzamenti necessari per passare da n a 1 è il logaritmo in base 2 di n, scritto log₂ n. Contando anche l'ultimo controllo, la ricerca binaria richiede al massimo ⌊log₂ n⌋ + 1 controlli, dove ⌊ ⌋ significa arrotondare per difetto. Per 100 valori sono 7 controlli, ed è per questo che il gioco dell'indovina il numero si può sempre vincere in 7 tentativi. Per 1000 valori sono 10, per un milione (1000000) 20 e per un miliardo 30.

Lunghezza della lista nRicerca lineare, caso peggioreRicerca binaria, caso peggiore
773
1001007
1,0001,00010
1,000,0001,000,00020
1,000,000,0001,000,000,00030

Il limite: la lista deve essere ordinata

La ricerca binaria funziona solo perché, in una lista ordinata, un confronto ti dice da quale parte deve trovarsi l'obiettivo. In una lista non ordinata il valore centrale non dice nulla dei suoi vicini, quindi torni alla ricerca lineare. Ordinare richiede a sua volta lavoro (le prossime due unità parlano proprio di questo), quindi la scelta dipende dall'uso. Se cerchi in una lista una volta sola, la ricerca lineare può essere la più economica. Se cerchi nella stessa lista migliaia di volte, ordinarla una volta e poi usare la ricerca binaria conviene presto. Questo scambio tra preparare i dati e rispondere alle domande su di essi attraversa tutta la materia.

Un errore classico nella ricerca binaria riguarda il passo di aggiornamento. Scrivere lo = mid invece di lo = mid + 1 può far girare il ciclo all'infinito quando restano due valori, perché mid non cambia mai. Il valore centrale è già stato controllato, quindi si può escludere dall'intervallo successivo.
ricerca lineareControllare i valori uno per uno dall'inizio
ricerca binariaControllare il centro di un intervallo ordinato e scartare la metà che non può contenere l'obiettivo
caso peggioreL'input che fa lavorare di più l'algoritmo
log₂ nQuante volte si può dimezzare n prima di arrivare a 1
lo e hiI due estremi dell'intervallo in cui l'obiettivo potrebbe ancora trovarsi
-1Un valore di ritorno comune che significa «non trovato»
  1. Al massimo quanti controlli servono alla ricerca binaria per una lista ordinata di 1000 valori?
  2. Al massimo quanti controlli servono alla ricerca lineare per una lista di 1000 valori?
  3. La ricerca binaria richiede che la lista sia
    • ordinata
    • corta
    • fatta di numeri interi
    • senza valori ripetuti
  4. Nella lista [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], quanti controlli fa la ricerca binaria per trovare 23?
  5. Nella stessa lista, quanti controlli fa la ricerca lineare per trovare 23?
  6. La ricerca binaria controlla un valore centrale 40 mentre cerca 25. Che cosa succede dopo?
    • hi si sposta subito prima del centro
    • lo si sposta subito dopo il centro
    • la ricerca si ferma: 25 non c'è
    • controlla il valore successivo a destra
  7. Devi indovinare un numero da 1 a 100 e ti dicono «più alto» o «più basso». Con la strategia migliore, quanti tentativi bastano sempre?
  8. Una lista raddoppia di lunghezza. Che cosa succede al numero di controlli della ricerca binaria nel caso peggiore?
    • Raddoppia
    • Cresce di circa uno
    • Resta esattamente uguale
    • Va al quadrato
  9. Devi cercare un solo valore in una lista non ordinata, una volta sola. Che cosa costa meno?
    • Ricerca lineare
    • Ordinare la lista, poi ricerca binaria
  10. Perché lo = mid (invece di mid + 1) può far girare la ricerca binaria all'infinito?
    • Con due valori rimasti, mid può restare uguale a ogni giro
    • mid diventa negativo
    • JavaScript non lo permette
    • La lista si allunga
  11. Al massimo quanti controlli servono alla ricerca binaria per 1000000 di valori?
Punti chiave
  • La ricerca lineare controlla un valore alla volta: fino a n controlli.
  • La ricerca binaria dimezza l'intervallo che resta: fino a ⌊log₂ n⌋ + 1 controlli.
  • La ricerca binaria funziona solo su una lista ordinata.
  • Un milione di valori: al massimo 20 controlli.
  • Aggiorna con mid + 1 e mid − 1, così l'intervallo si restringe sempre.
Fonti di questo corso (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Consultato il: 2026-10-17