gpt4 book ai didi

c++ - 排列中的交换次数

转载 作者:可可西里 更新时间:2023-11-01 18:35:50 26 4
gpt4 key购买 nike

<分区>

是否有一种有效的算法(就大 O 符号而言是有效的)来找到将置换 P 转换为恒等置换 I 的交换次数?交换不需要在相邻元素上,而是在任何元素上。

例如:

I = {0, 1, 2, 3, 4, 5}, number of swaps is 0
P = {0, 1, 5, 3, 4, 2}, number of swaps is 1 (2 and 5)
P = {4, 1, 3, 5, 0, 2}, number of swaps is 3 (2 with 5, 3 with 5, 4 with 0)

一个想法是编写这样的算法:

int count = 0;
for(int i = 0; i < n; ++ i) {
for(; P[i] != i; ++ count) { // could be permuted multiple times
std::swap(P[P[i]], P[i]);
// look where the number at hand should be
}
}

但我不是很清楚这是否真的保证终止或者它是否找到正确数量的交换。它适用于上面的例子。我尝试在 5 和 12 数字上生成所有排列,它总是在这些数字上终止。

这个问题出现在数值线性代数中。一些矩阵分解使用旋转,它有效地将具有最大值的行交换为要操作的下一行,以避免被小数除并提高数值稳定性。一些分解,如LU分解,后面可以用来计算矩阵行列式,但如果排列数为奇数,则分解后的行列式符号与原矩阵的符号相反。

编辑:我同意这个问题类似于Counting the adjacent swaps required to convert one permutation into another .但我认为这个问题更为根本。通过在 O(n) 中反转目标排列,在 O(n) 中组合排列,然后找到从那里到恒等式的交换次数,可以将排列从一个转换为另一个。通过将身份显式表示为另一种排列来解决这个问题似乎不是最优的。另外,直到昨天,另一个问题有四个答案,其中只有一个(由|\/|ad)似乎有用,但对该方法的描述似乎很模糊。现在用户 lizusek 在那里提供了我的问题的答案。我不同意将此问题作为重复问题关闭。

EDIT2:正如用户 rcgldr 在评论中指出的那样,所提出的算法实际上似乎是最佳的,请参阅我对 Counting the adjacent swaps required to convert one permutation into another 的回答。 .

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com