algorithm - 在摊销分析中使用潜力和会计方法
解决方案
直觉
通过分析每个操作的昂贵案例和廉价案例,您可以了解如何对每个操作收费(然后您可能需要一些小修复来“修复”数字)
通过查看数据结构的重要参数,您可以构建一个潜在的函数(例如,它是 s2 中元素的数量)
- 此外,在这里看到很多例子真的很有帮助
核算方法:
让每次插入收取两枚硬币:一枚用于从 s2 中弹出元素,第二枚用于将元素插入到 s1 中,每次删除收取一枚硬币,用于从 s1 中删除元素。
然后请注意,银行中的信用不能为负,因为如果 s1 不为空,那么我们只需支付操作的实际成本(这是从 s1 中唯一的删除),如果 s1 为空,那么操作将从 s2 弹出并插入我们已经收费的 s1。(重要的是要注意,我们假设我们从空数据结构开始,或者,我们对数据结构的每个初始状态都获得了适当的信任)
现在您可以看到,对于每组操作,我们的总信用 3n 涵盖了操作的实际成本(我们获得了 s2 中剩余元素的信用边际),因此这些是有效的摊销界限。
为了解决潜在的函数,让我们考虑函数:
势(DataStructure)= 2 * s2 中的元素数
回想一下,我们是这样计算的:
OP.A 的摊余成本 = OP.A 的实际成本 + 潜力(DS after)-潜力(DS before)
所以我们得到(表示 k 中 s2 中的元素数):
插入: 1 + 2(k+1)-2k = 3
廉价删除: 1 + 2k - 2k = 1
对于昂贵的删除: 1+2k + 0 - 2k = 0(实际成本为 1+2k,因为我们从 s2 弹出并插入每个元素到 s1,然后从 s1 弹出一个元素)
推荐阅读
- node.js - 找不到 Angularjs 和引导库文件 (404) http-serve
- sql - 为什么将“&”替换为“&”不适用于 XML 数据?
- python - 在 Python 中映射以进行输入
- android - 我不小心从我的 com.packagename.appname 中删除了一个 activity.java。我该如何取回它?
- pkcs#11 - pkcs#11 中 C_Decrypt 的正确行为是什么?
- list - 分组,求和然后对事务对象列表进行排序java
- permissions - 在 RingCentral 生产的应用程序中添加权限
- antlr - 使用嵌入的多行控制字符序列解析字符串
- laravel - 从 Route Web.php 的 /profile/{username} 关键字中删除 /profile/ 不起作用
- git - 在主分支上签出文件后 Git 分支编辑丢失