Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions 1019刘子轶/1019代码块.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
```yaml

#include <iostream>
#include <vector>
using namespace std;

int countTrans(vector<int> &p)
{
int n = p.size();
vector<bool> visited(n, false);
int transpositions = 0;

for (int i = 0; i < n; i++)
{

// 如果已经访问过或已经在正确的位置,跳过它
if (visited[i] || p[i] == i + 1)
{
continue;
}

int cycleLength = 0;
int current = i;

// 持续循环,直到返回到起始元素
while (!visited[current])
{
visited[current] = true;

//移动到循环中的下一个元素
current = p[current] - 1;
cycleLength++;
}

// 如果循环长度大于 1,添加cycleLength - 1 个换位
if (cycleLength > 1)
{
transpositions += (cycleLength - 1);
}
}

return transpositions;
}

int main()
{
vector<int> p = {5, 1, 4, 3, 2};

int result = countTrans(p);
cout << result << endl;

return 0;
}
```yaml
20 changes: 20 additions & 0 deletions 1019刘子轶/1019测试题.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
转置环是一种简洁的表示排列的方式,它将排列分解成多个循环。一个循环表示一组相互置换(或交换)的元素。

例子:

考虑 [1, 2, 3, 4, 5] 的排列 p = [5, 1, 4, 2, 3],元素移动如下:1 → 5, 5 → 3, 3 → 4, 4 → 2, 2 → 1。由于所有元素都相连,因此只有一个循环,因此循环符号为 (1, 5, 3, 4, 2)
考虑另一个排列 p = [5, 1, 4, 3, 2],该排列中有两个循环,1 → 5 → 2(循环:( 1 , 5, 2))和 3 → 4(循环:( 3 , 4 ))。循环符号:(1, 5, 2) (3, 4)

转置是长度为 2 的循环(2 元素交换)。任何循环都可以分解为转置的组合。转置的次数表示将恒等置换 (1, 2, 3, ..., n) 变换为给定置换所需的最少 2 元素交换次数。

关键规则:一个循环中的换位次数 = 循环长度 - 1




**一句话概括:**
数组p=[5, 1, 4, 2, 3],存在某个起点通过不断 x = p[x] 会回到起点,计算其中的转置次数


进阶思考:
问题 :给定一个元素排列n,表示为一个整数数组 p = [p1, p2, p3, ..., pn],计算其中的转置次数。
8 changes: 8 additions & 0 deletions 1019刘子轶/测试实例.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#输入: p = [5, 1, 4, 3, 2]
#输出: 3
解释:对于排列 [ 5, 1, 4, 3, 2],循环符号为:

(1, 5, 2):1 → 5 → 2(3 个元素,2 个转置)。
(3, 4) : 3 → 4(2 个元素,1 个转置)。
总换位次数为 3。