如果我们有一个大小为N的向量,之前已经排序好了,现在要用任意值替换最多M个元素(其中M远小于N),是否有一种简单的方法可以以更低的成本重新进行排序(即生成深度较小的排序网络)而不是完全排序?
例如,如果N=10,M=2,则输入可能如下:
注意:修改元素的索引未知(直到与周围元素进行比较后才知道)。
以下是一个例子,我知道答案是因为输入大小很小,我可以通过暴力搜索找到它:
如果N = 5且M为1,则以下是有效输入:
例如,如果先前排序的向量为
这将是用于重新排序这些输入的有效排序网络:
我们不关心这个网络不能对一些无效的输入进行排序(例如
并且这个网络有深度4,与一般情况相比(一般需要深度为5才能对5个元素向量进行排序),节省了1个深度。
不幸的是,对于更大的输入大小,暴力方法是不可行的。 是否有已知的方法来构建一个网络以重新排序更大的向量? 我的N值将按几百个顺序排列,而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,与一般情况相比(一般需要深度为5才能对5个元素向量进行排序),节省了1个深度。
不幸的是,对于更大的输入大小,暴力方法是不可行的。 是否有已知的方法来构建一个网络以重新排序更大的向量? 我的N值将按几百个顺序排列,而M不会超过√N。