Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“高效”;“序列对齐”;比较两个集合列表以查找匹配项-python_Python_Algorithm_Sequence - Fatal编程技术网

“高效”;“序列对齐”;比较两个集合列表以查找匹配项-python

“高效”;“序列对齐”;比较两个集合列表以查找匹配项-python,python,algorithm,sequence,Python,Algorithm,Sequence,我正在尝试比较两个列表集(或列表列表),并且正在努力寻找一个有效的解决方案 给出了两个不同长度的列表,每个位置可能有不同的大小集。集合的大小在1-6个整数之间,列表的大小大约为4000个元素(较大的)和100个元素(较小的) list_1= [{42, 189, 31}, {32, 75, 189}, {42, 31}, {100, 63}, {75, 37}] list_2=[{75, 37}, {42, 37}] 然后,我想找到数组中两个列表之间重叠最大的点,并计算每个集合的交集中有多少个

我正在尝试比较两个列表集(或列表列表),并且正在努力寻找一个有效的解决方案

给出了两个不同长度的列表,每个位置可能有不同的大小集。集合的大小在1-6个整数之间,列表的大小大约为4000个元素(较大的)和100个元素(较小的)

list_1= [{42, 189, 31}, {32, 75, 189}, {42, 31}, {100, 63}, {75, 37}]
list_2=[{75, 37}, {42, 37}]
然后,我想找到数组中两个列表之间重叠最大的点,并计算每个集合的交集中有多少个元素

在这种情况下,最好的对齐方式是在列表_1[1:3]处,其中有两个重叠的元素

{32,75,189}在列表1的索引1处,以及列表2的索引0处,{75,37}与列表1的索引2处的{42,31}和列表2的索引1处的{42,37}结合使用计数2,因为我们有两个匹配项。对于上面的示例,输出数组应该如下所示

sequence_alligenment(list_1,list_2): [0,2,0,1]
列表的顺序很重要,因为我试图找到重叠最大的时间点


我一直在尝试使用集合和冻结集合的交集,但运气不好,因为它们周围有一些笨拙的for循环。

这不是一个很常见的问题。我认为最有效的方法是迭代。使代码简单是最简单的。不是最有效的,但我看不到更好的解决方案。

如果您需要效率(如果您需要大量使用此代码,并且有时需要等待),您可能会使用模糊匹配算法

大多数模糊匹配算法似乎是针对字符串的,但它们可能是一个起点

如果这不是您想要的,您可以尝试执行反向索引,如: {42:{42,189,31},189:{42,189,31},31:{42,189,31},32:{32,75,189},75:{32,75,189},189:{32,75,189},42:{42,31},31:{42,31},100:{100,63},63:{100,63},75:{75,37}


然后数一数,通过这种方式,在任意两对之间可以得到多少个副本。我相信那样会是O(n)。

查找史密斯-沃特曼算法。这是一种用于局部对齐不同长度序列的DP算法

然后你可以提供一个解决方案——到目前为止,它更多的是一个评论,然后是对OP问题的正确回答;)暴力解决方案也是一种解决方案;)解决办法。。在我看来,这只是蛮力。就这么简单。鉴于尺寸非常小,此解决方案没有更好的解决方案。