当偶尔一切操作很花的时间很慢,而大多数操作的时间都很快的时候,平摊分析的方法就很很好用了。在平摊分析中,我们分析一串操作并且可以得到最坏情况下的平均时间复杂度。例如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. [moka同学笔记]百度编辑器Ueditor自动换行,添加<p>的问题(摘录)

     原文:http://www.cnblogs.com/kissdodog/p/5419919.html 百度编辑器Ueditor其实蛮好用的,后来使用了一段时间发现,每次打开后又保存,发现都会往内容的 ...

  2. jquery 拓展

    1. 概述 jquery允许拓展自定义的方法, 绑定到$.fn对象上, 编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要return this;以支持链式调用 ...

  3. 从" ThinkPHP 开发规范 "看 PHP 的命名规范和开发建议

    稍稍水一篇博客,摘抄自Think PHP 的开发规范,很有引导性,我们可以将这些规范实践到原生 PHP 中. 命名规范 使用ThinkPHP开发的过程中应该尽量遵循下列命名规范: 类文件都是以.cla ...

  4. 你可以使用 play framework 做5件很爽的事情http://www.anool.net/?p=629

    1.绑定HTTP参数到JAVA方法里的参数. 使用PLAY可以很简单的从JAVA代码中检索HTTP参数.只要把方法参数申明成和HTTP参数相同既可. 比如,这个request: Http代码 /art ...

  5. 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

    Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...

  6. atitit.木马病毒webshell的原理and设计 java c# .net php.

    atitit.木马病毒webshell的原理and设计 java c# .net php. 1. 隐蔽性 编辑 WebShell后门具有隐蔽性,一般有隐藏在正常文件中并修改文件时间达到隐蔽的,还有利用 ...

  7. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)

    Question 94You need to create a custom application that provides users with the ability to create a ...

  8. UISlider显示进度(并且实现图片缩放)

    图片展示效果如下: 其他没什么好说的,直接上代码: RootView.h: #import <UIKit/UIKit.h> @interface RootView : UIView @pr ...

  9. JAVA基础学习day19--IO流一、FileWrite与FileReader

    一.IO简述 1.1.简述 IO:input/output IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中. 1.2.结构 字节流抽象类: ...

  10. Cocos2d入门--1--初涉相关属性或代码

    Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能 ...