Consiglio Pratico Algoritmi
Salve vorrei chiedere un parere agli esperti.
In questo periodo sto studiando per il corso di Algoritmi e Strutture Dati. La teoria, le tecniche, l'analisi della complessità le ho apprese bene e le so spiegare altrettanto
Il mio problema nasce quando devo scrivere gli algoritmi in pseudocodice e dimostrare la correttezza.
Quando leggo un problema, ho l'intuizione della soluzione e la relatica tecnica da utilizzare, il più delle volte è corretta. Abbozzo qualche disegno (es flusso) o qualche formula (es progr dinamica), e poi mi blocco.
Vorrei chiedere come voi affrontate un problema da risolvere, in che ordine svolgete la risoluzione di un algoritmo, disegnate, scegliete una tecnica, scrivete direttamente lo pseudocodice, affrontate la dimostrazione matematica....
Questo blocco mi sta davvero creando dei problemi.
non so cosa potreste dirmi, ma come affrontate un problema e il relativo algoritmo.
grazie a chi risponde
In questo periodo sto studiando per il corso di Algoritmi e Strutture Dati. La teoria, le tecniche, l'analisi della complessità le ho apprese bene e le so spiegare altrettanto
Il mio problema nasce quando devo scrivere gli algoritmi in pseudocodice e dimostrare la correttezza.
Quando leggo un problema, ho l'intuizione della soluzione e la relatica tecnica da utilizzare, il più delle volte è corretta. Abbozzo qualche disegno (es flusso) o qualche formula (es progr dinamica), e poi mi blocco.
Vorrei chiedere come voi affrontate un problema da risolvere, in che ordine svolgete la risoluzione di un algoritmo, disegnate, scegliete una tecnica, scrivete direttamente lo pseudocodice, affrontate la dimostrazione matematica....
Questo blocco mi sta davvero creando dei problemi.
non so cosa potreste dirmi, ma come affrontate un problema e il relativo algoritmo.
grazie a chi risponde

Risposte
ora non so come è strutturato il tuo esame di algoritmi, ma sostanzialmente quello che ho fatto io si basava su alberi, costi e grafi.
io quando risolvevo gli esercizi mi veniva richiesto il solo codice che funzionasse. comunque. io ragionerei così (senza sapere cosa si aspetta il tuo professore sugli esercizi). ti scrivi lo pseudocodice che ritieni possa risolvere il problema, e cominci a provare il tuo codice "graficamente" in tutti i vari casi. che ne so, metti stai lavorando su un qualche algoritmo su un albero. ti disegni un albero che presenta tutti i casi particolari che possono capitare (si spera che quelli base non siano necessari). e li disegni e scrivi i passi che esegue il tuo algoritmo su quell'albero e in che modo lo modifica. in questo modo fai sia debug del codice, sia la dimostrazione. di piu non saprei che dirti perchè come ho già detto, queste cose il mio prof non le chiedeva.
io quando risolvevo gli esercizi mi veniva richiesto il solo codice che funzionasse. comunque. io ragionerei così (senza sapere cosa si aspetta il tuo professore sugli esercizi). ti scrivi lo pseudocodice che ritieni possa risolvere il problema, e cominci a provare il tuo codice "graficamente" in tutti i vari casi. che ne so, metti stai lavorando su un qualche algoritmo su un albero. ti disegni un albero che presenta tutti i casi particolari che possono capitare (si spera che quelli base non siano necessari). e li disegni e scrivi i passi che esegue il tuo algoritmo su quell'albero e in che modo lo modifica. in questo modo fai sia debug del codice, sia la dimostrazione. di piu non saprei che dirti perchè come ho già detto, queste cose il mio prof non le chiedeva.
"ham_burst":
Quando leggo un problema, ho l'intuizione della soluzione e la relatica tecnica da utilizzare, il più delle volte è corretta. Abbozzo qualche disegno (es flusso) o qualche formula (es progr dinamica), e poi mi blocco.
Ovvero? Non capisco quale sia la tua difficoltà...
"ham_burst":
Vorrei chiedere come voi affrontate un problema da risolvere,
Certo, molto dipende dal problema ma in generale un approccio divide-et-impera (ovvero ridurre in parti) risolve un problema mai affrontato prima. Se c'è un metodo migliore? Forse... ma la cosa non è mai di immediata identificazione: se così fosse, Don Knuth non avrebbe scritto The Art of Computer Programming ma una mini-guida per PC-Mag.
Nella vita reale, l'esperienza poi conta parecchio. [E anche la fantasia. Non so bene come spiegarlo, ma il termine "fantasia" è quello che mi sembra più appropriato.] Certo, per un esame è differente... quindi ti consiglierei (quasi) sempre il divide-et-impera.
"ham_burst":
in che ordine svolgete la risoluzione di un algoritmo,
Anche qui, "it depends". Normalmente un approccio topdown, ma l'esperienza mi ha insegnato ad identificare - a volte, non certo sempre altrimenti sarei un mostro - sotto-problemi che magari potrebbero darti noie in fasi esecutive (test, debug) e allora via, approccio OOP "classico": prima le scatoline e via via le scatole che li contengono, gli scatoloni, la casa.
"ham_burst":
disegnate, scegliete una tecnica, scrivete direttamente lo pseudocodice,
In genere scrivo direttamente in un linguaggio di alto livello; sono C-abituato ma ovviamente "dipende" (sono noioso, ripeto sempre la stessa parolina ma è così); se va fatto in Java... pazienza, lo scriverò in quella schif.. volevo dire nel linguaggio principe del OOP

"ham_burst":
affrontate la dimostrazione matematica....
I miei algoritmi sono auto-evidenti

"giozh":
ti scrivi lo pseudocodice che ritieni possa risolvere il problema, e cominci a provare il tuo codice "graficamente" in tutti i vari casi.
Può anche essere un buon consiglio, ma ha il problema della lentezza se l'algoritmo non è semplice o non lavora su pochi dati (e quindi pochi casi), nel qual caso è ovvio che devi mostrare la correttezza per insiemi di dati e/o domini.
"Rggb":
[quote="ham_burst"]Vorrei chiedere come voi affrontate un problema da risolvere,
Certo, molto dipende dal problema ma in generale un approccio divide-et-impera (ovvero ridurre in parti) risolve un problema mai affrontato prima. [/quote]
Mi sembra un po' troppo semplicistico porla in questi termini. Per utilizzare un approccio divide-et-impera il problema deve essere necessariamente suddivisibile in una serie di "sottoproblemi" indipendenti, cosa non sempre possibile.
Comunque a quanto ho capito ham_burst riesce a trovare l'approccio correto per risolvere il problema, ma non è capace di utilizzarlo per il problema in questione.
Io quindi ti consiglio di fare tanti esercizi*, confrontare le soluzioni e i problemi tra di loro: un prof. non ti chiederà mai all'esame di risolvere un problema aperto, ma piuttosto la soluzione ad un problema che è una piccola variazione di uno già risolto, magari addirittura in classe. Capito quale approccio utilizzare prova a pensare ad un algoritmo che risolve un problema simile a quello assegnato; prova a capire le differenze tra questo e quel problema e in base a queste modifica l'algoritmo.
* o meglio, pochi ma bene (certo tanti ma bene può essere meglio di pochi ma bene): quando guardi le soluzioni (se le hai a disposizione) confronta l'algoritmo che hai pensato tu con quello delle soluzioni, prova ad eseguire quest'ultimo su qualche istanza differente del problema. Quando hai capito perché l'algoritmo funziona ed è corretto intuitivamente prova a darne una dimostrazione di correttezza più formale.
"Deckard":Mi sembra un po' troppo semplicistico porla in questi termini.[/quote]
[quote="Rggb"]Certo, molto dipende dal problema ma in generale un approccio divide-et-impera (ovvero ridurre in parti) risolve un problema mai affrontato prima.
Beh, forse. Ma del resto la domanda era talmente generica...
Inoltre, oltre che al nome del paradosso algoritmico, usualmente si usa la terminologia (divide et impera, et al) anche per la suddivisione del problema in parti o sotto-problemi, soprattutto nella applicazione pratica. Questo è ciò che intendevo, e visto che mi fai venire in mente che trattandosi di esercizi d'esame magari sono andato un po' off, consiglio di usare il tuo consiglio

Grazie dei consigli, sono molto utili.
Si dite bene, che è solo un esame, e l'approccio hai problemi da risolvere nel "mondo reale" è differente; ma se non mi sblocco in questo momento è difficile dopo.
Però come consigliato o fatto esercizi e sbattuto la testa (fa male) quando mi bloccavo e cercavo di continuare...dai è venuto fuori qualcosa.
speriamo in bene...grazie dell'aiuto intanto
Si dite bene, che è solo un esame, e l'approccio hai problemi da risolvere nel "mondo reale" è differente; ma se non mi sblocco in questo momento è difficile dopo.
Però come consigliato o fatto esercizi e sbattuto la testa (fa male) quando mi bloccavo e cercavo di continuare...dai è venuto fuori qualcosa.
speriamo in bene...grazie dell'aiuto intanto

"ham_burst":
Si dite bene, che è solo un esame, e l'approccio hai problemi da risolvere nel "mondo reale" è differente; ma se non mi sblocco in questo momento è difficile dopo.
Nono, non intendevo dire che ti dovevi preparare esclusivamente per l'esame. Sbattere la testa come ti ho detto su problemi di questo genere per esempio può aiutare la tua capacità di ragionamento; innanzitutto nel capire il problema, nel riuscire ad astrarlo e successivamente nel risolverlo tramite un algoritmo. Esattamente ciò che serve nel mondo reale. Intendevo che la maggior parte delle volte si incontrano problemi simili ad altri già risolti da qualcun altro (sia all'esame che "nel mondo reale"). E quindi secondo me questo approccio può risultare molto produttivo.
Se vorrai fare ricerca allora tutto cambia e non saprei neanche se esiste un metodo per trovare la soluzione ad un problema aperto. Non credo che ce ne siano. A parte l'algoritmo di Feynman naturalmente:
Write down the problem.
Think real hard.
Write down the solution.