Haskell似乎工作得很好,但事实并非如此

时间:2012-12-18 14:18:51

标签: haskell

这是我对Rabin Karp算法的实现。 看起来它基本上都适用。 例如:

rabinKarp“andrew”“画了”= =

rabinKarp“andrew”az“= false

所以这很好,但是,出于某些奇怪的原因,当我这样做时“

rabinKarp“你好”“嗨”

它返回true。 它似乎只发生在这两个单词上,我没有遇到任何其他组合这样做。 非常感谢任何有关它为何发生的反馈。

import Data.Char

hash :: String -> Int
hash [] = -1
hash (x:xs) = (ord x + (hash xs))

rabinKarp :: String -> String -> Bool
rabinKarp [] _ = False
rabinKarp mainString patternString =
    let
     hashPattern = hash patternString
     hashMain = hash (take (length patternString) mainString)
    in if hashPattern == hashMain
    then True
    else rabinKarp (drop 1 mainString) patternString

1 个答案:

答案 0 :(得分:15)

Prelude> fromEnum 'h' + fromEnum 'i'
209
Prelude> fromEnum 'e' + fromEnum 'l'
209

您有哈希冲突。所有哈希函数都给出了哈希冲突的可能性,但是这样一个简单的哈希函数与序数之和有很多冲突。

当你有匹配的哈希时,你仍然需要比较字符串以检查你是否真的有匹配或碰撞。