使用split和concat合并已排序的序列

时间:2014-08-29 15:12:57

标签: algorithm sequences proof correctness

我正在努力完成以下任务:

给定数字C1, C2, ..., Cn和操作split(C, i)concat(Ca, Cb)的已排序序列,找到这些操作的最佳序列(最短的),创建一个已排序的序列。

enter image description here enter image description here

我设计了以下算法:

1. Sort sequences C1, C2, ..., Cn with respect to they first elements.
2. When number of sequences is greater than one:
3.    Find in C1 the last position with the number that is less than the first number in C2.
4.    If found_position == |C1|
5.        C1 = concat(C1, C2)
6.    Else:   
7.        C1a, C1b = split(C1, found_position + 1).
8.        C1 = concat(C1a, C2).
9.        Insert C1b to the set of sequences maintaining the order (with respect to their first elements).
10.    Remove C2 from the set of sequences.
11.    Go to step 2., in step 3. start searching from found_position.

An example:
1 4 5 9
2 6 10 11
7 12 20

1 4 5 9   2 6 10 11   7 12 20
^
1   4 5 9   2 6 10 11   7 12 20 // split
^
1 2 6 10 11   4 5 9   7 12 20  // concat
  ^ 
1 2 6 10 11   4 5 9   7 12 20

1 2   6 10 11   4 5 9   7 12 20
  ^ 
1 2 4 5 9   6 10 11   7 12 20
    ^
1 2 4 5 9   6 10 11   7 12 20
      ^
1 2 4 5    9   6 10 11   7 12 20
      ^
1 2 4 5 6 10 11   7 12 20   9
        ^
    . . .
    . . .
1 2 4 5 6 7 9 10 11 12 20

为了维护有序的工作序列集,我可以使用平衡二叉树(在步骤8中插入是nlog n)。 这是对的吗?如何证明其正确性?

0 个答案:

没有答案