(转)高效算法求逆序数
来源:互联网 发布:oracle数据库索引失效 编辑:程序博客网 时间:2024/06/18 18:47
1. 分治法(合并排序时计算)
把数组 a 划分为 [first, (first+last)/2)(左)、[(first+last)/2, last)(右) 两部分
[first, last) 的逆序数 = 左半部分逆序数 + 右半部分逆序数 + 两数分别出现在左、card(pair(i, j) | i∈左 且 j∈右)
#include <stdio.h>
#include <string.h>
#define N 100
int a[N], b[N], n;
int Calc(int first, int last)
{
if (first == last-1) return 0;
int mid = (first+last)/2, i = first, j = mid, k = first,
res = Calc(first, mid)+Calc(mid, last);
while (i < mid && j < last)
{
if (a[i] <= a[j]) b[k++] = a[i++], res += j-mid;
else b[k++] = a[j++];
}
while (i < mid) b[k++] = a[i++], res += j-mid;
while (j < last) b[k++] = a[j++];
memcpy(a+first, b+first, sizeof(b[0])*(last-first));
return res;
}
int main()
{
int res = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d", &a[i]);
printf("%d/n", Calc(0, n));
return 0;
}
-----
2.线段树
对每一次输入的 t[i],计算以前输入的大于 t[i] 的数的个数之和 s[i]。∑s[i] 即为结果
利用线段树,就能快速计算出任意的 s[i]
输入的数的范围为 1~N(所以时间复杂度和前一种方法略有差别)
#include <stdio.h>
#define N 100
int a[N*2-1];
void Inc(int root, int first, int last, int x)
{
++a[root];
if (first == last-1) return;
if (x < (first+last+1)/2) Inc(root*2+1, first, (first+last+1)/2, x);
else Inc(root*2+2, (first+last+1)/2, last, x);
}
int Sum(int root, int first, int last, int x)
{
if (first == last-1) return a[root];
return (x < (first+last+1)/2 ? Sum(root*2+1, first, (first+last+1)/2, x) : 0)
+ Sum(root*2+2, (first+last+1)/2, last, x);
}
int main()
{
int n, res = 0;
for (scanf("%d", &n); n; --n)
{
int t;
scanf("%d", &t);
res += Sum(0, 1, N+1, t+1);
Inc(0, 1, N+1, t);
}
printf("%d/n", res);
return 0;
}
-----
3.树状数组
类似于线段树
输入的数的范围为 1~N
#include <stdio.h>
#define N 100
int a[N+1];
void Inc(int x)
{
for (; x <= N; x += (x^x-1)&x)
++a[x];
}
int Sum(int x)
{
int res = 0;
for (; x; x -= (x^x-1)&x)
res += a[x];
return res;
}
int main()
{
int n, res = 0;
for (scanf("%d", &n); n; --n)
{
int t;
scanf("%d", &t);
res += Sum(N-t);
Inc(N-t+1);
}
printf("%d/n", res);
return 0;
}
- (转)高效算法求逆序数
- 求逆序数算法
- 【算法设计】求逆序数
- 求逆序数的分治算法
- 求逆序数的分治算法
- 归并排序-求逆序数算法
- 分治算法 求数组逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数#no
- 求逆序数
- 工作总结3 开发效率
- MCS-51单片机的内部程序存储器
- 51单片机特殊功能寄存器中的字节寻址和位寻址
- 上传了前阵子写的一个Symbian 3rd下的即时通信软件源代码!
- 上传了前阵子写的一个Symbian 3rd下的即时通信软件源代码!
- (转)高效算法求逆序数
- 动态链接库内存分配(转)
- [zz] GCC 常用参数
- 用VMWare安装Redhat 9
- 在Flex中用Iframe嵌入HTML网页
- Error:您没有权限使用网络资源之解决方案(备忘)
- Understanding How Transaction are Applied in Transactional Replication in SQL Server 2005
- 心理学电影
- linux文件系统概念&目录结构