Mengekspresikan permutasi sewenang-wenang sebagai urutan operasi (masukkan, pindahkan, hapus)

9

Misalkan saya punya dua string. Panggil mereka dan B . Tidak ada string yang memiliki karakter berulang.SEBUAHB

Bagaimana saya dapat menemukan urutan tersingkat dari memasukkan, memindahkan, dan menghapus operasi yang mengubah menjadi B , di mana:SEBUAHB

  • insert(char, offset)menyisipkan charpada yang diberikan offsetdalam string
  • move(from_offset, to_offset)memindahkan karakter saat ini di offset from_offsetke posisi baru sehingga telah diimbangito_offset
  • delete(offset) menghapus karakter di offset

Contoh aplikasi: Anda melakukan kueri basis data dan menunjukkan hasilnya di situs web Anda. Kemudian, Anda menjalankan kembali kueri basis data dan menemukan bahwa hasilnya telah berubah. Anda ingin mengubah apa yang ada di halaman agar sesuai dengan apa yang ada di database menggunakan jumlah minimum operasi DOM. Ada dua alasan mengapa Anda menginginkan urutan operasi terpendek. Pertama, efisiensi. Ketika hanya beberapa catatan yang berubah, Anda ingin memastikan bahwa Anda melakukan daripada O ( n )HAI(1)HAI(n)Operasi DOM, karena mahal. Kedua, benar. Jika item dipindahkan dari satu posisi ke posisi lain, Anda ingin memindahkan node DOM terkait dalam satu operasi, tanpa menghancurkan dan membuatnya kembali. Kalau tidak, Anda akan kehilangan status fokus, konten <input>elemen, dan sebagainya.

Geoff
sumber

Jawaban:

10

Saya sarankan untuk melihat pada algoritma edit jarak . Alih-alih hanya menghitung jarak, Anda akan ingin mencatat jalur berat minimum Anda melalui array dan mengembalikannya.

Rick Minerich
sumber
5
Bahkan, karena tidak ada pengulangan, ini adalah masalah yang sedikit lebih sederhana yang disebut masalah jarak Ulam. Meskipun Anda dapat menggunakan algoritma edit jarak, ada metode yang lebih cepat yang ditargetkan untuk jarak ini juga: mit.edu/~andoni/papers/ulamSublinear.pdf
Suresh
1
Sunting jarak biasanya tidak mencakup moveoperasi, jadi Anda mungkin harus bervariasi ketika menafsirkan skor.
Raphael