线代笔记:一个排列中的任意两个元素对换,该排列的奇偶性发生改变

已证:排列进行相邻对换时,该排列的奇偶性发生改变

设一个有 n n n 个数的排列为 a 1 , a 2 , a 3 … a n − 1 , a n a_{1},a_{2},a_{3}…a_{n-1},a_{n} a1,a2,a3an1,an ,假设其中两个元素要进行位置对换,其中一个的位置为 x x x ,一个位置为 y y y ,所以他们的距离(即两个元素之间间隔的元素个数)为 m = ∣ x − y ∣ − 1 m=|x-y|-1 m=xy1

假设 x < y x<y x<y 。首先,将在 x x x 上的元素向右移动 m m m 步,可以到达 y y y 的前面,即此时排列为 … a x , a y … …a_{x},a_{y}… ax,ay ,再将 y y y 上的元素向左移动 m + 1 m+1 m+1 步,到达 x x x 位置。此时两个元素完成位置对换,共进行了 2 m + 1 2m+1 2m+1 次相邻对换, 2 m + 1 2m+1 2m+1 必定为奇数,所以排列的奇偶性发生变化。

假设 x > y x>y x>y 。首先,将在 y y y 上的元素向右移动 m m m 步,可以到达 x x x 的前面,即此时排列为 … a y , a x … …a_{y},a_{x}… ay,ax ,再将 x x x 上的元素向左移动 m + 1 m+1 m+1 步,到达 y y y 位置。此时两个元素完成位置对换,共进行了 2 m + 1 2m+1 2m+1 次相邻对换, 2 m + 1 2m+1 2m+1 必定为奇数,所以排列的奇偶性发生变化。

证明完毕。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,关于你的问题,我可以给出递归算法伪代码: ``` function permutations(list, n) { if (n <= 1) { return [list]; } let result = []; for (let i = 0; i < n; i++) { let subList = list.slice(0); subList.splice(i, 1); let subPermutations = permutations(subList, n - 1); for (let j = 0; j < subPermutations.length; j++) { result.push([list[i]].concat(subPermutations[j])); } } return result; } ``` 通过调用 `permutations(list, n)` 即可获得 `list` 所有长度为 `n` 的排列。 ### 回答2: 要设计递归算法生成n个元素的所有排列对象c,首先可以确定递归的终止条件是当n=1时,排列只有一个元素,即为c。然后考虑如何将问题分解为规模更小的子问题。 假设初始时有n个元素{a1, a2, ..., an},为了生成所有排列对象c,可以以第一个元素ai作为固定元素,然后递归地生成剩余n-1个元素的所有排列。递归求解的结果可以表示为p(n-1),代表n-1个元素的所有排列。接下来,将ai与p(n-1)的每一个排列进行组合,得到n个元素的所有排列。 具体步骤如下: 1. 如果n=1,返回{a1}作为排列c。 2. 如果n>1,则对于每一个元素ai,分别以ai作为固定元素,递归地生成剩余n-1个元素的所有排列p(n-1)。 3. 将ai与p(n-1)的每一个排列进行组合,得到以ai为开头的n个元素排列对象c(i)。 4. 返回所有c(i)的集合,即为n个元素的所有排列对象c。 通过递归的方式,每一次都将问题分解为规模更小的子问题,直到达到终止条件,最终得到全部排列对象c。 需要注意的是,在实现算法时,可以利用循环结构来遍历元素并进行递归调用,同时需要使用适当的数据结构来保存排列结果,并确保在递归过程不重复生成相同的排列。 ### 回答3: 设计递归算法生成n个元素的所有排列对象c 的步骤如下: 1. 如果n等于1,则排列对象c为单个元素。返回{[1]}。 2. 否则,将第一个元素与剩余的n-1个元素进行交换。这可以通过遍历剩余元素并与第一个元素交换来实现。例如,对于元素数组[1, 2, 3],将第一个元素1与[2,3]的每个元素进行交换,得到[1]+permutation([2,3])的结果。 3. 对于每个交换后的数组,将当前交换后的元素放在排列对象c,并递归地生成剩余n-1个元素排列对象。这可以通过将当前交换后的元素与递归调用permutation()的结果进行连接来实现。例如,在步骤2,得到[1]+permutation([2,3])的结果后,递归地计算permutation([2,3])。 4. 重复步骤2和3,直到所有元素都参与了交换。最终得到的排列对象c是所有交换的结果的集合。 通过上述步骤,我们可以逐步生成n个元素的所有排列对象c。需要注意的是,在每次递归调用,所传递的元素数组都是递归前的剩余元素数组。这样可以确保每个元素都有机会成为排列对象c的第一个元素,并且可以保证没有重复的排列对象c。 需要注意的是,以上算法的时间复杂度为O(n!),其n为元素个数。这是因为对于每个元素,都需要进行交换和递归操作,而每个操作都是对剩余元素进行的,所以总共有n!个操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值