Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 仅使用交换更改数组顺序_Arrays_Algorithm_Sorting - Fatal编程技术网

Arrays 仅使用交换更改数组顺序

Arrays 仅使用交换更改数组顺序,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,假设有两个数组,a和b。a的数据对您完全隐藏。可以在上执行的唯一操作是交换两个元素。b的数据是完全公开和可变的 位置i处的b值指示存储在a[i]中的值的目的地。也就是说,如果b[3]=7,我们希望将a[3]中的值移动到a[7]中。我正在尝试编写一个算法,根据数组b中的信息,仅使用a(最好是线性时间和常量空间)上的交换操作,对数组a进行变异。举个例子: if a = { a b c d e f } and b = { 1 3 2 0 5 4 } then a' = { d a c b f

假设有两个数组,a和b。a的数据对您完全隐藏。可以在上执行的唯一操作是交换两个元素。b的数据是完全公开和可变的

位置i处的b值指示存储在a[i]中的值的目的地。也就是说,如果b[3]=7,我们希望将a[3]中的值移动到a[7]中。我正在尝试编写一个算法,根据数组b中的信息,仅使用a(最好是线性时间和常量空间)上的交换操作,对数组a进行变异。举个例子:

if   a  = { a b c d e f }
and  b  = { 1 3 2 0 5 4 }
then a' = { d a c b f e }
(ie, a[i] = a'[b[i]])
我尝试了一种天真的方法,迭代b并愉快地执行a.Swap(I,b[I]),一直在吹口哨,但最终结果是写入了它自己,并移动了已经在正确位置的数据(正如您可能猜到的)


编辑:这一定是线性时间。这是一种并行排序算法,因此速度至关重要。

按升序排列b的元素,交换b的元素时,也交换a中的元素。例如,使用气泡排序:

for(int i=0;i<b.length;i++){
for(int j=0;j<b.length-i-1;j++){
if(b[j+1]<b[j]){
// swap b[j+1] and b[j]
// swap a[j] and a[j+1]
}
}
}
for(int i=0;iGo中的解决方案:

for i := 0; i != len(b); i++ {
    for b[i] != i {
        a.Swap(i, b[i])
        b.Swap(i, b[i])
    }
}
这可能不会立即显示为O(n),但请注意

  • 每个a.Swap()都会将a的至少一个元素放入其最终位置
    • 一旦元素处于其最终位置,它就再也不会被交换
    • 因此,最多有n次互换
  • b[i]!=i
    测试对每个交换执行一次,对每个i额外执行一次
    • 所以最多有2n个测试

正如你所看到的,这个算法是O(n)准时的,O(1)在空间上。

从技术上说你是对的,但我确实需要这是线性的。一点背景:这是一个并行排序算法的合并阶段,所以做并行排序然后用二次冒泡排序来完成是毫无意义的。另外,b的元素是A的索引,所以对它们进行排序只会得到b[I]=实际上,结果证明这不起作用。我在一个测试用例中尝试了它,我知道排序是正确的,但它没有生成所需的排序。抱歉。