【问题标题】:substring search子串搜索
【发布时间】:2011-04-03 16:46:26
【问题描述】:

我最近一直在尝试研究进行子字符串搜索的各种方法,并偶然发现了以下文章http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_string_search_algorithm。我想知道是否还有其他任何人都可以建议/展示的常用/高效算法?

非常感谢

【问题讨论】:

  • 您已经引用了一篇关于算法的文章,该文章本身引用了其他算法,因此您似乎已经至少部分回答了您自己的问题。您是否有任何特定条件或限制,或者您只是对该主题感兴趣?
  • 我觉得主要是找常用的算法

标签: algorithm substring


【解决方案1】:

最明显的是 Boyer-Moore 或某些变体,例如 Boyer-Moore-Horspool。在某些情况下,Knuth-Morris-Pratt 也值得考虑。

【讨论】:

    【解决方案2】:

    如果文本很小,KMP 算法在子字符串搜索中是有效的。 复杂度 O(n)。 为了便于理解 http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

    【讨论】:

      【解决方案3】:

      在我看来,最直观和最容易理解的是Robin Karp Algorithm

      这是一个简单的python实现

      def computeHash(p):
          return sum ([ value*10**index for (index,value) in enumerate(p[::-1]) ])
      
      def getPosition(string,subString):
          kh=computeHash(subString)
          lk=len(subString)
          ans=[]
          for i in enumerate(string):
              if len(string[i[0]:i[0]+lk])<lk:
                  break
              else:
                  if computeHash(string[i[0]:i[0]+lk])==kh:
                      ans.append((i[0],i[0]+lk))
          return ans
      
      def main():
      
          s="hello world" #string
          ss="wor" #sub string
      
          print getPosition(map(ord,s),map(ord,ss))
      
      
      
      if __name__=="__main__":
          main()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2018-01-21
        • 2021-06-28
        • 1970-01-01
        • 2011-09-25
        • 2017-01-01
        • 2012-06-03
        相关资源
        最近更新 更多