3.1 Problema di ricerca di un elemento in un array utilizzando la ricerca lineare
Problema: Dato un array di numeri. È necessario trovare l'indice di un numero dato utilizzando la ricerca lineare. Se il numero non viene trovato, restituire -1.
Esempio:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# Esempio di utilizzo:
arr = [4, 2, 7, 1, 9, 3]
target = 7
result = linear_search(arr, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 7 trovato all'indice 2
# Esempio di utilizzo per un elemento non presente nell'array:
target = 5
result = linear_search(arr, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 5 trovato all'indice -1
Spiegazione:
- La funzione
linear_searchscorre ogni elemento dell'array arr e lo confronta contarget. - Se l'elemento viene trovato, restituisce il suo indice.
- Se tutti gli elementi sono stati controllati e il valore cercato non è stato trovato, la funzione restituisce -1.
Passaggi:
- Array
[4, 2, 7, 1, 9, 3]e valore cercato7. - Inizio ricerca: confronto del primo elemento (4) con 7 — non corrisponde.
- Passa al prossimo elemento
(2)— non corrisponde. - Passa al prossimo elemento
(7)— corrisponde. - Ritorna indice
2.
3.2 Problema di ricerca di un elemento in un array ordinato utilizzando la ricerca binaria
Problema: Dato un array ordinato di numeri. È necessario trovare l'indice di un numero dato utilizzando la ricerca binaria. Se il numero non viene trovato, restituire -1.
Esempio:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# Esempio di utilizzo:
sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
result = binary_search(sorted_array, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 7 trovato all'indice 3
# Esempio di utilizzo per un elemento non presente nell'array:
target = 6
result = binary_search(sorted_array, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 6 trovato all'indice -1
Spiegazione:
- La funzione
binary_searchutilizza due puntatori (left e right) per tracciare i confini della ricerca nell'arrayarr. - Ad ogni iterazione si trova l'elemento medio dell'array e lo si confronta con
target. - Se l'elemento medio è uguale a
target, restituisce il suo indice. - Se
targetè minore dell'elemento medio, la ricerca continua nella metà sinistra dell'array. - Se
targetè maggiore dell'elemento medio, la ricerca continua nella metà destra dell'array. - Se i confini si incrociano e l'elemento non viene trovato, si restituisce -1.
Passaggi:
- Array ordinato
[1, 3, 5, 7, 9, 11, 13]e valore cercato7. - Confini iniziali della ricerca:
left = 0,right = 6. - Trova l'elemento medio:
mid = (0 + 6) // 2 = 3. - Confronta l'elemento medio
(7)contarget (7)— corrisponde. - Ritorna indice
3.
3.3 Confronto e scelta dell'algoritmo di ricerca adatto per diversi problemi
Confronto tra ricerca lineare e binaria:
| Caratteristica | Ricerca lineare | Ricerca binaria |
|---|---|---|
| Complessità temporale | O(n) | O(log n) |
| Requisiti sui dati | Non richiede ordinamento preliminare | Richiede un array ordinato |
| Semplicità di implementazione | Molto semplice | Più complessa |
| Efficienza | Meno efficiente per array grandi | Molto efficiente per array grandi |
Scelta dell'algoritmo adatto
Ricerca lineare:
- Utilizzata quando i dati non sono ordinati.
- Adatta per array o liste piccole.
- Usata quando il numero di elementi è ridotto e il tempo di esecuzione non è cruciale.
Ricerca binaria:
- Applicata quando i dati sono ordinati.
- Ideale per array grandi, dove la velocità di ricerca è importante.
- Efficace se
è necessaria una ricerca frequente nello stesso insieme di dati(è possibile ordinare i dati in anticipo).
3.4 Esercizi pratici per consolidare il materiale
Esercizio 1: Ricerca lineare
Dato un array di numeri. Scrivi una funzione per cercare un numero dato utilizzando la ricerca lineare. La funzione deve restituire l'indice dell'elemento trovato o -1 se l'elemento non viene trovato.
Esempio:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# Esempio di utilizzo:
arr = [4, 2, 7, 1, 9, 3]
target = 7
result = linear_search(arr, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 7 trovato all'indice 2
# Test aggiuntivi:
assert linear_search(arr, 9) == 4
assert linear_search(arr, 5) == -1
Esercizio 2: Ricerca binaria
Dato un array ordinato di numeri. Scrivi una funzione per cercare un numero dato utilizzando la ricerca binaria. La funzione deve restituire l'indice dell'elemento trovato o -1 se l'elemento non viene trovato.
Esempio:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# Esempio di utilizzo:
sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
result = binary_search(sorted_array, target)
print(f"Elemento {target} trovato all'indice {result}") # Uscita: Elemento 7 trovato all'indice 3
# Test aggiuntivi:
assert binary_search(sorted_array, 1) == 0
assert binary_search(sorted_array, 13) == 6
assert binary_search(sorted_array, 6) == -1
Esercizio 3: Confronto tra ricerca lineare e binaria
Dato un array di numeri. Scrivi due funzioni per cercare un numero dato: una utilizzando la ricerca lineare, l'altra utilizzando la ricerca binaria. Confronta le prestazioni di entrambe le funzioni su array di grandi dimensioni.
Esempio:
import time
import random
# Ricerca lineare
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# Ricerca binaria
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# Generazione di un grande array
large_array = [random.randint(0, 1000000) for _ in range(1000000)]
sorted_large_array = sorted(large_array)
target = random.choice(large_array)
# Confronto delle prestazioni
start_time = time.time()
linear_search(large_array, target)
print(f"Ricerca lineare ha impiegato: {time.time() - start_time:.6f} secondi")
start_time = time.time()
binary_search(sorted_large_array, target)
print(f"Ricerca binaria ha impiegato: {time.time() - start_time:.6f} secondi")
GO TO FULL VERSION