• 摊还分析


    • 聚合分析
      • 最坏情况下每个操作的平均势能, 并不涉及概率
      • 栈操作
        • 引入上界的限制: PUSH。MUTIPOP 的操作建立在 PUSH 之上, 没有 PUSH 就没有 MULTIPOP
      • 二进制计数器递增
        • 原始的上界是 O( K ), 但是这个界并不是紧的
        • 对每一种操作分别分析, 求和再除以 N
      • 总结
        • 栈操作和二进制计数器递增的 common 在于分析了操作的种类。 比如, 栈操作使用了 PUSH, MULIPOP, POP。 二进制计数器使用了第1位的翻转,第二位的翻转, 第三位的翻转
        • 都将各个操作的时间代价求和,并除以操作次数
        • 栈操作还算比较直接, 但是二进制计数器递增就有些技巧,不太容易看到紧的上界
      • 启示
        • 栈操作
        • 二进制计数器递增
          •   时间复杂度好低
    • 核算法
      • 看完核算法, 感觉非常有意思, 在进入的时候,就已经把退路想好了
      • 栈操作
        • PUSH 元素的时候,就把要弹出时的时间代价放进来了, 这样, POP 或者 MULTIPOP 就不需要代价了 --- 这也就保证了时间代价全由 PUSH 操作引起, 且很容易计算 PUSH 操作的总时间代价, 相当于用一个好求的量来代替复杂度量
      • 二进制计数器递增
        • 已知的是, 每 +1 至多有一位从 0 ->1
        • 当 0 -> 1的时候, 存上 2 的代价, 这样 1->0 的时候,就不需要耗费能量了, N 次操作最多翻 N 位, 每位 2N
    • 势能法
    • 总结
      • 总是有一些操作(A)多付钱, 而其他操作(B)不付钱或少付钱。 这些多付钱的操作有一个明显的特点, 就是好计算
      • 好计算表现在 A 这个集合所含的操作少且简单, B 所含的操作多且复杂, B与A的操作互补且 A>=B
  • 相关阅读:
    【leetcode】Valid Palindrome
    【leetcode】Longest Common Prefix
    【leetcode】Intersection of Two Linked Lists
    【leetcode】Compare Version Numbers
    【leetcode】Pascal's Triangle
    ubuntu 14.04下spark简易安装
    【leetcode】Number of 1 Bits
    【leetcode】LRU Cache
    【leetcode】Container With Most Water
    【leetcode】Roman to Integer
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3079520.html
Copyright © 2020-2023  润新知