算法2013s-平摊分析.pptxVIP

  • 2
  • 0
  • 约1.42千字
  • 约 44页
  • 2016-11-23 发布于河南
  • 举报
算法设计与分析;纲要;目标: 使表尽可能的小,但是还足够大不会溢出(或者变为低效率)。 问题: 如果我们不能预先知道合适的大小应该怎么办? 答案:动态表. 思路: 每当表溢出的时候,通过分配(用malloc或者 new)一个新的更大表使其增长。将原来表中的所有项都移动到新表中,然后释放旧表的内存。;1. 插入 2. 插入;1. 插入 2. 插入;1. 插入 2. 插入;1. 插入 2. 插入 3. 插入;1. 插入 2. 插入 3. 插入;1. 插入 2. 插入 3. 插入;1. 插入 2. 插入 3. 插入 4. 插入;溢出;溢出;1. 插入 2. 插入 3. 插入 4. 插入 5. 插入;1. 插入 2. 插入 3. 插入 4. 插入 5. 插入 6. 插入 7. 插入;考虑一连串 n 个插入。 指向一个插入的最坏情况时间是Θ(n). 因此, n 个插入的最坏运行时间是 n·Θ(n) = Θ(n2). 错误! 实际上, n 个插入的最坏情况费用进行是 Θ(n) ?Θ(n2). 我们看看为什么是这样:;令 ci = 第 i 个插入的代价;令 ci = 第 i 个插入的代价;n 个插入的费用.;平摊分析是一种分析方法,证明在一系列操作中,每个操作的平均代价很小,即使在这个系列中一个操作的代价比较大。 虽然我们进行平均,但是,其中并不涉及概率! ?平摊分析保证在最坏情况下每个操作的平均性能。;三种常用的平摊分析方法: ? 聚集 法, ? 记账 法, ? 势能 法. 我们刚刚看到的是聚集分析。 聚集法虽然简单,但是不如其他两种方法精确。特别是,记账法和势能法可以给每个操作分配特定的平摊代价。;? 给第 i 个操作虚构一个平摊代价 ?i , 1单位的工作付$1 (比如时间). ? 执行操作消费一定的代价. ? 任何当时没有消费的余额存在银行 准备给以后的操作使用。 ? 银行的余额不能为负值! 我们必须要保证对所有的 n;例子:;假设 给第 i 个插入操作平摊费用为 ?i = $3 。 ? $1 付给这次插入操作 ? $2 给以后表倍增预存 当表倍增的时候, $1 付给移动一个最近的项, 同时 $1 付给移动一个旧的项.;例子:;键的不变量: 存款余额不会低于 0. 这样, 平摊代价的和给真实代价提供了一个上界。;思路: 将银行帐号视为动态集合的势能。;势能ΔΦi;n 个操作的平摊代价之和为;n 个操作的平摊代价之和为;n 个操作的平摊代价之和为;???义在i第个插入后表的势能为 (假设 ;第i 个插入的平摊代价是;第i 个插入的平摊代价是;第i 个插入的平摊代价是;情况 1: i –1 刚好为 2的幂。;情况 1: i –1 刚好为 2的幂。;情况 1: i –1 刚好为 2的幂。;情况 1: i –1 刚好为 2的幂。;情况 2: i –1 不是 2的幂。;情况 2: i –1 不是 2的幂。;因此, n 插入最坏情况的代价为Θ(n)。;练习: 修正这个分析中的错误,证明第一次插入的 平摊代价仅仅为 2.;? 平摊代价给数据结构性能提供了清晰的抽象。 ? 当需要进行平摊分析的时候,任何方法都可以使用,但是每种方法都有特定的情况,最精确和简单。 ? 聚集分析、记账法和势能法有时产生不同的边界。;

文档评论(0)

1亿VIP精品文档

相关文档