当偶尔一切操作很花的时间很慢,而大多数操作的时间都很快的时候,平摊分析的方法就很很好用了。在平摊分析中,我们分析一串操作并且可以得到最坏情况下的平均时间复杂度。例如hash table, disjoint set 和splay tree都是用平摊分析算法的。

举一个简单的hash table的插入算法,我们怎么来定义hash table的大小呢?这是一个时间和空间的权衡(trade-off)。如果让hash table空间大的话,那搜索的时间会变慢,如果空间小,不一定能存的下数据。

解决这种权衡的方法是利用动态表or数组(dynamic table)。主要思想是当表已经满的时候增加哈希表的大小,步骤是:

1.给哈希表增加内存,一般是原来大小的两倍。

2.把原来的表的数据复制到新表中。

3.释放旧表的内存。

(有点类似java中 string 拼接的感觉)

这种哈希表的插入算法的时间复杂度是多少呢?

如果我们简单的分析,插入一个元素的最坏复杂度是O(n),(解释一下,因为这时哈希表可能满,需要复制n个元素到新的大表中,所以最坏的情况是O(n) ) 所以插入n个数的时间复杂度是n*O(n) = O(n2)。 这种分给除了上界限,但不是一个最紧的上界限,因为n个元素插入,不一定没一个都需要O(n)的时间。

所以用平摊分析发,我们可以证明用动态表的话,插入一个元素的时间复杂度是O(1)。动态大小的这种方法也用于C++ 的vector 和 Java的ArrayList。

下面是一些重要的信息:

1.平摊分析可以看做一个人是如何消费的,一个人平均每个月的花销是小于或者等于他的月薪。但是它可以在这个月花更多的钱,而在其他的月份存一些钱。

2.用动态数组的平摊分析有个名字叫做aggregate method (总体成本法),有两个厉害的方法去平摊分析:accounting method , potential method

3.平摊分析法和概率没啥关系,还有一些别的概念去分析一些用随机算法来减少算法的时间复杂度。这种方法叫做随机算法  Randomized Analysis。例如 随机化的快速排序(quick sort),快速选择(quick select,或者散列函数(hashing)。我们会在之后会的文章中提到这些内容

平摊分析 Amortized Analysis ------geeksforgeeks翻译的更多相关文章

  1. 算法课笔记系列(七)—— 平摊分析Amortized Analysis

    本周的内容是Amortized Analysis,是对算法复杂度的另一种分析.它的基本概念是,给定一连串操作,大部分的操作是非常廉价的,有极少的操作可能非常昂贵,因此一个标准的最坏分析可能过于消极了. ...

  2. 算法分析方法之平摊分析(Amotized Analysis)

  3. Learning Spark: Lightning-Fast Big Data Analysis 中文翻译

    Learning Spark: Lightning-Fast Big Data Analysis 中文翻译行为纯属个人对于Spark的兴趣,仅供学习. 如果我的翻译行为侵犯您的版权,请您告知,我将停止 ...

  4. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  5. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  6. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. 生存分析(survival analysis)

    一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...

  9. amortized analysis

    w https://en.wikipedia.org/wiki/Amortized_analysis In computer science, amortized analysis is a meth ...

随机推荐

  1. 容器--Collection和AbstractCollection

    一.前言 容器是JAVA中比较重要的一块,整个体系设计得非常好,同时对于代码学习来说也是比较好的范例.同时很多面试官也比较喜欢用容器来考察面试者的基础知识,所以掌握好容器还是比较重要的.本文主要总结一 ...

  2. 中国快递包裹总量的预测-基于SARIMA模型

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  3. java入门基础知识点总结

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...

  4. SQL Server性能影响的重要结论

    第一次访问数据会比接下来的访问慢的多,因为它要从磁盘读取数据然后写入到缓冲区: 聚合查询(sum,count等)以及其他要扫描大部分表或索引的查询需要大量的缓冲,而且如果它导致SQL Server从缓 ...

  5. 优秀程序设计的Kiss原则(keep it simple,stupid)

    优秀程序设计的Kiss原则(keep it simple,stupid) 良好的编程原则与良好的设计工程原则密切相关.本文总结的这些设计原则,帮助开发者更有效率的编写代码,并帮助成为一名优秀的程序员. ...

  6. [Intellij] 编译报错 javacTask

    报错信息: Idea 编译报错 javacTask: 源发行版 1.6 需要目标发行版 1.6 解决方案:

  7. handler机制的原理(转)

      Handler概述   andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageEx ...

  8. 怎样在win7系统配置数据源

    1.点击桌面的我Windows 图标,找打控制面板 2.进入控制面板主页,选择系统和安全,进入系统和安全 3.进入系统和安全主页后选择管理工具,点击进入 4.进入管理工具后,选择数据源,进行数据源的配 ...

  9. ArrayList 与 LinkedList

    ArrayList:数组结构,插入删除的效率低,查询的效率较高. LinkedList:链接数据结构,插入删除的效率较高,查询的效率低. 两者的使用 ArrayList:适合用作添加数据,做查询. L ...

  10. EF数据库初始化策略及种子数据的添加

    EF数据库初始化策略及种子数据的添加 CreateDatabaseIfNotExists 判断当前数据库连接字符串对应的数据库是否存在,若不存在则根据代码定义的model进行创建 DropCreate ...