Esercizio del 14/10/2021⚓︎
Dati due insiemi di elementi \(I_1\) e \(I_2\), di cardinalità rispettivamente \(n, m\), scrivere un algoritmo in grado di individuare gli elementi comuni ai due insiemi.
Iniziamo ad elencare i dati.
- INPUT
- \(I_1\) – insieme di elementi, insieme
- \(n\) – cardinalità di \(I_1\), appartiene a \(\N^\ast\)
- \(I_2\) – insieme di elementi, insieme
- \(m\) – cardinalità di \(I_2\), appartiene a \(\N^\ast\)
- OUTPUT
- \(I_3\) – insieme di elementi comuni a \(I_1\) e \(I_2\)
Consideriamo ad esempio \(I_1 = \{3, 12, 7, 41, 35\}\) e \(I_2 = \{8, 5, 62, 7, 27, 56\}\), ne risulta che \(I_3 = \{7\}\). Che procedimento è stato utilizzato?
Bozza | |
---|---|
Non è un algoritmo, ma il procedimento è sostanzialmente questo. Vediamolo:
Algoritmo, v1 | |
---|---|
Questa è una possibile soluzione. Iteriamo all'interno del primo insieme e confrontiamo il primo elemento di questo con tutti gli elementi dell'altro insieme, e così via. C'è tuttavia un errore, non viene specificato l'inserimento dell'elemento nell'insieme \(I_3\). Inoltre l'algoritmo potrebbe essere reso più efficiente interrompendo il ciclo dopo aver trovato il numero in comune. Dunque
Algoritmo, v2 | |
---|---|
Questo algoritmo però non funziona tutte le volte poiché nel caso in cui
l'insieme \(I_3\) sia vuoto, questo dovrebbe essere \(I_3 = \emptyset\) ma il
valore di \(r\) parte da uno e non da zero. Bisogna tener conto del fatto che la
cardinalità è maggiorata di uno nel momento in cui sia necessario dare la
soluzione, dunque r - 1 = 0
, allora \(I_3 = \emptyset\).
Dopo aver letto la sezione sull'Algebra Booleana, è possibile scrivere un algoritmo migliore, che utilizza un valore booleano che indica se l'elemento è presente o meno nell'insieme \(I_2\).
Algoritmo, v3 | |
---|---|
Controllo⚓︎
Controlliamo che l'algoritmo sia corretto. Siano \(I_1 = \set{5, 10, 31}\) e \(I_2 = \set{7, 10}\), dunque \(I_3 = \set{10}\). Inoltre \(n = 3\) e \(m = 2\).