平摊分析(Amortized analysis)

2023-11-12

今天我们主要讨论所谓的平摊分析(amortized analysis),它是用来分析一系列操作的平均所需要的代价。可能有人会问它利用概率论的知识,通过概率来求平均情况。答案是否定的,它并不涉及概率。在一些情况下平摊分析能够很好的帮助我们分析我们程序的代价或者消耗。
这部分主要有三个内容,如图所示:这里写图片描述

1. 聚合分析(aggregate)

聚合分析比较简单。它就是执行n次操作的最坏情况(worst case)下时间为 T(n) , 所以平均时间为 T(n)/n . 接下来我们用一个示例展示一下。

1.1 栈操作

我们都知道栈的push() 和pop() 操作的代价都是 O(1) , 如果它们共同操作n次的话,真实时间(actual time) Θ(n) .这时我们将其平均化则只有 O(1) .

2. 核算法(The accounting method)

核算法是针对不同的操作有不同的平摊分析,同时我们利用平摊代价作为整个操作的上界。而

=+credit
且信用的定义是这样的:当一个操作的平摊代价超出其实际代价时,我们将差额存入数据结构中的特定对象,存入的差额就是信用[1]。同时我们用 c^i 表示平摊代价, 而用 ci 表示实际代价,且我们认为信用不为负数,所以我们有这样的关系
i=1nc^ii=1nci(2.1)
下面我们直接引入例子:

2.1 栈操作

push()操作平摊代价为2, 1个用来真实操作的代价,而另一个1用来从当信用(credit), 而信用用来支付未来某些操作的真实代价(如pop()操作)。
pop()操作平摊代价为0
通过公式 2.1 的计算我们可以算出一个先push()操作 p 次,后pop()操作q次,且 q+p=n(pq) ,我们可以计算出它的平摊时间和实际时间:

i=1nc^i=2p(credits)(pq)i=1nci=i=1nc^icredits=2p(pq)=p+q=n:p>q,n/2pnso:n2n

所以综上总的平摊时间和实际时间都是O(n)

3. 势能法(The potential method)

势能法和我们上述描述的核算法不同的地方在于它针对的是整个数据结构,而不是特定的数据操作。它像我们高中学的物理势能差不多,当势能升高,存储的势能可以用来为将来的操作进行付费从而势能降低。对于最初的数据结构我们用 D0 表示,而在第 i 次操作后的数据结构状态为Di表示。
同时在这里我们用 c^i 表示第 i 次操作的平摊代价, 用ci表示第 i 次操作的真实代价,而用Φ(Di)表示第 i 次操作后的
而至于每次的平摊代价为:

c^i=ci+Φ(Di)Φ(Di1)(3.1)

所以我们的总的平摊代价为:
i=1nc^i=i=1n(ci+Φ(Di)Φ(Di1))          =i=1nci+Φ(Dn)Φ(D0)(3.2)

我们将 3.2 的公式变形可得实际代价:
i=1nci=i=1nc^iΦ(Dn)+Φ(D0)(3.3)

由于整个数据结构的势能是不能为负的,且我们认为 Φ(D0)=0 , 所以很容易得:
i=1nc^ii=1nci(3. 4)

下面我用例子详细分析势能法:

3.1栈操作

push() 的真实代价为 1 ,且会增加1个势能
pop() 的真实代价为 1 , 且会减少1个势能
现有 p push()操作和 q pop()操作,且 p+q=n,pq
w我们先利用公式 3.2 求其总的平摊代价:

i=1nc^i=i=1p(ci+Φ(Di)Φ(Di1))+i=p+1n(ci+Φ(Di)Φ(Di1))           =2p+0=2p(3.5)

可能会有人会问为什么我们不用公式 3.2 的第 2 个公式来算,而只是用最原始的公式算?那是因为如果我们用第2个公式,能解决许多问题的话,我们就不需要平摊分析了(因为我们利用平摊分析是来计算真实代价的,第2个式子的总的真实代价需要我们知道的)。这是因为在许多问题中, 每次的平摊代价很容易求, 而真实代价却异常难。
在解释一下:当 0ip 时,即每次的 push() 操作的平摊代价为 c^i=1(actualcost)+1(potential)=2 ;当 p+1in 时,即每次的 pop() 操作的平摊代价为 c^i=1(actualcost)(1)(potential)=0 en: Φ(Dn)=pq(3.6) j将公式 3.5 3.6 代入到 3.3 中去得:
i=1nci=2p(pq)=p+q=n

所以 n 次的push() pop() 操作的真实代价是 O(n) , 也不难求出总平摊代价为 O(n) .

4. 总结

1)为什么叫聚合分析(aggregate analysis)?
那是因为它把n操作的总代价加起来为 f(n) , 而平摊到每次的操作则为 f(n)/n .
2 )为什么叫做核算法(the accounting method)?
首先我们考虑只有先有 push() 操作,然后才会有 pop 操作, 所以我们把以后可能执行的 pop() 操作所需要的代价当做 (credit) 存储起来,当我们实际当中执行 pop() 操作时,我们就用我们预先的信用来支付就行了。
3 ) 为什么叫是能法?
用上面最初的高中物理势能知识理解。
4)核算法和势能法都是将 作为 的最大 。当两种方法都求解不真实的代价的话,我们只好还有一个上界值得我们去考虑(往往这个上界对我们的程序分析往往很有用)。

感谢

j本文是基于《算法导论》写的,最主要的是有本人大量的心得体会,感谢《算法导论》的那些作者Thomas H.Cormen、Charles E.Leiserson等 人。如果有错误的请留言,不甚感激。谢谢。

参考

[1] 《算法导论》Thomas H.Cormen、Charles E.Leiserson等 第三版第17章 “摊还分析” p261

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平摊分析(Amortized analysis) 的相关文章

  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 解开 Knuth 的结:如何重构意大利面条式代码?

    这个问题的灵感来自如何将流程图转化为实施 https stackoverflow com questions 36647765它询问如何通过算法消除goto代码中的语句 这answer https stackoverflow com a 3
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea

随机推荐

  • 激光灯

    激光等中使用的通讯方式 简介 通讯介绍 DMX512通讯 DMX512通讯物理层 DMX512通讯应用层 ILDA通讯 ILDA通讯物理层 DMX512通讯应用层 Art Net 网络通讯 简介 本文作为起始书写的第一篇 但可能不是专栏中的
  • Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    Error Program type already present android support design widget CoordinatorLayout 原因是在页面中使用recyclerView导致的 主要是design和co
  • Cache-Control max-age=0

    http blog csdn net ysdaniel article details 7969766 Cache Control no cache 强制每次请求直接发送给源服务器 而不经过本地缓存版本的校验 这对于需要确认认证应用很有用
  • 第二章 下载AOSP WiFi相关的代码

    第一章 国内下载AOSP最新源码的方法 文章目录 前言 一 需下载的仓库清单 二 下载命令 三 代码仓目录结构 总结 前言 WiFi相关的仓库包括Settings SettingsLib wifi service wpa supplican
  • micropython移植教程_Micropython移植篇——从点亮一个灯开始

    收到论坛申请的 MicroPython入门指南 已经两天了 看到了第四章 没有再往下看了 感觉应该先找个硬件移植 然后再往下看 跟着学习 这样才有意义 好了 先说下移植的过程吧 硬件采用的是STM32F429DISC 具体步骤 第一步 下载
  • Matlab 学习笔记 (部分内容系转载)

    由于要参加数学建模比赛的原因 我需要在不到一周的时间内初步地学习Matlab 因此 我希望把我在学习过程中阅读的资料记录下来 方便跟我一样需要在较短时间内速成Matlab的同学 基本上我记录的东西都是从网上的资料总结而来 所以这篇文章更偏向
  • MySQL读写分离实战

    1 MySQL读写分离概念 MYSQL读写分离的原理其实就是让Master数据库处理事务性增加 删除 修改 更新操作 create insert update delete 而让Slave数据库处理查询 select 操作 MySQL读写分
  • Java基础--------集合框架

    参考http blog csdn net zhongkelee article details 46801449 点击打开链接 以此为模板 自己做了整理 修改 目录 一 概念 二 集合框架的体系 2 1 Collection接口 2 1 1
  • 三维人脸重建(二)——Python生成ply文件

    目录 引言 一 ply格式模型介绍 二 代码 注 引言 本文主要以做坐标点为例 我们知道python对数据的处理主要是以numpy的形式 一般三维空间坐标的矩阵在python中为 x1 y1 z1 x2 y2 z2 xn yn zn 然后可
  • Java中的栈区和堆区问题(关于数组)

    Java中创建的局部变量等是存放在栈区的 而数组是存放在堆区的 那些new出来的对象也大多存放于堆区 栈区的空间往往不大 而堆区空间就会大很多 这里我们创建一个数组 如果在idea中打印a 会得到一串符号 这个是数组在堆区首元素的地址 代表
  • 数据结构 图 part2

    文章目录 图的遍历 深度优先遍历 DFS 遍历步骤 邻接矩阵的存储 邻接表的存储 广度优先遍历 BFS 遍历步骤 非连通图的遍历 连通分量 如何遍历 生成树 图的遍历 深度优先遍历 DFS 遍历步骤 在访问图中某一起始顶点v后 由v出发 访
  • 测试开发——用例篇(如何设计一个测试用例,设计测试用例的一些具体方法)

    目录 一 测试用例的基本要素 二 设计测试用例的万能公式 在没有需求文档的情况下 1 水杯的测试用例 2 一个网站的登录测试用例 三 基于需求进行测试用例的设计 四 测试用例的具体设计方法 根据需求 1 等价类 2 边界问题 3 判定表 因
  • 阿里云云解析DNS各种概念深度剖析

    摘要 本文所设计概念有 主机记录 www 记录类型 A记录 CNAME记录 TXT记录 解析路线 isp 网络服务提供商 记录值 TTL time to live 缓存生存时间 地方DNS DNSPod 场景描述 域名解析有一个 记录数 和
  • KEIL5中点击build会全编译的解决方法

    今天在笔记本上调试STM32时 发现每次点击build 总是会对工程内所有文件进行编译 相当于是rebuild的功能 开始以为是keil5版本的问题 经过网上查找并亲自测试 现得出解决办法 在Option中C C 一栏内 添加路径包含工程内
  • 联想rd540服务器怎么装系统,联想RD540加显卡BIOS设置

    开机按F1进入BIOS设置界面 然后进入CONFIG子界面 找到Display这个子项 然后回车进入 这个是设置显示输入和显卡的地方 里面有三个项目 Boot Display Device 启动时使用的显示装置 1 保持默认Thinkpad
  • RabbitMQ修改数据目录MNESIA数据目录

    RabbitMQ修改数据目录MNESIA数据目录 一 什么情况要调整数据目录 1 1 磁盘空间不足 1 2 磁盘性能瓶颈 1 3 迁移集群的备份还原 1 4 数据分离 二 MNESIA简介 三 操作步骤 四 其他问题 4 1 重启失败 一
  • Python习题答案

    1 多选题 程序设计语言包括 和 执行两种方式 正确答案 AB A 编译 B 解释 C 脚本 D 编写 2 单选题 机器语言是一种 语言 正确答案 A A 二进制 B 八进制 C 十进制 D 十六进制 3 单选题 是将源代码转换成目标代码的
  • sqli靶场通关之less9

    sqli less9 时间盲注 结合burpsuite 1 不返回报错信息页面 无法进行基于报错信息的盲注 2 页面不存在true和false两种不同的页面 无法进行对比也就无法进行布尔盲注 一般来说 在页面没有任何回显和错误信息提示的时候
  • 【Python基础】面向对象基础和特性

    Python面向对象 面向对象基础 定义类 创建对象 添加和获取对象属性 魔法方法 对象的生命周期 私有属性和私有方法 面向对象特性 封装 封装案例演练 继承 继承的传递性 方法的重写 父类的私有属性和私有方法 多继承 新式类与经典类 多态
  • 平摊分析(Amortized analysis)

    今天我们主要讨论所谓的平摊分析 amortized analysis 它是用来分析一系列操作的平均所需要的代价 可能有人会问它利用概率论的知识 通过概率来求平均情况 答案是否定的 它并不涉及概率 在一些情况下平摊分析能够很好的帮助我们分析我