生成字谜的最有效(就时间而言)算法是啥?
Posted
技术标签:
【中文标题】生成字谜的最有效(就时间而言)算法是啥?【英文标题】:What could be the most efficient(in terms of time) algorithm to generate anagrams?生成字谜的最有效(就时间而言)算法是什么? 【发布时间】:2017-10-28 06:52:00 【问题描述】:以下是我想出的用于查找给定字符串的字谜的代码,但是当字符串非常大时,我发现这真的很慢。我可以做些什么来加快速度吗?是否有另一种算法可以使这种操作快速进行?
def combinate(stri, comb,n,li):
if stri == "":
if comb not in li:
li.append(comb)
return
for sdx, s in enumerate(stri):
combinate(stri[0:sdx] + stri[sdx + 1:], comb+s,n)
【问题讨论】:
您用四个参数定义combinate
,但用三个参数调用它。而且您永远不会使用其中一个论点 (n
)。所以我不明白你怎么能测试它。另外,大概第二个参数是一个字符串;那你为什么觉得有必要copy.deepcopy
呢? if X==False:return
到底有什么意义? (为什么不if X: return
?)。但这些都是小细节。主要问题是唯一性检查的二次时间复杂度。
@rici 关键是要中断递归。为了避免混淆,我没有提到它。这个算法有效,我只是在寻找一种跑得更快的方法。
1.简单的答案:使用集合而不是列表进行唯一性检查。 2. 更好的答案:使用不会产生重复的算法。另外:我相信算法有效,但代码无效。
【参考方案1】:
对字符串和可能的字谜中的字符进行排序并比较排序后的版本。
"task": "akst"
"skat": "akst"
请注意,键“akst”上的字典条目可能包含字谜列表作为值
【讨论】:
【参考方案2】:如果您正在寻找“最有效”的时间复杂度,请获取每个术语并将其字符排序,然后将它们存储在(多值)映射中。给定一个您想为其查找字谜的单词,同样对其字符进行排序,并在地图中查找相应的条目。尽管预计算在总项数中是线性的,但每次查找的时间为 O(1)。
我认为可以肯定地说这是可能的最佳时间复杂度,但您可能希望以不同的方式处理多单词字谜 - 对于多个单词的组合执行此操作可能是不切实际的(预计算将非常大),因此您可能希望一次构建一个字谜。
【讨论】:
以上是关于生成字谜的最有效(就时间而言)算法是啥?的主要内容,如果未能解决你的问题,请参考以下文章