【发布时间】:2021-03-26 23:56:27
【问题描述】:
我正在寻找最有效的二进制值排序网络。就我而言,效率是所需的比较和交换操作的数量。
背景:Sorting networks 使用一系列具有刚性位置的比较和交换操作对值列表进行排序。由于严格的顺序,它们适用于硬件实现或并行化。我有两个子问题:
-
如果我知道我的数据是二进制的,例如
(0, 1, 1, 0, 1, 1 ...),我可以构造一个比任意值更高效的排序网络吗? -
将冒泡排序等算法转变为排序网络是微不足道的,因为该算法使用严格的比较和交换操作序列。有没有一种系统的方法可以将任何排序算法(例如this one for sorting a binary array)变成一个排序网络?示例算法在 动态 位置(由两个移动索引确定)使用比较和交换。
(我应该补充一点,排序网络的一个属性,即多个比较和交换操作可以分组并并行执行(因为它们的索引对不重叠),对我的应用程序并不重要。我是只是想找到最短的严格的比较和交换操作序列。)
感谢您的帮助!
【问题讨论】:
-
我认为你需要 n-1 比较最小和 N-1 交换最大。现在找到一个算法。
-
@wildplasser:小写n和大写N是什么意思?
-
马虎。两者都假定为您的数组的大小。
-
我想知道staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap28.htm 中描述的零一原则是否不会隐含地阻止构建更简单的网络来对二进制值进行排序。 “零一原则说,如果排序网络在从集合 {0,1} 中提取每个输入时都能正常工作,那么它在任意输入数字上都能正常工作。” 所以如果我可以构造对于二进制数的排序网络比对任意数的排序网络更简单,它也适用于导致矛盾的任意数。还是这种解释是错误的?