Saya sedang meneliti pemrograman dinamis dan membaca yang berikut:
Seringkali ketika menggunakan metode yang lebih naif, banyak dari subproblem yang dihasilkan dan dipecahkan berkali-kali.
Apa itu metode naif?
terminology
dynamic-programming
chopper draw lion4
sumber
sumber
Jawaban:
Ini bukan istilah teknis dengan makna yang tepat, itu hanya kata bahasa Inggris "naif". Dalam konteks ilmu komputer, kata itu biasanya berarti sesuatu seperti "salah satu hal yang akan Anda pikirkan pertama kali, tetapi tanpa menyadari fakta yang kurang jelas tetapi penting".
Misalnya, jika seseorang tahu definisi angka Fibonacci adalahF i b (n)= F i b (n-1)+ F i b (n-2) , maka implementasi "naif" akan menjadi
Apa masalahnya? Bahwa jika kita menelepon, katakanlah,
Fib(7)
maka kita akhirnya membuat banyak panggilan yang sama berulang-ulang, sepertiFib(4)
(karenaFib(7)
panggilanFib(6)
danFib(5)
, danFib(6)
panggilanFib(5)
danFib(4)
, dan kedua kali kita menyebutnyaFib(5)
panggilanFib(4)
danFib(3)
, dan seterusnya).Jadi di sini solusi yang lebih "canggih", bukan naif, solusi akan seperti pemrograman dinamis dan menghindari semua perhitungan ekstra.
sumber
Secara umum, kita dapat menyelesaikan setiap masalah dalam NP tepat waktu2poli ( n ) oleh brute force , artinya kami secara eksplisit menyebutkan semua kandidat untuk saksi NP, yang memiliki panjang polinomial dalam ukuran inputn . Dalam konteks ini, metode "periksa setiap solusi yang mungkin" dapat dianggap naif.
sumber
Implementasi naif adalah solusi di mana ia terlihat langsung dan tidak sesulit mungkin.
Dalam beberapa kasus, mungkin tidak memiliki ruang atau perilaku waktu yang baik, seperti implementasi fungsi Fibonacci yang naif (eksponensial daripada linier).
Tetapi dalam banyak kasus, ini dapat bekerja dengan baik sebagian besar waktu. Jadi tidak ada yang salah dengan pendekatan naif, Anda dapat melakukannya sebagai 3 langkah:
"Jadikan berhasil" (seperti yang diminta) -> "Jadikan elegan / cantik" (refactoring, lebih mudah dibaca) -> "Jadikan cepat" (pengoptimalan kinerja)
Untuk bahasa pemrograman dengan tradisi "over-engineering" seperti Java, saya akan merekomendasikan "solusi paling sederhana" setiap hari.
sumber