Seorang kolega yang bekerja pada pemrograman genetika menanyakan kepada saya pertanyaan berikut. Saya pertama kali mencoba menyelesaikannya berdasarkan pendekatan serakah, tetapi pada pemikiran kedua, saya menemukan contoh tandingan terhadap algoritma serakah. Jadi, saya pikir layak disebutkan di sini.
Pertimbangkan dua polinomial yang diwakili oleh pohon ekspresi mereka. Misalnya, dan diilustrasikan di bawah ini:
Aturan:
- Setiap node adalah nama variabel ( ), angka , atau operasi (+, -, ×).
- Traversal berurutan pohon harus menghasilkan polinomial yang valid.
- Node operasi memiliki derajat 2. Node lain memiliki derajat 0. Semua node memiliki derajat 1 (kecuali root, yang derajatnya 0).
Pada simpul N dari pohon, tentukan operasi dasar sebagai berikut:
- Operasi dasar dapat mengubah label node. Misalnya, dapat diubah menjadi 3, atau + dapat diubah ke .
- Operasi dasar dapat membangun pohon ekspresi di atas N (lihat contoh di bawah).
Biaya operasi dasar tipe 1 adalah 1. Biaya untuk tipe 2 sama dengan jumlah operasi {+, -, ×} di pohon ekspresi yang baru dibangun.
Contoh untuk tipe 2: Biaya operasi dasar berikut adalah 2, karena pohon ekspresi dibangun di atas simpul N menggunakan dua operasi (- dan ×).
Biarkan T1 dan T2 menjadi dua pohon ekspresi yang mewakili polinomial. Tentukan jarak T1 dan T2 sebagai berikut: biaya minimum operasi dasar untuk mengkonversi T1 ke T2. Perhatikan bahwa kami tidak memerlukan pohon yang dikonversi untuk memiliki struktur yang sama dengan T2. Kami hanya ingin menghitung polinomial yang sama dengan T2. (Lihat komentar sebagai contoh.)
Masalahnya: Diberikan T1 dan T2, sajikan algoritma yang menghitung jaraknya.
Contoh 1: Misalkan T1 dan T2 adalah dua pohon yang diilustrasikan di awal posting ini. Untuk mengonversi pohon kanan ke pohon kiri, seseorang dapat membangun pohon biaya 3 di atas ×, dan mengubah 4 ke 1 (total biaya adalah 4).