Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 向量的置换_Algorithm_Vector_Permutation_Swap - Fatal编程技术网

Algorithm 向量的置换

Algorithm 向量的置换,algorithm,vector,permutation,swap,Algorithm,Vector,Permutation,Swap,假设我有一个向量: 0 1 2 3 4 5 [45,89,22,31,23,76] 以及其索引的排列: [5,3,2,1,0,4] 是否有一种有效的方法可以根据排列来使用它,从而获得: [76,31,22,89,45,23] 最多使用0(1)个额外空间?是。从最左边的位置开始,我们将元素放在正确的位置i,方法是将它与(其他)放错位置i的元素交换。这就是我们需要O(1)额外空间的地方。我们不断交换元素对,直到此位置的元素正确为止。只有这样,我们才能进入下一个位置,做同样的事情 示

假设我有一个向量:

 0  1  2  3  4  5
[45,89,22,31,23,76]
以及其索引的排列:

[5,3,2,1,0,4]
是否有一种有效的方法可以根据排列来使用它,从而获得:

[76,31,22,89,45,23]

最多使用0(1)个额外空间?

是。从最左边的位置开始,我们将元素放在正确的位置i,方法是将它与(其他)放错位置i的元素交换。这就是我们需要O(1)额外空间的地方。我们不断交换元素对,直到此位置的元素正确为止。只有这样,我们才能进入下一个位置,做同样的事情

示例:

[5 3 2 1 0 4]初始状态

[4 3 2 1 0 5]交换(5,4),5现在处于正确位置,但4仍然错误

[03 2 1 4 5]已交换(4,0),现在4和0都处于正确位置,请转到下一个位置

[0 1 2 3 4 5]已交换(3,1),现在1和3都处于正确位置,请转到下一个位置

[0 1 2 3 4 5]所有元件均处于正确位置,结束

注意


由于每个交换操作都会将至少一个(两个)元素置于正确的位置,因此我们总共只需要N个这样的交换。

Zach的解决方案非常好

尽管如此,我还是想知道为什么需要分类。如果有索引的排列,请将这些值用作指向旧数组的指针

这可能会首先消除对数组进行排序的需要。这不是一个在所有情况下都可以使用的解决方案,但在大多数情况下它都可以正常工作

例如:

a = [45,89,22,31,23,76];
b = [5,3,2,1,0,4]
现在,如果您想浏览a中的值,可以执行以下操作(伪代码):

如果要按新顺序循环遍历值,请执行以下操作:

for i=0 to 4
{
    process(a[b[i]]);
}

如前所述,这种解决方案在许多情况下可能足够,但在其他一些情况下可能不够。对于其他情况,您可以使用Zach的解决方案。但是对于可以使用此解决方案的情况,它更好,因为根本不需要排序。

技术面试的典型问题。看待此解决方案的另一种方式是,您遵循排列的循环表示法。[]非常感谢,您的答案很有帮助:)您的答案也很有帮助,可以将置换向量转换为矩阵的行或列。
for i=0 to 4
{
    process(a[b[i]]);
}