多个列表的排序组合

时间:2009-04-15 13:12:41

标签: algorithm sorting

将L1,L2,L3视为分别按排序顺序包含n1,n2和n3整数的列表。

任务是构造一个排序列表L,使其

L[0] = L1[0] + L2[0] + L3[0]
L[i] = L1[i1] + L2[i2] + L3[i3]
L[n1 * n2 * n3] = L1[n1] + L2[n2] + L3[n3]

但是n1,n2,n3非常大,因此L不能一次构造然后排序。

因此,列表将分阶段构建,以便我们可以显示k个顶部整数并通过计算[k + 1]个顶部整数来保存计算状态。

可以使用所有数据结构和算法来实现目标吗?

3 个答案:

答案 0 :(得分:3)

你不能只使用修改后的merge sort,因为你已经有三个排序列表吗? (通过“修改”我的意思是利用你知道每个输入列表已经排序的事实。)

假设你不能直接使用合并排序,因为你不想在内存中计算整个新合并的排序列表,那你怎么样:使用修改的合并排序来计算第一组合并的条目并显示那些,维护合并排序中使用的指针。你只需坚持你在每个列表中的位置,一个指向每个列表中当前位置的指针,然后从每个列表的中断处开始。

答案 1 :(得分:0)

好的,这个答案可能会让我感到害怕。但是因为你只需要算法,所以最好的解决方案是在每个列表的同时用最好的元素构建结果列表(在这种情况下是较低的,或者你喜欢的那个)。 使用此方法,您有4个位置,每个位置用于您正在进行的每个列表,最后一个点可以指向您需要插入的结果列表中的位置(或插入的最后位置)。有了这个,你需要的唯一结构是一个列表。

在这种情况下,我发现合并排序存在问题。您显示的数据可能不是确切的数据(因为您需要对下一部分进行排序,并且可以与当前部分合并)。

答案 2 :(得分:0)

好的,首先是两个维度的例子:

    1  2  3

1   2  3  4
5   6  7  8
7   8  9 10

显然,您从左上角开始,并将值放入结果列表中。接下来,您必须将所有可到达的候选项(通过递增一个索引)从那里添加到某种排序集合,这里是具有值3和6的单元格。然后,您从该集合中取出最低成员,将其值放入结果列表中,将那些尚未在集合中可到达的候选者添加到该集合中,依此类推。

您将需要:

  • 持有候选人的数据结构,包含所有索引和结果值(我将其表示为“((i1 i2) value)”)。
  • 按值排序的候选集合的数据结构。堆似乎是理想的。

当您将所有候选人放入集合时,您必须确保所有候选人的指数都是唯一的。值不一定是唯一的,但堆应按它们排序。由于给定的索引集始终生成相同的值,因此只有在插入堆时遇到该值时,才必须检查索引的唯一性。可能是优化使堆的节点不是单个候选者,而是具有相同值的候选者列表。

使用上面的例子:首先,结果列表是(2)。候选人是((1 2)3)和((2 1)6)。取出具有最低值的候选者,将值放入结果列表中 - > (2 3),找到所有新候选人的坐标 - > (2 2)和(1 3),计算它们的值 - > ((2 2)7)和((1 3)4),将它们放入候选人的堆中(此处为序列化表示) - > ((1 3)4)((2 1)6)((2 2)7),起泡,冲洗,重复。

以表格形式:

result-list          candidates
(2)                  ((1 2) 3) ((2 1) 6)
(2 3)                ((1 3) 4) ((2 1) 6) ((2 2) 7)
(2 3 4)              ((2 1) 6) ((2 2) 7) ((2 3) 8)
(2 3 4 6)            ((2 2) 7) ((3 1) 8) ((2 3) 8)
(2 3 4 6 7)          ((3 1) 8) ((2 3) 8) ((3 2) 9)
(2 3 4 6 7 8)        ((2 3) 8) ((3 2) 9)
(2 3 4 6 7 8 8)      ((3 2) 9) ((3 3) 10)
(2 3 4 6 7 8 8 9)    ((3 3) 10)
(2 3 4 6 7 8 8 9 10)

我目前看不到更好的方法。堆似乎需要n1,n2和n3之和的大量节点。