データ構造及びアルゴリズム:文字列マッチング(A)BF / RK

1.BFアルゴリズム

暴力マッチングは、また、単純なマッチングアルゴリズムの効率が低いと呼ばれる。
A内のルックアップ列B、Aは、Bは、パターン文字列(長さm)、メインストリング(N-長)である。初期のアルゴリズムは、メインストリームにチェックすることですそれぞれの位置0,1,2,...,n-mとMの長さn-m+1のサブストリング

例えば、2つの文字列の類似性は高いですが、それはしばしばあるため、アルゴリズムエンジニアリングに使用されています

  • ほとんどの場合、二つの文字列の長さが長すぎるではない、と比較プロセス、そうでない場合は早期終了
  • アイデアはあまりエラーが発生しやすく、簡単です

時間計算量:O(N×m個)

# coding:utf-8



class Bf(object):
    """
    字符串匹配: BF算法(暴力匹配)
    """

    def match(self, string1: str, string2: str):
        """
        :param string1: 主串
        :param string2: 模式串
        :return:
        """
        n = len(string1)
        m = len(string2)
        loop_nums = n - m + 1
        for i in range(loop_nums):
            for j in range(m):
                if string1[i] == string2[j]:
                    i += 1
                    continue
                else:
                    break
            else:
                return True
        return False


if __name__ == "__main__":
    bf = Bf()
    assert bf.match("abcabc", "ca") == True
    assert bf.match("abcabc", "bc") == True
    assert bf.match("abcabc", "cc") == False
    assert bf.match("abcabc", "cab") == True
    assert bf.match("abcabc", "cb") == False

2.RKアルゴリズム

ハッシュアルゴリズムBFアルゴリズムの導入は、アップグレードされたバージョンです。

それぞれ、メインストリングのハッシュアルゴリズムによってn-m+1ハッシュ値がハッシュ衝突に起因するエラーを回避するために非常に速く、数あるため、ハッシュ値をサブストリング。、最終的なハッシュ値とパターン文字列の比較が必要とされます、 2つの文字列が再び比較マッチした文字列自体に等しい場合

最適化:常に、このような2つのハッシュ値がハッシュ値計算の残りを行かなければならないときには、ハッシュコントラストを計算し続けます。

時間複雑:O(n)は、

# coding:utf-8



class Rk(object):
    """
    字符串匹配: Rk算法, 借助hash算法实现
    此处假设只有字母和数字
    """

    def hash_func(self, string):
        """
        求string的ascii的和为hash函数
        :param string:
        :return:
        """
        return sum([ord(i) for i in string])

    def match(self, string1: str, string2: str):
        """
        :param string1: 主串
        :param string2: 模式串
        :return:
        """
        n = len(string1)
        m = len(string2)
        loop_nums = n - m + 1

        target_value = self.hash_func(string2)

        for i in range(loop_nums):
            tmp_string = string1[i:i + m]
            tmp_value = self.hash_func(tmp_string)
            if tmp_value == target_value:
                # 防止hash冲突, 二次确认, 如果一致返回True
                if tmp_string == string2:
                    break
        else:
            return False
        return True


if __name__ == "__main__":
    bf = Rk()
    assert bf.match("abcabc", "ca") == True
    assert bf.match("abcabc", "bc") == True
    assert bf.match("abcabc", "cc") == False
    assert bf.match("abcabc", "cab") == True
    assert bf.match("abcabc", "cb") == False

データ

  • データ構造とアルゴリズム - WANG鄭

おすすめ

転載: www.cnblogs.com/zlone/p/11610677.html