求数列的逆序数对数问题
2011-08-29 17:09
176 查看
问题:对于一个数字数组,如(1,3,5,4,2),假定我们要求的是从小到大数列的逆序数对,则其中(5,4)就是一组逆序数。
解决方法:求一个数列中所有的逆序数对,可以采用递归与分治的思想,借助归并排序来完成。
一个数列的逆序数对,等于【它的两个子序列各自内部的逆序数对】与【两个数列之间的逆序数对】之和。
单独看这个思路,会觉得很很麻烦,因为还得求数列间的逆序数对。但是借助归并排序,我们可以发现,在两个数列合并的时候,从后面的那个数列中取出一个元素的时候,前面的数列中还剩余的元素个数,既是与该取出的元素逆序的元素个数。当从前面数列中取出元素的时候,不进行计算。
例:合并数列(1,3,5)与(2,4)的时候,先取出前面数列中的1,此时不计算;然后取出后面数列中的2,此时前面数列中剩余两个元素3,5,则与2逆序的数有两个;依次类推,最后可得到总逆序数对是2+1=3。
这样就解决了求【两个数列之间的逆序数对】的问题。而【它的两个子序列各自内部的逆序数对】则可以继续分为更小的数列,利用前面介绍的方法来解决。
解决方法:求一个数列中所有的逆序数对,可以采用递归与分治的思想,借助归并排序来完成。
一个数列的逆序数对,等于【它的两个子序列各自内部的逆序数对】与【两个数列之间的逆序数对】之和。
单独看这个思路,会觉得很很麻烦,因为还得求数列间的逆序数对。但是借助归并排序,我们可以发现,在两个数列合并的时候,从后面的那个数列中取出一个元素的时候,前面的数列中还剩余的元素个数,既是与该取出的元素逆序的元素个数。当从前面数列中取出元素的时候,不进行计算。
例:合并数列(1,3,5)与(2,4)的时候,先取出前面数列中的1,此时不计算;然后取出后面数列中的2,此时前面数列中剩余两个元素3,5,则与2逆序的数有两个;依次类推,最后可得到总逆序数对是2+1=3。
这样就解决了求【两个数列之间的逆序数对】的问题。而【它的两个子序列各自内部的逆序数对】则可以继续分为更小的数列,利用前面介绍的方法来解决。
相关文章推荐
- 采用归并排序思想解决逆序对数问题
- 【挑战程序设计竞赛】分治法求一个数列逆序对的对数
- 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,
- 哈理工OJ 2224 逆序对问题(利用归并排序求逆序数对数)
- 算法初级01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题
- 逆序对的相关问题:bzoj1831,bzoj2431
- 递归求解兔子对数问题
- 哈理工OJ 1289 对数问题
- [haoi2009]逆序对数列
- [HAOI2009]逆序对数列
- [分治]-集合划分问题 [分治]-逆序对问题
- 逆序对问题的两种解决策略
- bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
- T4869 某种数列问题 (jx.cpp/c/pas) 1000MS 256MB
- 2018年1月22日 (getchar+竖式问题+逆序输出+开灯问题+蛇形填数)
- POJ 2591 1338 2545 2247(数列递归衍生问题,思路挺妙)
- 树状数组与逆序对数
- 算法编程题4-单词逆序问题
- 2431: [HAOI2009]逆序对数列
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题