给定一个字母计数表和一个单词列表,使用所有字母查找N个单词

时间:2018-10-30 19:43:16

标签: algorithm time-complexity

我正在寻找一种有效的算法来执行以下操作。

给出字母计数表/词典

counts = {'a': 3, 'b': 2, 'd': 2, 'e': 2, 'k':2, 'r': 2 }

和M个单词的列表

words = ['break, 'add', 'build' ... ]

编写一个使用所有字母(和列表中的单词)查找N个单词的函数

>>> find_words(counts, words, 3)
['break', 'break', 'add']

天真地翻遍所有单词的方法太慢了(我认为是O(m ^ n))。

1 个答案:

答案 0 :(得分:1)

这个问题使人感到很NP。因此,我希望没有真正有效的解决方案。

因此,我建议您尝试将其简化为一个已知问题,然后解决该问题。特别是,您可以将其转换为整数线性规划问题。解决这些问题的方法通常非常好。而且每个your program has undefined behaviour都有一些相对容易使用的数字。

您要解决的特定问题是这个。您正在尝试找到一个m整数x_i的向量,使得0 ≤ x_isum(x_i) ≤ n以及每个字母l等于字母已被使用,不超过您的数量。您要最大化的目标函数是x_i * (1 + len(w_i))的总和,其中w_i是第i个词。

这将始终产生答案。当且仅当目标函数为n加上可用字母数时,您才能获得答案。如果目标函数小于该函数,则不存在解决方案。