Vergleich zweier Zeichenfolgen - Codeoptimierung

Oct 04 2020

Ich möchte zwei Zeichenfolgen vergleichen, indem ich zähle, wie viele gemeinsame Zeichen sie an derselben Position haben - aber insgesamt in allen möglichen Ausrichtungen der beiden Zeichenfolgen.

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

Dies bedeutet, dass Zeichenfolgen str1und in allen möglichen Ausrichtungen insgesamt gemeinsame Zeichen str2haben 3013.

Kann es effizienter gemacht werden, vielleicht ohne Strings in Listen umzuwandeln?

Antworten

Coolwater Oct 04 2020 at 02:38

Es gibt

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