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} *)