1.7 逆序数与归并排序[inversion pairs by merge sort]
【本文链接】
http://www.cnblogs.com/hellogiser/p/inversion-pairs-by-merge-sort.html
【题目】
编程之美1.7光影切割问题可以进一步将问题转化为求逆序数问题。
【分析】
求解逆序对问题与MergeSort类似,只需要对MergeSort稍作修改即可实现。MergeSort是采用分治法的思想,若需要排序A[p...r],则可以对半分成A[p...q]和A[q...r],然后将这有序的两部分Merge,而Merge的过程为Θ(n)的时间复杂度。根据主定率T(n)=2(Tn/2)+Θ(n),时间复杂度为T(n)=Θ(nlgn)。
同理,求整个序列中的逆序对,也可以利用分治法的思想,即
逆序对(A[p...r])= 逆序对(A[p...q])+逆序对(A[q...r])+逆序对(A[p...q], A[q...r]之间)。
结合MergeSort,关键是如何在Θ(n)的时间有效的求出A[p...q], A[q...r]之间的逆序对。因为在合并排序的Merge过程中,A[p...q]和A[q...r]已经有序,假设此时已经Merge到A[i...q]和A[j...r]。考虑接下来的一步:如果A[i]<=A[j],说明A[i]比后面的序列A[j...r]中的元素都小,不存在逆序对;如果A[i]>A[j],,则说明A[j]比前面的序列A[i...q]都小,即以j结尾的逆序对的数量为前面的序列剩余序列A[i...q]中元素的数量。
Merge的过程中即可得到A[p...r], A[r...q]之间的逆序对的数量,时间复杂度亦为Θ(n), 由主定律总的时间复杂为 Θ(nlgn),这种方法要比朴素的方法 Θ(n*n)好很多。
【MergeSort】
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/*
version: 1.0 author: hellogiser blog: http://www.cnblogs.com/hellogiser date: 2014/6/25 */ void merge(int *A, int p, int q, int r) { //Li: p...q Rj: q+1...r ; ; ]; ]; // copy L and R ; i < n1; i++) L[i] = A[p + i]; ; j < n2; j++) R[i] = A[q + + j]; // mark end L[n1] = INT_MAX; R[n2] = INT_MAX; ; // left ; // right ; // whole for (k = p; k <= r; k++) { if (L[i] <= R[j]) { A[k] = L[i]; i++; } else { // L[i]>R[j] A[k] = R[j]; j++; } } delete []L; void merge_sort(int *A, int p, int r) void MergeSort(int *A, int n) |
[InversionPair]
inversionPair只需要在merge函数中增加3行代码记录即可。先将inversion_pairs初始化为0,当L[i]>R[j]时,更新inversion_pairs=inversion_pairs+(n1-i),最后返回即可。同时在merge_sort中返回left_pair,right_pair和corss_pair之和即可。
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/*
version: 1.0 author: hellogiser blog: http://www.cnblogs.com/hellogiser date: 2014/6/25 */ int merge_pair(int *A, int p, int q, int r) { //Li: p...q Rj: q+1...r ; ; ]; ]; // copy L and R ; i < n1; i++) L[i] = A[p + i]; ; j < n2; j++) R[i] = A[q + + j]; // mark end L[n1] = INT_MAX; R[n2] = INT_MAX; ; // left ; // right ; // whole //============================ ; //============================ for (k = p; k <= r; k++) { if (L[i] <= R[j]) { A[k] = L[i]; i++; } else { // L[i]>R[j] A[k] = R[j]; j++; //============================ inversion_pairs += (n1 - i); //============================ } } delete []L; int inversion_pair(int *A, int p, int r) int InversionPair(int *A, int n) |
【链接】
http://www.cnblogs.com/bovine/archive/2011/09/22/2185006.html
http://blog.csdn.net/zhanglei8893/article/details/6230233
【本文链接】
http://www.cnblogs.com/hellogiser/p/inversion-pairs-by-merge-sort.html
1.7 逆序数与归并排序[inversion pairs by merge sort]的更多相关文章
- ACM_逆序数(归并排序)
帮挂科 Time Limit: 2000/1000ms (Java/Others) 64bit IO Format: %lld & %llu Problem Description: 冬瓜发现 ...
- 逆序数 HDOJ 4911 Inversion
题目传送门 题意:可以交换两个相邻的数字顺序k次,问最后逆序对最少有多少 分析:根据逆序数的定理如果逆序数大于0,那么必定存在1<=i<n使得i和i+1交换后逆序数减1假设原逆序数为cnt ...
- POJ 2299 Ultra-QuickSort 求逆序数 (归并或者数状数组)此题为树状数组入门题!!!
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 70674 Accepted: 26538 ...
- 逆序数 UVALive 6508 Permutation Graphs
题目传送门 /* 题意:给了两行的数字,相同的数字连线,问中间交点的个数 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 用归并排序或线段树求.想到了就简单了 ...
- ACM_小明滚出去?(求逆序数)
小明滚出去? Time Limit: 2000/1000ms (Java/Others) Problem Description: 老师:“小明,写一个排序算法”: 小明: void mysort(i ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)
题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...
- hdu 4911 Inversion (分治 归并排序 求逆序数)
题目链接 题意:给n个数,求交换k次相邻的数之后的最小的逆序数对. 用分治的方法,以前在poj上做过这种题,昨天比赛的时候忘了.... 下面的归并排序还是以前的模板. #include <ios ...
- HDU 4911 Inversion (逆序数 归并排序)
Inversion 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/A Description bobo has a sequen ...
随机推荐
- Maven 初学(一)基本概念
Pom中有三个主要元素 Groupid,artifactid,version goupid 是一个组织唯一的标识 例如 com.ibm.www artifactid 是一个工程呢ID ...
- Linux安装卸载JDK(1.7 rpm)
一.卸载系统已有的JDK 1.查看已安装的jdk rpm -qa|grep jdk 2.卸载jdk rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66. ...
- 金融自助设备WOSA/XFS规范介绍
wosa(全称是windows开放式系统体系结构 windows open system architecture),是微软公司提出的一种在windows操作系统下的软件架构. wosa/xfs是基于 ...
- SpringMVC配置
博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 4 文章- 1 评论- 0 搭建springmvc框架的另一种思路 在一个完整的项目里搭建springmvc框架的时候, 通常情况下,初学者 ...
- KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)
继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进 ...
- P1049送给圣诞夜的礼品(矩阵十大问题之四)
https://vijos.org/p/1049 P1049送给圣诞夜的礼品 Accepted 标签:组合数学送给圣诞夜的礼物[显示标签] 返回代码界面 | 关闭 Pascal Pasca ...
- spring属性依赖注入
一.构造方法方式注入 1.项目结构如下: 2.新建Customer类 package hjp.spring.attributeinject; public class Customer { priva ...
- 本地与在线图片转Base64及图片预览
查看效果:http://sandbox.runjs.cn/show/tgvbo9nq 本地图片转Base64(从而可以预览图片): function localImgLoad() { var src ...
- IIS短文件名泄露漏洞危害及防范方法
危害级别:轻微 IIS短文件名泄露漏洞 WASC Threat Classification 描述: Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件 ...
- 使用spring集成hibernate
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...