Stavo studiando la programmazione dinamica e ho letto quanto segue:
Spesso quando si utilizza un metodo più ingenuo, molti dei sottoproblemi vengono generati e risolti molte volte.
Che cos'è un metodo ingenuo?
Stavo studiando la programmazione dinamica e ho letto quanto segue:
Spesso quando si utilizza un metodo più ingenuo, molti dei sottoproblemi vengono generati e risolti molte volte.
Che cos'è un metodo ingenuo?
Risposte:
Non è un termine tecnico con un significato preciso, è solo la parola inglese "ingenuo". In un contesto informatico, la parola di solito significa qualcosa del tipo "una delle cose a cui penseresti prima, ma senza realizzare un fatto meno ovvio ma importante".
Ad esempio, se si conosce la definizione dei numeri di Fibonacci è , quindi un'implementazione "ingenua" sarebbe
def Fib(n):
if n <= 1:
return 1
else:
return Fib(n-1) + Fib(n-2)
Qual è il problema? Che se noi chiamiamo, per esempio, Fib(7)
e poi si finisce per fare molte delle stesse chiamate più e più volte, come ad esempio Fib(4)
(in quanto Fib(7)
le chiamate Fib(6)
e Fib(5)
, e Fib(6)
le chiamate Fib(5)
e Fib(4)
, ed entrambe le volte chiamiamo Fib(5)
chiama Fib(4)
e Fib(3)
, e così via).
Quindi qui una soluzione più "sofisticata", anziché ingenua, sarebbe come una programmazione dinamica ed eviterebbe tutti i calcoli degli extra.
In generale, possiamo risolvere ogni problema in NP in tempoper forza bruta , nel senso che enumeriamo esplicitamente tutti i candidati per un testimone NP, che ha un polinomio di lunghezza nella dimensione di input. In questo contesto, il metodo di "controllare ogni possibile soluzione" può essere considerato ingenuo.
L'implementazione ingenua è la soluzione in cui appare semplice e meno complicata possibile.
In alcuni casi, potrebbe non avere un buon comportamento spaziale o temporale, come l'implementazione ingenua della funzione di Fibonacci (esponenziale piuttosto che lineare).
Ma in molti casi, può funzionare bene per la maggior parte del tempo. Quindi nulla è sbagliato nell'approccio ingenuo, puoi farlo in 3 passaggi:
"Make it work" (come richiesto) -> "Make it elegant / beautiful" (refactoring, più leggibile) -> "Make it fast" (ottimizzazione delle prestazioni)
Per linguaggi di programmazione con tradizioni di "ingegneria eccessiva" come Java, consiglierei la "soluzione più semplice" ogni giorno.