F#:如何计算汉明距离?

时间:2015-03-13 12:50:41

标签: algorithm f#

我是F#的新手。这是我的第一个函数式编程语言。

我想写一个算法来计算两个相等长度的弦之间的汉明距离。如何在F#中这样做?任何由伪代码组成的例子都将非常感激。

2 个答案:

答案 0 :(得分:7)

您可以使用Seq.map2比较相应的值,然后对差异求和:

let hamming s1 s2 = Seq.map2((=)) s1 s2 |> Seq.sumBy(fun b -> if b then 0 else 1)

答案 1 :(得分:3)

也许考虑一下http://davefancher.com/tag/hamming-distance/?或者是否有任何特殊原因导致它无法满足您的要求?从链接页面:

let hammingDistance (source : string) (target : string) =
  if source.Length <> target.Length then failwith "Strings must be equal length"

  Array.zip (source.ToCharArray()) (target.ToCharArray())
  |> Array.fold (fun acc (x, y) -> acc + (if x = y then 0 else 1)) 0

hammingDistance "abcde" "abcde" |> printfn "%i" // 0
hammingDistance "abcde" "abcdz" |> printfn "%i" // 1
hammingDistance "abcde" "abcyz" |> printfn "%i" // 2
hammingDistance "abcde" "abxyz" |> printfn "%i" // 3
hammingDistance "abcde" "awxyz" |> printfn "%i" // 4
hammingDistance "abcde" "vwxyz" |> printfn "%i" // 5