1

Boyer Moore アルゴリズムの実装に取り​​組んでいます。数時間後に期限が切れるのに、この厄介なシフトの部分が機能しません。1 対 1 の一致、つまり boyerMoore "hello" "hello" がある場合に機能します。

ただし、「ほわれよう」「あれ」には通用しません。

私の問題は、ifs のある boyMoore エリア内にあるとほぼ確信しています。

それは、shift メソッドではなく、boyerMoore 関数自体にあると確信しています。私はそれを正しい方法で呼んでいるのか、それとも何かを見過ぎているのか疑問に思っていますか? どんな助けにも感謝します。また、今日は多くの質問をして申し訳ありません。これが最後の課題なので、この課題を終わらせてください。

boyerMoore :: String -> String -> Bool
boyerMoore [] _ = False
boyerMoore mainString patternString =
    let 
    patternLength = (length patternString)
    position = getPosition patternString (take patternLength(mainString))
    in if (mainString == patternString)
        then True
        else
                if position > -1
                then boyerMoore (patternString) (drop position(mainString))
                else boyerMoore (patternString) (drop patternLength(mainString))

getPosition :: String -> String -> Int
getPosition [] _ = -1
getPosition mainString patternString = shift patternString mainString (length patternString)

shift :: String -> String -> Int -> Int
shift [] _ _ = -1
shift textString patternString lengthVariable =
    if (last patternString) == (last textString)
    then lengthVariable - (length patternString)
    else shift (init patternString) textString lengthVariable
4

1 に答える 1

3

boyerMooreスタートの最終方程式

boyerMoore mainString patternString =

しかし、最後の再帰呼び出しはどちらも次の形式です

boyerMoore patternString (drop foo mainString)

patternStringボイヤー・ムーアについての私の知識はさび付いていますが、あなたがそのように交換したいとは思えませんmainString

次に、リンク先のページのlast()関数を Haskell の関数と混同している可能性があると思います。与えられたリストの最後の要素を返しますが、last()は、表記法にかかわらず、2 つの引数を取ります: 検索する文字と、検索するパターン文字列です。lastlast

于 2012-12-19T09:46:08.120 に答える