博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOI2018 冒泡排序规律证明
阅读量:5163 次
发布时间:2019-06-13

本文共 1079 字,大约阅读时间需要 3 分钟。

其实网上对于找到规律之后的部分已经讲的很详细了,在这里只较为严谨的证明一遍这个规律(毕竟网上不少人都说"打表可得")。

首先,我们考虑,对于排列中的一个数i,它对于逆序对的贡献的下界一定是|i-pi|。(这里认为逆序对是有序数对)

假如pi<i,那么就算它前面的都比它小,那么也至少有i-pi个数在它面前但是比他小,而其他的情况都不会比这种情况少。pi>i的情况类似。

我们设在pi<i时,对于i,在他前面有k个数比i大。

那么,i对逆序对的贡献就是k+(n-pi)-(n-i-k)=i-pi+2k

这个式子中的k是前面比它大的数和它形成的逆序对;(n-pi)是在i前面的数的个数;(n-i-k)的意思是在i之后比i大的数,因为比i大的数一共有n-i个,在i前面有k个,故在i后面有n-i-k个;(n-pi)-(n-i-k)一起表示在i之后的比i小的数。

而对于pi>i时,设在i之后且小于i的数有k个,用同样的方法可以推出i对逆序对的贡献就是k+(n-pi)-(n-i-k)=pi-i+2k。

综上,一个排列中的任意一个数i对逆序对的贡献就是|i-pi|+2k。因为我们要让总的逆序对数=sigma |i-pi|,那么对于任意一个数,k都应该为零。

k为0意味着什么?

对于一个数i,若pi<i,则它前面的数都比他小;反之,则它后面的数都比他大。(下文称此为条件1)

然后我们来证明,条件1和“排列中不存在长度大于2的下降子序列”(下文称此为“条件2”)完全等价。

命题1:不满足条件2的排列一定不满足条件1。

如果一个排列中有长度大于2的下降子序列,那么对于这个下降子序列的中间的任意一个数(中间是指不在这个下降子序列的两端)一定不满足条件1。

想一想,它的前面至少有一个比它大的,后面有一个比它小的,那么,不管是i<pi还是i>pi都不满足条件1.

命题2:满足条件2的排列一定满足条件1。

考虑排列中的任意一个数,他可能是i>pi,也可能反过来,这里只讨论i<pi的情况。

对于i<pi,因为满足条件2,所以对于i,只可能有两种情况:1.有一个比它大的数在它前面,它后面的数都比它大;2.有一个比它小的数在它后面,它前面的数都比它小。

 情况2是不存在的的,因为有一个比它大的数在它前面,而一定至少有一个比它小的数在它后面(i前面的位置不够,不能放下所有比i小的数),违背了条件1,自相矛盾。

对于情况1,他是满足条件1的。

故证毕。

转载于:https://www.cnblogs.com/thedreammaker/p/11011195.html

你可能感兴趣的文章
ORACLE表空间详解
查看>>
BZOJ5190 Usaco2018 Jan Stamp Painting(动态规划)
查看>>
保留小数点三位
查看>>
JavaEE之注解
查看>>
飞机大战项目
查看>>
JZYZOJ1383 [usaco2003feb]impster 位运算 最短路
查看>>
poj_3627Bookshelf
查看>>
java输入输入流图解
查看>>
html5改良的input元素的种类
查看>>
python人脸识别开源库face_recognition
查看>>
【神经网络与深度学习】转-caffe安装吐血总结
查看>>
【VS开发】进程线程及堆栈关系的总结
查看>>
vue三、示例
查看>>
计算机网络资料 - 转
查看>>
string中substr,find函数使用
查看>>
前台后台数据的传递
查看>>
hive基本操作与应用
查看>>
Net基础篇_学习笔记_第十天_方法_方法的练习
查看>>
网站与域名知识扫盲
查看>>
angular自定义指令
查看>>