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