python – 广度优先搜索三个字母的单词
作者:互联网
我在Python中使用广度优先搜索算法来找到从三个字母单词到另一个单词的最短“路径”.我有它的工作,但表现是可怕的,我怀疑我的话儿童生成功能.
基本上,对于从队列中弹出的每个单词,我都会生成所有其他三个字母的单词,这些单词可以通过交换一个字母来形成.该功能的工作方式如下:
#Pseudo code
For each position (1-3)
For each letter (a-z)
create a new word by exchanging the letter at the position
if this word is a valid word and is not used earlier
add it to the return list
return the list
这通常需要大约0.03秒.
有更快的方法吗?
解决方法:
如果你想重新发明轮子,也许这会有所帮助(N.B.这已经设置了文字所以至少需要Python 2.7):
from collections import defaultdict
WORDS = {'cat', 'hat', 'sat', 'car', 'cad', 'had', 'pad', 'pat', 'can', 'man'}
D1 = defaultdict(set)
D2 = defaultdict(set)
D3 = defaultdict(set)
for w in WORDS:
D1[w[:2]].add(w)
D2[w[0]+w[2]].add(w)
D3[w[1:]].add(w)
def follows(w):
followers = set(D1.get(w[:2]).union(D2.get(w[0]+w[2]), D3.get(w[1:])))
followers.discard(w)
return followers
for w in WORDS:
print(w, follows(w))
标签:python,graph,breadth-first-search 来源: https://codeday.me/bug/20190531/1188387.html