我正在尝试比较两个集合列表(或列表列表),并且努力寻找有效的解决方案。
给出两个列表,每个列表的长度不同,并且每个位置的大小集可能不同。集合的大小在1-6个整数之间,列表的大小对于较大的元素大约为4000个元素,对于较小的元素为100个元素。
list_1= [{42, 189, 31}, {32, 75, 189}, {42, 31}, {100, 63}, {75, 37}]
list_2=[{75, 37}, {42, 37}]
然后我想在数组中找到两个列表之间最大重叠的点,并计算每个集合之间的交点中有多少个元素。
在这种情况下,最佳对齐方式是在list_1 [1:3]上,其中有两个重叠元素
{32, 75 ,189}在列表_1的索引1和 {75 ,37} list_2的索引0结合list_1的索引2的{ 42 ,31}和{ 42 ,37}因为我们有两个匹配项,所以list_2的索引1处的计数为2。对于上面的示例,输出数组应该像这样
sequence_alligenment(list_1,list_2): [0,2,0,1]
列表的顺序很重要,因为我试图找到重叠最大的时间点。
我一直在尝试使用集和冻结集的交集,因为它们周围有些笨拙的for循环,因此运气不佳。
答案 0 :(得分:0)
这不是一个很常见的问题。我认为最有效的方法就是反复进行。使代码简单将很简单。不是最有效的方法,但是我看不到更好的解决方案。
答案 1 :(得分:0)
如果您需要效率(如果您需要大量使用此代码,并且有时需要等待一段时间),则可以使用模糊匹配算法。
大多数模糊匹配算法似乎都针对字符串,但是它们可能是一个起点。
如果这不是您想要的,则可以尝试进行反向索引,例如: {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},37:{75、37}}
然后计算以这种方式在任意两对之间获得多少重复。我相信那样会是O(n)。
答案 2 :(得分:0)
查找Smith-Waterman算法。这是用于局部比对不同长度序列的DP算法。