【发布时间】:2014-09-15 19:31:04
【问题描述】:
如果我们有一个大小为 N 且先前已排序的向量,并将最多 M 个元素替换为任意值(其中 M 是比 N 小得多),有没有一种简单的方法可以以比完整排序更低的成本(即生成深度降低的排序网络)对它们进行重新排序?
例如,如果 N=10 和 M=2,则输入可能是
10 20 30 40 999 60 70 80 90 -1
注意:被修改元素的索引是未知的(直到我们将它们与周围的元素进行比较。)
这是一个我知道解决方案的示例,因为输入大小很小,我能够通过蛮力搜索找到它:
如果 N = 5 且 M 为 1,则这些将是有效输入:
0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0
0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1
0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1
0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1
例如,如果先前排序的向量是0 1 1 1 1 并且第4 个元素被修改,则输入可能是0 1 1 0 1,但无法将0 1 0 1 0 形成为有效输入,因为它至少有2 个不同来自任何排序向量的元素。
这将是重新排序这些输入的有效排序网络:
>--*---*-----*-------->
| | |
>--*---|-----|-*---*-->
| | | |
>--*---|-*---*-|---*-->
| | | |
>--*---*-|-----*---*-->
| |
>--------*---------*-->
我们不在乎这个网络无法对一些无效输入进行排序(例如0 1 0 1 0。)
而且这个网络的深度为 4,与一般情况相比节省了 1 (a depth of 5 generally necessary to sort a 5-element vector.)
不幸的是,蛮力方法不适用于更大的输入大小。
是否有一种已知的方法可以构建网络以重新排序更大的向量?
我的 N 值大约是几百,M 不会超过 √N。
【问题讨论】:
-
我认为一些排序方法将数据分成几部分,只对这些部分进行测试。也许您可以通过知道每个桶不能有超过一定数量的未排序元素来调整它并降低该方法的成本。对于较小的 M 值,您还可以找到未排序的元素,将它们分开排序,然后再次将它们合并到完整列表中。但这种方法不可并行化。
-
@DarkZeros 我认为您的第一个建议是正确的。我正在尝试使用 Shell 排序。
-
一些附加信息会很好: - N 真的会在几百的范围内吗? - 您一般期望从排序中获得什么样的性能?如果您的问题规模真的不大,那么复杂的网络可能不值得麻烦。 - 到目前为止,您尝试过什么样的类型? - 对于你的问题,我假设你的意思是:“我只更改了一些元素,如果知道这些信息,有没有办法让排序比常规更快,或者如果大多数元素已经存在,那么它的执行速度会更快排序”。我说得对吗?
-
另外: - 您在排序和排序网络领域的理解有多深?我问是为了不浪费你的时间,因为我的知识相当有限。
-
如果您要对几乎排序的数据进行排序,插入排序实际上是一个不错的选择。另一种是自然归并排序。对于几乎排序的数据,我会将 shell 排序排在这两者之后。