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?
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?
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 adalah , maka implementasi "naif" akan menjadi
def Fib(n):
if n <= 1:
return 1
else:
return Fib(n-1) + Fib(n-2)
Apa masalahnya? Bahwa jika kita menelepon, katakanlah, Fib(7)
maka kita akhirnya membuat banyak panggilan yang sama berulang-ulang, seperti Fib(4)
(karena Fib(7)
panggilan Fib(6)
dan Fib(5)
, dan Fib(6)
panggilan Fib(5)
dan Fib(4)
, dan kedua kali kita menyebutnya Fib(5)
panggilan Fib(4)
dan Fib(3)
, dan seterusnya).
Jadi di sini solusi yang lebih "canggih", bukan naif, solusi akan seperti pemrograman dinamis dan menghindari semua perhitungan ekstra.
Secara umum, kita dapat menyelesaikan setiap masalah dalam NP tepat waktuoleh brute force , artinya kami secara eksplisit menyebutkan semua kandidat untuk saksi NP, yang memiliki panjang polinomial dalam ukuran input. Dalam konteks ini, metode "periksa setiap solusi yang mungkin" dapat dianggap naif.
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.