在算法上有效地“完成”一个集合

2024-06-17 18:12:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个小玩具问题困扰着我。我认为它相当于任何数量的同等问题的更严重性。不,这不是家庭作业或面试问题。。。不过,如果我觉得自己知道一个可证明的最佳解决方案,我可能会在某个时候用它来采访人们。你知道吗

我学习了超元音这个词(形容词描述一个单词或短语,其中包含五个元音a,E,I,O和U,正好一次)。例如“问号”,“双灵巧”,当然还有“超人声”。你知道吗

我编写了一个小Python程序来识别超元音单词。这很简单,它的核心是:

matches = {}
for w in words:
    pat = tuple(w.count(v) for v in vowels)
    if pat in matches:
        matches[pat].add(w)
    else:
        matches[pat] = {w}

words只是来自我拥有的一个大单词列表(SOWPODS拼字词典,大约有270k个单词)。我可以简单地用matches[(1,1,1,1,1)]来识别超元音单词。。。i、 每个元音只有一个的单词是什么。FWIW,vowels在这里是技术上可配置的,所以我的小脚本可以为字符的任何子集(和任何单词列表)做同样的事情。你知道吗

我的问题是我想找到所有的超人声音域。字数是1克。什么2克,3克,等等,也构成了超元音短语。事实证明,我有175个单词没有AEIOU;所以从技术上讲,这些单词的powerset的每个元素都可以附加到每个不包含它们的ngram中。太多了。你知道吗

但是忽略每个“填充”超元音短语的2^175个额外变体,我如何组合计数元组。在元音数量方面有很多等价词,所以当然有很多组合,例如:

pat: (1, 0, 1, 0, 0); numwords: 5499
pat: (0, 1, 0, 1, 1); numwords: 2703

因此,从第一组和第二组中抽取任何一个都是合格的。那是14863797 2克。事实上,两倍的数量,因为任何一个命令是罚款。你知道吗

让我们也假设我已经抛出了每一个模式与任何元素超过一个,这将是不能包括在任何超元音短语的话,因为他们太“元音丰富”都是自己的。你知道吗

我可以通过肉眼看到,(1, 0, 1, 0, 0)(0, 1, 0, 1, 1)是互补的模式,它们一起将“填充”元音空间(或者问题的一般版本中元素的任何空间)。对于任意长度的元组,如何找到所有N个大小的元组集合,这些元组将组合为“填充元组”(但不作为过度填充元组)?你知道吗

从本质上说,尽管有了引导,我的问题是找到这些互补的N大小的元组集合。。。以最有效的方式实现任意元组长度,而不仅仅是长度5。尽管我更喜欢Python,我的简短代码片段就是这样,但这个问题应该适用于几乎所有的编程语言。你知道吗


Tags: in元素列表for数量模式单词元组