第十二章 Amortized Analysis平摊分析

news/2024/7/2 23:31:40

第12章 Amortized Analysis平摊分析

第10周

记于2022/11/29

概率分析与平摊分析的区别

  • 概率分析
    • 平均执行时间
      • 考虑同一算法的所有可能输入情况
      • 如果使用概率,则称为期望运行时间
      • 针对单一操作/算法
  • 平摊分析
    • 针对某一数据结构的 操作序列
    • 不使用概率
    • 操作序列中的平均操作性能/代价【主要针对对象】
      • 操作代价可能不同,其中有些代价巨大

平摊分析策略

聚集分析

  • n个操作的序列最坏情况下花费总时间为T(n)

  • T(n) / n每个操作的平均代价(或摊还代价)

  • image-20221129165334892image-20221129165349084

  • image-20221129165247797image-20221129165527980

  • image-20221129165624873 - A[0]位每次都会进行反转,总共进行n次 - A[1]位每间隔一次进行反转,共计n/2向下取整 .... - A[i]位,n/(2^i)
  • 对于n个累加的序列,最坏情况运行时间为O(n),因此每一个操作的平摊成本/【平均成本】为O(1)

记账方法 / 核算法

  • 【为不同的操作分配不同的费用 ,费用的金额称为**平摊成本**】
  • 每个操作赋予一个(不同的)平摊代价
  • 平摊代价高于其实际代价 / 平摊成本大于实际成本
    • 差值称为某一操作的存款(credit),如果存款不足则无法进行该操作
  • 存款用于补偿以后那些平摊代价低于实际代价的操作
  • 假设用 ci 表示第i个操作的实际成本/真实代价,用 ci` 表示其平摊成本/摊还代价
  • 满足:image-20221129204451818
  • 适用于所有的操作序列,因此要求总的平摊成本作为总的实际成本的上限,总的平摊成本 - 总的实际成本>=0
  • 在中间任意时刻,都要保持总的平摊成本 - 总的实际成本>=0
  • image-20221129211038656 - PUSH 的**摊还代价**为 2 ,是因为其中有一个1给PUSH操作,还有一个1是因为现在压入一个数据将来要出栈,需要预留一个POP操作的成本 - 每个操作的平摊成本为O(1) - 对于二进制计数器,如果用1¥代表每次操作的成本,flip of one bit就代表花1¥,那么如果某位由0变为1给出的平摊成本为多少? **2¥,1¥用于支付现在由0->1的费用(实际成本),1¥存起来用于支付将来由1->0的费用** - 每次操作最多置 1 bit,因此一个操作的平摊成本最多为2¥ - 因此,n次操作总的平摊成本为O(n),平均每次的成本为O(1)

势能方法

  • 类似记账方法

  • 存款不是某一操作的,而是整个数据结构的势(Potential);预付的不是存款,而是一种“势能”,将势能释放即可以用来支付未来操作的代价

  • image-20221130192819228 - 总的平摊成本=总的实际成本 + 势能的总变化
  • 栈操作

    • image-20221130195039535
    • image-20221130195917093
    • 势能等于栈中元素的个数
  • 二进制计数器

    • image-20221130201314093
    • 势能应该为某次操作后计数器中 1 的个数! 因为0的个数只影响当前这一位,这一位完全可以用现在已有的势能来支付其开销
    • 如果bi>0(中间计数状态),bi等于原来的1的个数,减去重置个数,再加一个新set为1的个数
    • 实际成本ci为ti+1,平摊成本<=2

动态表

  • 操作:表插入、表删除

  • 应用场景

    • 哈希表
    • 事先不知道表的大小;随插入而扩展;随删除而收缩
  • 目标

    • 得到O(1)的平摊成本
    • 未使用的空间 <= 已经使用的空间
  • 负载系数α = num/size

    • 如果size=0,则num=0,α=1
    • 不允许α>1 (目标2)
  • 表空间满了则size加倍,保证α >= 1/2

  • Insertimage-20221130210527628

    • 聚集分析
      • image-20221130210819265
      • image-20221130211037214
    • 记账方法:插入x 收费3¥ :1¥-> x实际插入费用 1¥ -> 将来删除x的费用 1¥ -> 其他项目【移动的费用】
    • 势能方法:
      • image-20221130213455433
      • image-20221130213509310
      • image-20221130213522365
  • Expansion

    • image-20221130213721563
    • image-20221130213751320
  • Strategy

    • image-20221130213906761
    • image-20221130213921888
    • image-20221130213954197
    • image-20221130214010603

http://lihuaxi.xjx100.cn/news/307407.html

相关文章

效率工具之Arthas

Arthas 阿里巴巴开源的Java诊断工具&#xff1b;追踪方法执行链、反编译、监控JVM状态 在线安装 使用 1. trace 跟踪调用链 解决痛点&#xff1a;定位问题根据日志推理分析&#xff0c;方法出入参不可见&#xff0c;分支判断太多情况下 定位很慢&#xff0c;分析出可能有问…

html5期末大作业——HTML+CSS公益关爱残疾人( 6个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

C++-关键字:auto

C98 auto 早在C98标准中就存在了auto关键字&#xff0c;那时的auto用于声明变量为自动变量&#xff0c;自动变量意为拥有自动的生命期&#xff0c;这是多余的&#xff0c;因为就算不使用auto声明&#xff0c;变量依旧拥有自动的生命期&#xff1a; int a 10 ; //拥有自动生命…

【算法】排序——直接排序

内部排序的全部过程都是在内存中进行的。按排序策略的不同可以将内部排序划分为直接插入排序、冒泡排序、简单选择排序、希尔排序、快速排序、堆排序、归并排序、基数排序等。其中前三种排序方法属于简单的排序方法&#xff0c;其特点是排序过程直观、易于理解和实现&#xff0…

Http协议和Https协议

Http是不安全的&#xff0c;你的数据容易被黑客拦截&#xff0c;篡改&#xff0c;攻击 https要求对数据加密&#xff08;不能明文传输&#xff09;, 用抓包工具抓http请求&#xff0c;抓出来的都是明文的&#xff0c;你能看得懂的&#xff0c;抓https请求&#xff0c;抓出来的…

实战-COVID-19-KSH(html+ python +django +爬虫 +pyecharts 实时疫情动态)内附MySQL详细安装配置教程

GitHub代码 Windows10 python3.7 一、MySQL配置 1.官网下载地址 2.配置初始化文件my.ini 解压后在根目录下创建my.ini文件&#xff08;建立.txt-修改扩展名为.int即可&#xff09; 打开my.ini文件&#xff0c;输入以下内容&#xff08;注意需要改动2处&#xff09;&#x…

Arduino开发实例-DIY风速测量及显示

DIY风速测量及显示 1、应用介绍 本次实例将使用一款具有 NPN 脉冲输出的数字风速计传感器。 NPN脉冲输出风速计效果好,性价比高。另外它仅在 5V 电源下工作。 在本次实例中,将此风速计传感器与 Arduino 板和 0.96 英寸 OLED 显示屏连接。 OLED显示屏将以米/秒为单位显示风速…

LeetCode_回溯_中等_1774.最接近目标价格的甜点成本

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 你打算做甜点&#xff0c;现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则&#xff1a; 必须选择 一种 冰激凌基料。可以添加 一种或多种 配料&#xff0c;也…