📌 Algoritmi e programmazione: progettare una soluzione

Progettare una soluzione significa chiarire requisiti, controlli e risorse. Il caso dei duplicati mostra come le scelte influenzino correttezza e costo.

Mani confrontano due fotografie duplicate di un paesaggio costiero su una scrivania, accanto a un computer portatile.

Autore: alessiopuppi · Creato: 12/09/2026 19:30

⚙️ Dai requisiti alla verifica della soluzione

Abstract. La qualità di una soluzione informatica dipende dalle decisioni che ne definiscono il comportamento. Una richiesta semplice, come eliminare i duplicati da un elenco, può nascondere criteri diversi. Occorre stabilire quali elementi siano equivalenti, quale occorrenza conservare e quale ordine rispettare. Da queste scelte derivano il procedimento, i controlli e il confronto tra strategie. Un esempio concreto permette di seguire il legame tra requisiti, codice e risorse. La progettazione diventa così un ragionamento di cui si possono discutere le conseguenze.

🔎 Le decisioni nascoste nella richiesta

Parole come «uguale», «ordinato» e «valido» possono sembrare sufficientemente precise finché non occorre tradurle in un comportamento. Eliminare i duplicati da un elenco richiede, per esempio, di decidere se due elementi debbano coincidere in tutti i campi oppure soltanto in un identificatore. Se contengono informazioni differenti, va stabilito quale conservare.

Consideriamo un caso illustrativo più semplice: una sequenza di interi nella quale vogliamo mantenere soltanto la prima occorrenza di ciascun valore, rispettandone l’ordine di apparizione. L’ingresso [7, 2, 7, 5, 2, 9] deve allora produrre [7, 2, 5, 9] . Il risultato [2, 5, 7, 9] contiene gli stessi valori distinti, ma viola il requisito d’ordine.

🧩 Rendere le scelte operative

Una strategia consiste nell’esaminare gli elementi da sinistra a destra e aggiungere all’uscita soltanto quelli non ancora incontrati. Il punto da rendere esplicito è come riconoscere un valore già presente. Confrontarlo con tutti gli elementi conservati oppure mantenere una struttura dedicata alla ricerca porta a organizzazioni diverse del lavoro.

Diagrammi di flusso e pseudocodice possono rendere visibile questa scelta prima dell’implementazione. Nel codice, la suddivisione in funzioni può separare il criterio di confronto dalla gestione dell’elenco. Se in seguito cambia il significato di duplicato, diventa più semplice individuare quali parti dipendano da quella decisione.

Pietra miliare. Nell’esempio, unicità e ordine sono due obblighi distinti. Il procedimento deve conservarli entrambi; soddisfarne soltanto uno produce una soluzione incompleta rispetto alla richiesta.

🧪 Controllare proprietà indipendenti

I controlli acquistano valore quando interrogano aspetti diversi del comportamento. Una sequenza vuota deve restare vuota; una sequenza senza ripetizioni deve mantenere tutti i suoi elementi; una sequenza di valori identici deve conservarne uno. Occorre inoltre verificare che l’uscita non introduca valori assenti dall’ingresso e rispetti l’ordine richiesto.

Esiste anche una proprietà utile: ripetere la deduplicazione sul risultato non dovrebbe modificarlo. Da sola, però, questa proprietà non basta. Un programma che restituisce sempre un elenco vuoto la soddisfa, pur eliminando dati che avrebbe dovuto conservare. Un controllo può quindi essere corretto e al tempo stesso insufficiente.

La proprietà generale della strategia può essere formulata così: dopo ogni passo, l’uscita contiene esattamente le prime occorrenze degli elementi già esaminati. Un caso ammesso che produca una perdita, una ripetizione o un ordine errato smentisce la correttezza dell’implementazione. Il successo su alcuni esempi lascia invece aperti i casi non controllati.

📏 Confrontare il costo della stessa richiesta

Una volta fissati i requisiti, possiamo confrontare strategie compatibili. Se ogni nuovo valore viene confrontato con tutti quelli già conservati, una sequenza di n valori distinti richiede n(n−1)/2 confronti : 4.950 per 100 elementi e 499.500 per 1.000 elementi.

Sono conteggi del procedimento descritto, non tempi misurati. La durata reale dipende anche dal costo di ciascun confronto e dall’ambiente di esecuzione. Una struttura ausiliaria può ridurre il lavoro di ricerca, ma introduce proprie esigenze di memoria e gestione. Valutare l’efficienza significa rendere esplicito questo compromesso.

Pietra miliare. Un controllo riguarda ciò che il programma deve restituire; un conteggio riguarda il lavoro necessario per ottenerlo. Il confronto delle prestazioni resta significativo soltanto a requisiti e ipotesi dichiarati.

🔗 Implicazioni e connessioni interdisciplinari

Nelle basi di dati, scegliere un solo elemento per identificatore può significare decidere quale versione di un’informazione conservare. Nella logica matematica, il criterio di uguaglianza permette di raggruppare elementi equivalenti e scegliere un rappresentante. Nell’ingegneria del software, isolare tale criterio consente di riconoscere le conseguenze di una modifica. Lo stesso problema mette quindi in relazione significato dei dati, proprietà formali e manutenzione del programma.

⚖️ Limiti, incertezze e domande aperte

L’esempio assume un elenco finito, immutato durante l’elaborazione, e un confronto esatto tra interi. Record incompleti, informazioni contraddittorie o somiglianze approssimate richiedono criteri ulteriori. Due elementi molto simili non sono necessariamente duplicati, e la prima occorrenza non è necessariamente quella più aggiornata.

La scelta del rappresentante resta quindi legata allo scopo. Un procedimento può rispettare perfettamente la specifica e conservare informazioni poco utili se il requisito iniziale era inadeguato. La verifica dell’implementazione e la valutazione della richiesta rispondono a domande differenti.

🧭 Sintesi

Nel caso dei duplicati, progettare una soluzione significa collegare criterio di uguaglianza, scelta dell’occorrenza, ordine, controlli e risorse. Il programma realizza un insieme di decisioni riconoscibili. La qualità del progetto emerge dalla coerenza tra quelle decisioni e il comportamento effettivamente ottenuto.

Bibliografia

  • Titolo
    Algoritmi e strutture dati — 3ª edizione
    Autore
    Camil Demetrescu; Irene Finocchi; Giuseppe F. Italiano
    Editore
    McGraw Hill
    Anno
    2025
    ISBN
    9788838613210
    Nota
    Trattazione universitaria di progettazione e analisi degli algoritmi e delle strutture che organizzano i dati. Serve per approfondire come una scelta di rappresentazione influenzi il costo delle operazioni.
  • Titolo
    Introduzione agli algoritmi e strutture dati — 4ª edizione italiana
    Autore
    Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein
    Editore
    McGraw Hill
    Anno
    2023
    ISBN
    9788838656217
    Nota
    Manuale di progettazione e analisi degli algoritmi, con strumenti matematici per correttezza e complessità. Serve per collocare conteggi di operazioni e strategie di ricerca in un quadro sistematico.
  • Titolo
    Pensare in Python. Come pensare da informatico — 3ª edizione, DigitaBook
    Autore
    Allen B. Downey
    Editore
    Egea
    Anno
    2025
    ISBN
    9788823889743
    Nota
    Introduzione alla programmazione che collega esercizi, funzioni, strutture dati e ricerca degli errori. Serve per passare dal ragionamento sulla soluzione alla sua realizzazione e revisione in un linguaggio concreto. Italiano. ISBN dell’edizione digitale DigitaBook.
  • Titolo
    Program Proofs
    Autore
    K. Rustan M. Leino
    Editore
    MIT Press
    Anno
    2023
    ISBN
    9780262546232
    Nota
    Introduzione alla verifica dei programmi mediante specifiche, ragionamento formale e strumenti basati su Dafny. Serve per sviluppare la distinzione tra esempi di esecuzione, invarianti e dimostrazioni di correttezza.
  • Titolo
    Software Abstractions: Logic, Language, and Analysis — edizione riveduta, brossura
    Autore
    Daniel Jackson
    Editore
    MIT Press
    Anno
    2016
    ISBN
    9780262528900
    Nota
    Presenta la modellazione del software con logica relazionale e l’analisi dei modelli mediante Alloy. Serve per approfondire la formulazione delle proprietà e la ricerca di controesempi nei modelli.
  • Titolo
    Software Design for Flexibility: How to Avoid Programming Yourself into a Corner
    Autore
    Chris Hanson; Gerald Jay Sussman
    Editore
    MIT Press
    Anno
    2021
    ISBN
    9780262045490
    Nota
    Testo avanzato sulla progettazione di programmi modificabili, con esempi in Scheme e attenzione alla composizione delle soluzioni. Serve per approfondire la separazione delle decisioni progettuali e le conseguenze dei cambiamenti nei requisiti.

Glossario

Caso limite
Situazione ammessa che si trova al confine delle condizioni considerate, come un elenco vuoto. Può rendere visibili assunzioni implicite.
Chiave di confronto
Valore o insieme di valori utilizzato per confrontare gli elementi. Può coincidere con l’intero elemento oppure con un suo identificatore.
Conservazione dell’ordine
Vincolo per cui gli elementi mantenuti rispettano l’ordine relativo stabilito dall’ingresso. Non coincide con il loro ordinamento crescente.
Controesempio
Caso che smentisce una proprietà formulata come universale. Un ingresso ammesso con uscita errata basta a confutare la correttezza dichiarata di un’implementazione.
Deduplicazione
Eliminazione delle ripetizioni secondo un criterio dichiarato. Il criterio deve precisare quando due elementi contano come duplicati e quale conservare.
Idempotenza
Proprietà per cui ripetere un’operazione sul suo risultato non lo modifica ulteriormente. La deduplicazione richiesta la soddisfa, ma questa proprietà da sola non ne garantisce la correttezza.
Invariante
Proprietà che resta valida nei punti stabiliti di un’elaborazione. Nell’esempio, dopo ogni passo l’uscita contiene le prime occorrenze del prefisso già esaminato.
Manutenibilità
Facilità con cui un programma può essere compreso e modificato conservandone le proprietà richieste. Separare decisioni indipendenti può aiutare a localizzare gli effetti delle modifiche.
Memoria ausiliaria
Memoria aggiuntiva impiegata durante l’elaborazione. Nel confronto tra strategie occorre dichiarare se il conteggio includa anche lo spazio dell’uscita.
Modello di costo
Insieme delle ipotesi usate per contare il lavoro di un procedimento. Contare confronti non equivale a misurare secondi di esecuzione.
Occorrenza
Singola presenza di un elemento in una sequenza. Uno stesso valore può comparire in posizioni diverse.
Postcondizione
Proprietà che deve risultare vera al termine dell’esecuzione, quando valgono le precondizioni previste.
Precondizione
Condizione assunta valida prima dell’esecuzione di un procedimento. Nell’esempio, l’ingresso è un elenco finito di interi.
Rappresentante
Elemento scelto per una classe di elementi considerati equivalenti. La scelta può seguire l’ordine di apparizione o un altro criterio esplicito.
Requisito funzionale
Proprietà del risultato o del comportamento atteso. Nell’esempio, conservare la prima occorrenza e rispettare l’ordine sono requisiti distinti.
Specifica
Descrizione del comportamento richiesto, comprese le condizioni nelle quali deve essere garantito. Permette di valutare una soluzione indipendentemente dal modo in cui è costruita.

Fonti web

Messaggio sponsorizzato
Pubblicità

🔗 Condividi l'articolo:

Autore: alessiopuppi · Creato: 12/09/2026 19:30 · Ultima modifica: 12/09/2026 22:34