我很好奇什么是最有效的算法(或常用的)来计算一大块文本中字符串的出现次数。
从我read开始,Boyer-Moore字符串搜索算法是字符串搜索的标准,但我不确定以有效的方式计算出现次数与搜索字符串是否相同。
在Python中,这就是我想要的:
text_chunck = "one two three four one five six one"
occurance_count(text_chunck, "one") # gives 3.
编辑:似乎python str.count
就是这样一种方法;但是,我无法找到它使用的算法。
答案 0 :(得分:3)
对于初学者,是的,你可以非常有效地完成Boyer-Moore。但是,根据问题的其他一些参数,可能会有更好的解决方案。
The Aho-Corasick string matching algorithm 会在目标字符串中找到所有出现的 set 模式字符串,并且在时间O(m + n + z)中这样做,其中m是要搜索的字符串的长度,n是要匹配的所有模式的组合长度,z是生成的匹配总数。如果您只有一个要匹配的字符串,那么源和目标字符串的大小是线性的。它还会发现相同字符串的重叠出现。此外,如果要检查一组字符串在某些源字符串中出现的次数,您只需要对该算法进行一次调用。除此之外,如果您要搜索的字符串集永远不会更改,您可以将O(n)作为预处理时间,然后在O(m + z)中查找所有匹配项。
另一方面,如果您要搜索一个源字符串和一组快速变化的子字符串,则可能需要使用 suffix tree 。对于要搜索的字符串的O(m)预处理时间,您可以在每个子字符串的O(n)时间内检查长度为n的特定子字符串在字符串中出现的次数。
最后,如果您正在寻找可以轻松编码并轻松编写代码的内容,您可能需要考虑查看 Rabin-Karp 算法,该算法使用roling哈希函数找到字符串。这可以用大约十到十五行代码编码,没有预处理时间,对于普通文本字符串(很多匹配很少的文本)可以很快找到所有匹配。
希望这有帮助!
答案 1 :(得分:1)
Boyer-Moore是计算事件计数的好选择,因为它有一些你只需要做一次的开销。模式字符串越长越好,因此对于“one”来说,它不是一个好的选择。
如果要计算重叠,请在上一次匹配后开始下一个搜索一个字符。如果要忽略重叠,请在上一次匹配后开始下一次搜索完整模式字符串长度。
如果您的语言使用indexOf或strpos方法在另一个字符串中查找一个字符串,则可以使用该字符串。如果它被证明是慢的,那么选择一个更好的算法。
答案 2 :(得分:-1)
Hellnar酒店, 您可以使用简单的字典来计算String中的出现次数。该算法是一种计数算法,这是一个例子:
"""
The counting algorithm is used to count the occurences of a character
in a string. This allows you to compare anagrams and strings themselves.
ex. animal, lamina a=2,n=1,i=1,m=1
"""
def count_occurences(str):
occurences = {}
for char in str:
if char in occurences:
occurences[char] = occurences[char] + 1
else:
occurences[char] = 1
return occurences
def is_matched(s1,s2):
matched = True
s1_count_table = count_occurences(s1)
for char in s2:
if char in s1_count_table and s1_count_table[char]>0:
s1_count_table[char] -= 1
else:
matched = False
break
return matched
#counting.is_matched("animal","laminar")
如果字符串匹配,此示例仅返回True或False。请记住,此算法会计算字符在字符串中显示的次数,这对字谜很有用。