首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
O(n*lgn)时间复杂度的逆序对统计算法实现思想
时间:
2015-03-28 17:16:05
阅读:
355
评论:
0
收藏:
0
[点我收藏+]
标签:
算法
归并排序
逆序对定义:设A[1..n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i] > A[j],则(i,j)就称为A中的一个逆序对(inversion)。
现给出一个算法,其可以用O(n*lgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数量。
简单的算法实现思想:我们可以单纯的通过从前往后的逐一比对来确定逆序对的数量,虽然实现简单,但这样一来时间复杂度将会上升为O(n*n),不符合我们的要求。
改进的算法实现思想:众所周知归并排序的时间复杂度为O(cn*lgn + cn),其中c为常数。因此我们可以通过对归并排序算法稍加改进来达到目的。即在每一次归并两个子数组的同时以左边的子数组的最大值为基准比对右边的子数组中的每个元素,只要左边子数组的最大值未复制回上层数组中,右边数组中所有已经复制到上层数组中的元素均对应一个逆序对,当左边子数组最大值被复制到上层后,如果右边子数组未复制完毕,则将右边最大子数组中的其余元素复制到上层对应位置,若右子数组已经复制完毕则不做任何操作,并终止当前层逆序对计数。例如在归并排序的某一层中有如下两个子序列:
左数组:2 5 9 12
右数组:3 7 7 19
由于左右数组都是有序的,那么当前层所有所有元素被复制回上层后共出现了3个逆序对,分别由右数组的3、7、7分别产生的,之后将右边子数组中的19复制到上层中。最终经层层处理最终可以统计出数组中逆序对的总数量。
时间复杂读分析:不难发现,求逆序对的时间和归并排序大体相当,为O(cn*lgn + cn).若c等于1则简化为O(n*lgn + n),也即O(n*(lgn + 1))。
O(n*lgn)时间复杂度的逆序对统计算法实现思想
标签:
算法
归并排序
原文地址:http://blog.csdn.net/gaoxueyi551/article/details/44702963
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!