【问题标题】:KMP algorithm implementations in PythonPython中的KMP算法实现
【发布时间】:2019-08-15 09:36:49
【问题描述】:

我见过这种算法的几种实现,例如具有 2 个计数器和迭代前缀的一种或使用递归的一种。但是,我对使用动态编程的理解有些困难。

由于我的知识浅薄,这是我设法想出的:

def sufperf(S):
    Pi = [0 for i in range(len(S))]
    for i in range(1, len(S)):
        p = Pi[i - 1]
        while p > 0 and S[i] != S[p]:
            p = Pi[p-1]
        if S[i] == S[p]:
            p += 1
        Pi[i] = p
    return Pi


def KMP(S, subS):
    NewS = subS + "#" + S
    SuperS = sufperf(NewS)
    k = 0
    for i in SuperS:
        if i == len(subS):
            k += 1
    return k

我很难完全理解 KMP 函数中的逻辑。 有人可以帮忙吗?

【问题讨论】:

  • 你对 S, subS 的输入是什么
  • 我用 S = "abcdaaabcabcaa" 和 subS = "abc", S = "假设你有一个由 99 个数字组成的数组。该数组包含 1 到 100 的数字,但缺少一个数字。描述四种不同的算法来计算缺失数。其中两种应该针对低存储进行优化,其中两种应该针对快速处理进行优化。潜艇=“失踪”
  • KMP 不是基于动态规划的算法

标签: python algorithm


【解决方案1】:

使用有关字符串的知识本质上是所有字符串搜索算法的基础,您已经对字符串有所了解,如果愿意的话,您可以尝试利用这种“启发式”来节省搜索时间。

KMP 特别利用了如果我们知道后缀匹配前缀这一事实。所以在我们在var haystack 中查找var needle 的示例中

String we're looking for (Needle) abczabcd 12345678

String we're looking in (Haystack) abcz abcb a b c d a b c z 1234 5678 9 10 11 12 13 14 15 16 -> indices

我们通过abczabcb,然后我们点击b(干草堆的索引10)而不是d(针的索引8)。

使用来自 KMP 的后缀/前缀规则,我们不必一直回到 b 来搜索 abc,而是可以利用 abcb 具有前缀 abc 的事实,并开始检查b 以查看它是否等于z

不是这样我们可以跳过abczabcb,而不必从索引2、3、4、5、6、7、8中再次搜索我们正在寻找的字符串

我个人非常喜欢BacktoBackSWE的youtube频道,他对KMP的解释非常清晰易懂。

资源:

https://www.youtube.com/watch?v=BXCEFAzhxGY

https://medium.com/@pivincii/pattern-searching-algorithm-knuth-morris-pratt-aka-kmp-algorithm-13f4a9fd968b

另一种字符串搜索算法 Boyer-Moore 使用好后缀和坏字符规则。我提到这一点是因为我认为所有这些字符串匹配算法在它们使用关于字符串的知识的意义上都是相似的,这是一个很好的观察。

wiki 对此进行了进一步的探讨:

https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm#Shift_rules

GeeksForGeeks 对此也有很好的资源:

https://www.geeksforgeeks.org/boyer-moore-algorithm-good-suffix-heuristic/

https://www.geeksforgeeks.org/boyer-moore-algorithm-for-pattern-searching/

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2018-05-10
    相关资源
    最近更新 更多