当前位置: 首页 > news >正文

算法导论【摊还分析】—聚合分析、核算法、势能法

算法导论【摊还分析】—聚合分析、核算法、势能法

    • 聚合分析
    • 核算法
    • 势能法

假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时,第 i 个操作的代价为 i,否则代价为 1

聚合分析

总共有n个操作,1,2,4.....,2⌊lg⁡n⌋1,2,4.....,2^{⌊\lg n⌋}1,2,4.....,2lgn,其中有至多k=⌈lg⁡n⌉k=⌈\lg n⌉k=lgn个操作序号为2的幂,则
S=∑k=0⌊lg⁡n⌋2k+(n−⌈lg⁡n⌉)∗1=1∗(1−2⌊lg⁡n⌋+1)1−2+n−⌈lg⁡n⌉=2⌊lg⁡n⌋+1−1+n−⌈lg⁡n⌉=≤3n−⌈lg⁡n⌉−1=O(n)\begin{aligned} S&=\sum_{k=0}^{⌊\lg n⌋}2^k+(n-⌈\lg n⌉)*1\\ &=\cfrac{1*(1-2^{⌊\lg n⌋+1})}{1-2}+n-⌈\lg n⌉\\ &=2^{⌊\lg n⌋+1}-1+n-⌈\lg n⌉\\ &=\le3n-⌈\lg n⌉-1\\ &=O(n) \end{aligned} S=k=0lgn2k+(nlgn⌉)1=121(12lgn+1)+nlgn=2lgn+11+nlgn=≤3nlgn1=O(n)
所以每个操作的摊还时间代价为O(n)n=O(1)\cfrac{O(n)}{n}=O(1)nO(n)=O(1)

核算法

设每个操作的代价都为333
2k−1+1到第2k−12^{k-1}+1到第2^{k}-12k1+1到第2k1个操作为非2的幂,多付的代价为2∗(2k−1−1−1+1)=2k−22*(2^{k-1}-1-1+1)=2^k-22(2k111+1)=2k2在第2k2^k2k个次操作付的代价为333,则可以用于支付第2k2^k2k次操作的信用为2k−2+3=2k+1>2k2^k-2+3=2^k+1>2^k2k2+3=2k+1>2k大于第2k2^k2k次操作应该付的代价,故每个操作的摊还代价为O(1)O(1)O(1)

势能法

设势函数为
Φ(D0)=0Φ(Di)=2(i−2lg⁡⌊i⌋)\Phi (D_0) = 0\\ \Phi(D_i) = 2(i-2^{\lg⌊i⌋})\\ Φ(D0)=0Φ(Di)=2(i2lgi)

  1. 当i为2的幂时,2⌊lg⁡i⌋=i,⌊lg⁡(i−1)⌋+1=⌊lg⁡i⌋2^{⌊\lg i⌋}=i,⌊\lg (i-1)⌋+1=⌊\lg i⌋2lgi=i,lg(i1)⌋+1=lgi
    c^i=ci+Φ(Di)−Φ(Di−1)=i+2(i−2⌊lg⁡i⌋)−2(i−1−2⌊lg⁡i−1⌋)=i+2i−2i+2−2⌊lg⁡i⌋+1+2⌊lg⁡i⌋+1=i−i−2⌊lg⁡i⌋+2⌊lg⁡i⌋+1+2=2\begin{aligned} \hat c_i&=c_i+\Phi(D_i)-\Phi(D_{i-1})\\ &=i+2(i-2^{⌊\lg i⌋})- 2(i-1-2^{⌊\lg i-1⌋})\\ &=i+2i-2i+2-2^{⌊\lg i⌋+1}+2^{⌊\lg i⌋+1}\\ &=i-i-2^{⌊\lg i⌋}+2^{⌊\lg i⌋+1}+2\\ &=2 \end{aligned} c^i=ci+Φ(Di)Φ(Di1)=i+2(i2lgi)2(i12lgi1)=i+2i2i+22lgi+1+2lgi+1=ii2lgi+2lgi+1+2=2
  2. 当i不为2的幂时,2⌊lg⁡(i−1)⌋=2⌊lg⁡i⌋2^{⌊\lg (i-1)⌋}=2^{⌊\lg i⌋}2lg(i1)⌋=2lgi
    c^i=ci+Φ(Di)−Φ(Di−1)=1+2(i−2⌊lg⁡i⌋)−2(i−1−2⌊lg⁡i−1⌋)=1+2i−2i+2−2(2⌊lg⁡i⌋−2⌊lg⁡i−1⌋)=1+2=3\begin{aligned} \hat c_i&=c_i+\Phi(D_i)-\Phi(D_{i-1})\\ &=1+2(i-2^{⌊\lg i⌋})- 2(i-1-2^{⌊\lg i-1⌋})\\ &=1+2i-2i+2-2(2^{⌊\lg i⌋}-2^{⌊\lg i-1⌋})\\ &=1+2\\ &=3 \end{aligned} c^i=ci+Φ(Di)Φ(Di1)=1+2(i2lgi)2(i12lgi1)=1+2i2i+22(2lgi2lgi1)=1+2=3
    故每个操作摊还复杂度为O(1)O(1)O(1)
http://www.lryc.cn/news/12710.html

相关文章:

  • 【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version
  • Python 之 Pandas Series 数据结构
  • 【java基础】Java常用类———包装类
  • linux shell 入门学习笔记3 shebang
  • 写作小课堂:简历模版【A4纸正反两面】(20230219)
  • 一文搞懂 DevOps
  • 深入讲解Kubernetes架构-租约
  • 微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包
  • Python3-基本数据类型
  • RPA落地指南:什么是RPA
  • 跨域问题的三种解决办法
  • c++提高篇——string容器
  • [软件工程导论(第六版)]第6章 详细设计(复习笔记)
  • RabbitMQ核心内容:实战教程(java)
  • RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法
  • 微信头像昵称获取能力的变化导致了我半年没更新小程序
  • 【深度学习编译器系列】1. 为什么需要深度学习编译器?
  • 数据结构与算法总结整理(超级全的哦!)
  • DPDK — MALLOC 堆内存管理组件
  • 分享113个HTML艺术时尚模板,总有一款适合您
  • 2023年美赛C题Wordle预测问题一建模及Python代码详细讲解
  • 小米12s ultra,索尼xperia1 iv,数码相机 拍照对比
  • C++笔记 模板的进阶知识
  • 基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
  • 【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)
  • Spring Boot中使用@Autowire装配接口是怎么回事?
  • 23种设计模式介绍(Python示例讲解)
  • 初识Hadoop,走进大数据世界
  • 加油站会员管理小程序实战开发教程14 会员充值
  • leetcode 1792. 最大平均通过率