当排列数中出现相同的数时,逆序数怎么计算,比如145243
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当排列数中出现相同的数时,逆序数怎么计算,比如145243相关的知识,希望对你有一定的参考价值。
逆序数是指一个排列中所有逆序总数,而排列,是从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列。145243中出现出现相同的数4,
所以145243不是排列,也就无所谓计算逆序和逆序数了。 参考技术A 一.
预备知识
.
这部分就是百度上一搜一大片的东西,不过还是强调一下。
.
1.
全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫n的全排列。[1]对于n的全排列,共有n!种情况。
2.
逆序、逆序数和奇、偶排列
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。[2]
例如,对于n=3的全排列:
全排列
123
231
312
132
213
321
逆序数
0
2
2
1
1
3
奇偶性
偶
奇
.
二.
相关问题
.
1.
给定一个排列,求它的逆序数。[3]
问题:给定一个排列,求它的逆序数是多少。
分析:设
p1,p2,…,pn
为n的一个全排列,则其逆序数为t=t1+t2+…+tn=
其中
ti为排在pi
前,且比pi
大的数的个数。
这部分代码比较简单,此处略去。
.
2.
根据逆序数推排列数。[4]
问题:给定一个n元排列,它的逆序数存在且唯一。那么反过... 参考技术B 一.
预备知识
.
这部分就是百度上一搜一大片的东西,不过还是强调一下。
.
1.
全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫n的全排列。[1]对于n的全排列,共有n!种情况。
2.
逆序、逆序数和奇、偶排列
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 参考技术C 逆序数是指一个排列中所有逆序总数,而排列,是从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列。
145243中出现出现相同的数4,
所以145243不是排列,也就无所谓计算逆序和逆序数了。
逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。[1] 如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。
扩展资料
计算逆序数:
标准列是1
2
3
4
5
,那么
5
4
3
2
1
的逆序数算法:
5之前没有数,记为0.
看第二个,4之前有一个5,在标准列中5在4的后面,所以记1个
类似的,第三个
3
之前有
4
5
都是在标准列中3的后面,所以记2个
同样的,2
之前有3个,1之前有4个
将这些数加起来就是逆序数=1+2+3+4=10
再举一个
2
4
3
1
5
4
之前有0个
3
之前有1个
1
之前有3个
5
之前有0个
所以逆序数就是1+3=4
参考资料
搜狗百科——逆序数
AKOJ-2021-逆序对(归并,二分)
链接:https://oj.ahstu.cc/JudgeOnline/problem.php?id=2021
题意:
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。
比如 1 3 2 的逆序数就是1。
思路:
求逆序对,之前用树状数组写过,此解使用归并排序的方法求解。
不断对原数组进行二分,即先求解原数组左边数组和右边数组的逆序对数。
当对数组合并时,寻找左边数组比右边数组值大的数,优先处理左边数组,即Left[i] <= Right[j]。
当两值相等时不满足逆序对,所以优先将左边数组相等之加入原数组,
同时累计sum += j-1。
代码:
#include <bits/stdc++.h> using namespace std; const int MAXN = 1000000+10; int Left[MAXN/2],Right[MAXN/2],a[MAXN]; int n; long long sum = 0; void Megre(int p,int q,int r) { int w; for (int i = p,w = 1;i<=q;i++) Left[w++] = a[i]; for (int i = q+1,w = 1;i<=r;i++) Right[w++] = a[i]; int i = 1,j = 1; w = p; while (w <= r) { if (j > r-q || i <= q-p+1&&Left[i] <= Right[j])//当两值相等时优先处理左边数组 { a[w] = Left[i]; i++; sum += j-1;//右边数组往后移动位数即右边比左边当前位置值小的值个数 } else { a[w] = Right[j]; j++; //sum += i-1; } w++; } } void Megre_sort(int p,int r) { if (p < r) { int q = (p + r) / 2; Megre_sort(p, q); Megre_sort(q + 1, r); Megre(p, q, r); /* cout << p << ‘ ‘ << r << ‘:‘ << endl; cout << sum << endl; */ } } int main() { int t; cin >> t; while (t--) { cin >> n; for (int i = 1;i<=n;i++) cin >> a[i]; sum = 0; Megre_sort(1,n); cout << sum << endl; } return 0; }
以上是关于当排列数中出现相同的数时,逆序数怎么计算,比如145243的主要内容,如果未能解决你的问题,请参考以下文章