【问题标题】:Efficient "Sequence allignment" comparing two lists of sets to find matches - python有效的“序列对齐”比较两个集合列表以查找匹配项 - python
【发布时间】:2020-03-20 17:06:57
【问题描述】:

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

给出了两个长度不同的列表,并且每个位置的大小设置可能不同。集合的大小在 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} 在 list_1 的索引 1 和 {75, 37} 在list_2 的索引 0 与 {42, 31} 在 list_1 的索引 2 和 {42, 37}在 list_2 的索引 1 处给出计数 2,因为我们有两个匹配项。对于上面的例子,输出数组应该是这样的

sequence_alligenment(list_1,list_2): [0,2,0,1]

列表的顺序很重要,因为我试图找到重叠最大的时间点。

由于围绕它们的一些笨拙的 for 循环,我一直在尝试使用 set 和 freezesets 的交集,但运气不佳。

【问题讨论】:

    标签: python algorithm sequence


    【解决方案1】:

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

    【讨论】:

    • 你可以提供一个解决方案 - 到目前为止,它更多的是评论,然后是对 OP 问题的正确回答;)蛮力解决方案也是一种解决方案;)
    • 解决方案..在我看来只是蛮力。就那么简单。由于尺寸非常小,因此该解决方案没有更好的解决方案。
    【解决方案2】:

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

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

    如果这不是您想要的,您可以尝试做一个反向索引,例如: {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)。

    【讨论】:

      【解决方案3】:

      查找 Smith-Waterman 算法。这是一种 DP 算法,用于局部对齐不同长度的序列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        相关资源
        最近更新 更多