• trade可撤销贪心正确性证明


    鉴于tarde这道题正解过于好写,导致我对这个诡异的贪心的正确性产生了疑问,所以花了2h的时间与同机房神犇M-Blanca,Midoria7,goote~进行讨论,最后与goote~犇犇各得出了一个正确性证明:

    1. 贪心算法步步最优的证明:
      新加入一个值k,它能对前面产生的贡献就是:
    • 如果前面的某个值j是商品卖出的地方,我们可以撤销这次卖出(j-i),并从新加入的地方卖出(k-i),答案增加了(k-j)。
    • 如果前面某个值j是不买不卖的地方,我们可能的贡献是k-j(在j买入,k卖出)。
    • 所以新加入的这个k对前面的最大贡献就是在1~k-1中找一个比他小的最小的j(j是卖出的地方或者是不买不卖的地方)。然后加上贡献k-j。
    • 如果要求合法的加贡献的方式,其实也就这两种,如果要求一个本来是卖出的点就j强行买入并在k卖出,那么原来的j-i的贡献消失,加上k-j的贡献,是不如直接“撤销j”,直接加上k-j的贡献来的优的。
    • 而加入小根堆中的数只会是可撤销的或是不买不卖的,所以自动就维护出最小了,直接转移一定是最优解。

    2.步步最优推向全局最优:
    我们注意到,对于一种最优情况,在它后面再加入一个新数产生贡献的时候,产生的最大贡献根据上面是一定的。对于1~k-1的划分方式,我们根据上面的贪心算法,买~卖关系已经是一定的了,但是我们想到对于一个不那么优的买~卖关系划分方式,可能加贡献加的更多(因为有可能有一些较小的点由卖出的变成了不买不卖的了,从而使新加的值减去他贡献更大),这样的答案会更优吗(即经典的贪心局部最优是否是全局最优)。

    • 根据goote犇犇的说法:切换成非最优分配方式会使减数不变或增大而导致不会出现更优解。

    什么意思呢?
    就是每一种分配方式的答案一定是这里面的卖出的点的值的和作为被减数,买入的点的值的和作为减数,然后这样一减出答案。
    而局部最优解中一定是能保证该区间内被减数-减数的值是最大的。
    如果切换配对方式,那么可能有的买入点变成了卖出点,而卖出点反而变成了买入点,这样会导致被减数减小,而减数增大(因为之前满足最优,那一定是被减数-减数结果最大的情况),然后这时候我们新加一个点k。

    • 如果k足够大,就把k放进被减数的集合里,这时候在前面找一个数j与他匹配,j加入减数集合。这时候,j要么是最优解减数集合中的一个减数,要么是比最优解减数集合中的任何一个减数都大,(这个最优解一定会囊括所有的小减数,所以可以认为最优解集合中的减数是所有可能中最小的),根据刚才的结果,我们得出较劣解转移过来的减数集合是不会比最优解转移过来的减数集合小的,而被减数集合较劣解也不会比最优解大,所以最后的答案较劣解是不可能大于最优解的。
    • 如果k很小,那根本没法把他放进被减数集合里,那当前答案没有被更新,显然最优解也是更优的。
      综上所述,局部最优解转移过来的还是最优的,那么就是全局最优辣!
  • 相关阅读:
    闪电侠 Netty 小册里的骚操作
    面试被问烂的 Spring IOC(求求你别再问了)
    面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)
    使用 Cglib 实现多重代理
    Redis 初次见面
    Apollo 10 — adminService 全量发布
    Apollo 9 — adminService 主/灰度版本发布
    简析限流算法
    Dubbo 源码分析
    Dubbo 源码分析
  • 原文地址:https://www.cnblogs.com/liu-yi-tong/p/13786530.html
Copyright © 2020-2023  润新知