我试图用这个例子以外的东西,但我认为这是最简单的解释。
假设你有一系列潜在的项目,并想知道它是否存在于已知的解决方案列表中。

    solutions = ['GAT','CAT','GCT']

你有潜力:
    potentials = [['G','T'],['T','A'],['T']]

这样你就能确定服贸总协定是唯一可以从潜力中创造出来的解决方案。
以及
你想找到所有可能的解决方案
    potentials = [['G','C','A','T'],['G','C','A','T'],['G','C','A','T']]

会返回“['GAT'、'CAT'、'GCT'”,因为所有的解决方案都可以从潜能中得到。
我当前的解决方案只是使用连接构建所有组合,然后进行交叉。
因为下一步,一个理想的解决方案实际上会返回一个“解决方案”,这样每个项目的可行选项都会输出如下:
    solutions = ['GAT','CAT','GCT']
    potentials = [['G','C','A','T'],['G','C','A'],['A','T']]
    imaginaryfunction(potentials, solutions)

将返回:
     [['G','C'],['C','A'],['T']]

如果这很重要的话,在我的现实世界中,有30个“字母”,而潜在列表中的任何一个项目都可能有多达8个“字母”。解决方案列表是大约2000个三个字母的组合。在一个理想的世界里,只有一种组合是可行的,但更典型的是有4种或5种,有可能但极不可能有2000种都是可能的。
我做了一些非常疯狂的实验,从连接到从每个组合中生成一个基数30的数字,这样我就可以检查这个数字是否在列表中,再把所有的解决方案分解成一个字典,看看是否有条目。
我的代码循环了100万次,如果不是数百万次的话,那么即使是很小的收益也会很快地积累起来。
编辑/附加信息:
有好几个地方用这个。我正在与一个研究药物相互作用模拟的小组合作,他们正在研究可能是连接点/结合点的链。
它还用于一家公司,做那些“个人设计师会挑选你的衣柜”每月盒。(在这种情况下,第一组可能是XS、S、M、L、L t、XL、XXL,第二组是红、绿、蓝、黑、白,第三组是袖长)(他们实际上没有人挑选盒子里的东西)
同样的代码块也在我的NGram分析代码中。
约会应用程序中的代码块与种族、性别、年龄、收入相同

最佳答案

由于你的一组解与理论上可能的组合数(30^8的顺序)相比非常小(2000),我认为这样的方法可以工作:

solutions = get_possible_solutions()
for i, pset in enumerate(potentials):
    matching_solutions = []
    for sol in solutions:
        if sol[i] in pset:
            matching_solutions.append(sol)
    solutions = matching_solutions # Remove non-matches

此解决方案使用“字符串”项中当前字母的电位迭代筛选可能的解决方案。
每次迭代的内部循环都会变小,所以这有可能非常快。
它至少应该比在所有可能的解和输入解之间进行显式交集快得多。

10-07 13:03
查看更多