对齐有序列表和无序列表的重叠

时间:2011-01-26 19:02:58

标签: algorithm math data-structures set

我正在寻找一种能够在给定有序元素列表和无序元素列表的情况下查找/分配顺序和重叠的算法。 (其中可能存在或可能不存在重叠)。

对于这个例子,我将使用整数,但它们也可以是人名,ID代码等.IE数量不能用于解决实际问题,但有助于解释我使用有序集的问题(1,2,3,4,5,6,7,8,9,10)作为圣杯回答。

输入:

有序清单:(1,2,3,4),(8,9,10),(3,4,5)

UnOrdered List of Lists:(3,4,2),(6,4,5,7),(10,9)

关于如何在脑海中执行此算法的思考过程:

  1. 列表3,4,5和1,2,3,4是有序的,共有3,4个,因此2个有序列表重叠形成:1,2,3,4,5按此顺序。
  2. 无序列表3,4,2是有序列表1,2,3,4,5的子集,因此它可以重新排序为2,3,4并且表示与有序列表1,2,3重叠, 4,5
  3. 与无序的10,9相比,有序列表8,9,10具有相同的想法(如步骤2)。它应该是9,10与8,9,10重叠。
  4. 现在比较有序列表1,2,3,4,5和无序的6,4,5,7它们有一个4,5的交集,所以你可以得出1,2,3,4,5的结论,(6,7 | 7,6)其中(6,7 | 7,6)表示其中的一个是6后跟一个7或7后跟一个6(但其未知是正确的)
  5. 输出:

    • 我想能够解析矩阵/树/任何类型的数据结构,以查看重叠的位置和顺序
    • 和包含部分已知订单集的汇总列表
      • set1:1,2,3,4,5,(6,7 | 7,6)
      • set2:2:8,9,10

    有没有人知道我可以使用的类似问题或算法?理想情况下,它将在Perl中,但伪代码或来自另一种语言的算法会很好。

    由于

1 个答案:

答案 0 :(得分:0)

如果我理解这一点,您需要一组有序和无序列表中的一个有序列表。一种可能的解决方案是迭代所有集合中的所有值,并将它们添加到散列表结构中。在实现术语中,可以是c ++ map,java hashmap,python dictionary等。这看起来像:

  

for i over all S //(Ordered and   无序的)

  for j over all values in S[i]

      H.insert(S[i][j]) //H is the hash table

现在遍历哈希表条目以获取所需的有序列表。这是非常实用和最佳的。

一个不那么实用的解决方案,但值得一提的是它的好处是:

  1. 为每个唯一编号分配相应的素数。例如,在您的示例中,将数字映射如下: p [1] = 2,p [2] = 3,p [3] = 5,p [4] = 7,p [5] = 11,p [6] = 13,p [7] = 17,p [8] = 19,p [9] = 23,p [10] = 29;

  2. 现在,每个集合Si可以用值Vi-相应素数的乘积来表示。因此,一组Si =(1,2,3)(或对于那个问题(2,1,3))将具有值Vi = p [1] * p [2] * p [3]

  3. 找到所有Vi的LCM。叫这个V. V =适用于所有i LCM {Vi}

  4. 将因子V分解为其主要因素。每个素数代表最终有序列表中的元素。

  5. 这第二个解决方案很整洁,但出于实际目的而分解,因为我们很快进入了bignum空间。

    希望至少其中一项适合你!