zoukankan      html  css  js  c++  java
  • NOI2018 冒泡排序规律证明

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

    首先,我们考虑,对于排列中的一个数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的。

    故证毕。

  • 相关阅读:
    jQuery(八):属性操作
    jQuery(七):节点操作
    jQuery(六):value值操作
    jQuery(五):文本操作
    jQuery(四):HTML代码操作
    jQuery(三):样式操作
    jQuery(二):jQuery选择器
    JavaScript(九):JavaScript中的内置对象
    JavaScript(五):变量的作用域
    如何让命名变得优雅
  • 原文地址:https://www.cnblogs.com/thedreammaker/p/11011195.html
Copyright © 2011-2022 走看看