现在,我的程序花费超过10分钟LOL尝试显示可以从给定字母创建的所有可能的单词(如果这些单词在文件中)。在该文件中,它有超过4000多个单词 如何通过使用递归使我的程序运行得更快,而不是使用任何库,因为我是新手。
if user input letters: b d o s y
然后它会查找该文件中的所有可能单词来创建:
b
d
boy
boys
by
代码:
words = set()
def found(word, file):
## Reads through file and tries
## to match given word in a line.
with open(file, 'r') as rf:
for line in rf.readlines():
if line.strip() == word:
return True
return False
def scramble(r_letters, s_letters):
## Output every possible combination of a word.
## Each recursive call moves a letter from
## r_letters (remaining letters) to
## s_letters (scrambled letters)
if s_letters:
words.add(s_letters)
for i in range(len(r_letters)):
scramble(r_letters[:i] + r_letters[i+1:], s_letters + r_letters[i])
thesarus = input("Enter the name of the file containing all of the words: ")
letters = input("Please enter your letters separated by a space: ")
word = ''.join(letters.split(' '))
scramble(word, '')
ll = list(words)
ll.sort()
for word in ll:
if found(word, thesarus):
print(word)
答案 0 :(得分:0)
您的程序运行缓慢,因为您的算法效率低下。 由于您在问题中需要使用递归(以生成所有可能的组合),因此至少可以改进您在文件中搜索的方式。
您的代码打开文件并搜索单个单词,为每个单词读取它。这是非常低效的。
我想到的第一个解决方案是读取文件一次并将每个单词保存在set()
words_set = {line.strip() for line in open('somefile')}
或者(简洁)
words_set = set()
with open('somefile') as fp:
for line in fp:
words_set.add(line.strip())
然后,你就这样做了
if word in words_set:
print(word)
我认为可以有更有效的方法来完成整个程序,但它们不需要递归。
为了便于讨论,我认为提供更好的算法可能是有用的。
除了文件中针对每个单词的低效搜索之外,您的代码还会生成所有可能的组合,即使这些组合不太可能是字典的一部分。
更好的解决方案是以更有效的方式存储单词,这样可以更容易地判断特定组合是否存在。例如,您不希望访问(在文件中)由用户提供的列表中不存在的字符组成的所有单词。
我认为有一种数据结构对这类问题非常有效:trie(或前缀树)。此数据结构可用于存储所有同义词库文件,而不是我上面建议的集合。
然后,您只需访问具有所有可能字母的树,而不是生成所有可能的字母组合,以找到所有可能的有效字词。
因此,例如,如果您的用户输入h o m e x
并且您的同义词库中没有以x
开头的单词,则不会生成以x
开头的所有排列,例如xe,xo,xh,xm等,节省了大量的计算。