Membandingkan dua string - pengoptimalan kode
Oct 04 2020
Saya ingin membandingkan dua string dengan menghitung berapa banyak karakter umum yang mereka miliki pada posisi yang sama - tetapi secara keseluruhan dalam semua kemungkinan keselarasan kedua string.
SeedRandom[1]
str1 = RandomInteger[{1, 26}, 90] /.
Thread[Range[26] -> CharacterRange["A", "Z"]] // StringJoin
str2 = RandomInteger[{1, 26}, 850] /.
Thread[Range[26] -> CharacterRange["A", "Z"]] // StringJoin
fu[x_, y_] :=
Module[{par = Partition[Characters[y], StringLength[x], 1, {1, 1}]},
Count[Flatten[(Transpose[{#, Characters[x]}] & /@ par), 1], {z_, z_}]
]
fu[str1, str2] // Timing
(*{0.046875, 3013}*)
Ini berarti string str1dan str2memiliki 3013karakter umum secara total di semua kemungkinan perataan.
Bisakah itu dilakukan dengan lebih efisien, mungkin tanpa mengubah string menjadi daftar?
Jawaban
Coolwater Oct 04 2020 at 02:38
Ada
fu3 = Dot @@ Lookup[#, Union @@ Keys[#], 0] &[Counts@*ToCharacterCode /@ {#, #2}] &;
Last@Table[fu[str1, str2], {100}] // RepeatedTiming
Last@Table[fu3[str1, str2], {100}] // RepeatedTiming
(* {2.3, 3013} *)
(* {0.0029, 3013} *)
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'