下面是对goalPost移动的一个响应(“我可能需要regex,因为在不久的将来我将需要单词分隔符”):
此方法解析文本一次,以获得所有“单词”的列表。每个单词都会在目标单词的字典中查找,如果是目标单词,则对其进行计数。所用的时间是O(P)+O(T),其中P是段落的大小,T是目标单词的数量。迄今为止,除我的Aho Corasick解决方案外,所有其他解决方案(包括当前接受的解决方案)均为O(PT)。在def counts_all(targets, paragraph, word_regex=r"\w+"):
tally = dict((target, 0) for target in targets)
for word in re.findall(word_regex, paragraph):
if word in tally:
tally[word] += 1
return [tally[target] for target in targets]
def counts_iter(targets, paragraph, word_regex=r"\w+"):
tally = dict((target, 0) for target in targets)
for matchobj in re.finditer(word_regex, paragraph):
word = matchobj.group()
if word in tally:
tally[word] += 1
return [tally[target] for target in targets]
findall版本比strawman版本慢得多。在
以下是当前接受的解决方案,它以标准化的形式表示,并添加了单词分隔符:
^{pr2}$
它在关闭时会越界,可能会减少到:# acknowledgement:
# this is structurally the same as one of hughdbrown's benchmark functions
def currently_accepted_solution_augmented_without_extra_closure(targets, paragraph):
def tester(x):
return len(re.findall(r"\b" + x + r"\b", paragraph))
return map(tester, targets)
目前接受的解决方案的所有变化都是O(PT)。与当前接受的解决方案不同,带有单词分隔符的regex搜索并不等同于简单的paragraph.find(target)。因为在本例中,re引擎不使用“快速搜索”,添加单词分隔符会将其从slow更改为非常slow。在