Saya memiliki masalah pengoptimalan yang ingin saya selesaikan. Anda memiliki semacam struktur data:
data Foo =
{ fooA :: Int
, fooB :: Int
, fooC :: Int
, fooD :: Int
, fooE :: Int
}
dan fungsi peringkat:
rateFoo :: myFoo -> Int
Saya harus mengoptimalkan hasil rateFoo
dengan mengubah nilai di struct. Dalam kasus khusus ini, saya memutuskan untuk menggunakan penelusuran mendalam berulang untuk memecahkan masalah tersebut. Pohon pencarian (tak terbatas) untuk pengoptimalan terbaik dibuat oleh fungsi lain, yang hanya menerapkan semua kemungkinan perubahan secara rekursif ke pohon:
fooTree :: Foo -> Tree
Fungsi pencarian saya terlihat seperti ini:
optimize :: Int -> Foo -> Foo
optimize threshold foo = undefined
Pertanyaan yang saya miliki sebelum saya mulai adalah ini:
Karena pohon dapat dihasilkan oleh data di setiap titik, mungkinkah hanya bagian pohon yang dihasilkan, yang saat ini diperlukan oleh algoritme? Apakah mungkin untuk membebaskan memori dan pohon dibuat ulang jika diperlukan untuk menghemat memori (Cuti pada level n dapat dihasilkan di
O(n)
dan n tetap kecil, tetapi tidak cukup kecil untuk memiliki seluruh pohon di memori seiring waktu)?Apakah ini sesuatu yang dapat saya harapkan dari runtime? Bisakah ekspresi tidak dievaluasi waktu berjalan (mengubah ekspresi yang dievaluasi menjadi ekspresi yang tidak dievaluasi)? Atau peretasan kotor apa yang harus saya lakukan untuk ini?