《算法导论》
longhuihu
毕业于北邮计算机系,先后供职诺基亚、网易、北京域起,从事过嵌入式,移动APP开发,2015年开始从事游戏前后端的研发及技术管理,目前专注于Netty,JVM,Redis,DDD等游戏服务端关键技术领域。
展开
-
寻找所缺的数
算法导论第四章思考题4-2: 某数组A[1..n]包含所有从0到n的整数,但其中一个整数不再数组中。在这个问题中,我们不能由单一的操作来访问A中的一个完整整数,我们所能用的唯一操作就是“取A[i]的第j位”,这个操作所花的时间为常数。设计一种算法能在O(n)时间内找出所缺的整数。A之外的任一完整整数任可以由一个单一的操作来访问。思路:第四章的主题是“递归式”,这个问题很可能...原创 2010-07-31 10:40:00 · 1032 阅读 · 0 评论 -
算法导论第七章:快速排序
快速排序是一种原地排序算法,其最坏的运行时间为n2,期望的运行时间为nlgn,且隐含的常数因子很小。所以快速排序通常是用于排序最佳的实用选择。7.3节介绍了快速排序的一个随机化变形,这一版本的平均运行时间较好,也没有什么特殊的输入会导致最坏运行状态。 7.1 快速排序的描述与合并排序一样,快速排序也是基于分治模式的。下面是对一个典型子数组A[p...r]排序的分治过程的三个步骤。分解:数组A[p...r]被划分成两个子数组A[p...q-1]和A[q+1,r],使得A[p...q-1]中的每个元素都小于等于原创 2010-10-10 12:49:00 · 6961 阅读 · 3 评论 -
算法导论第十三章:红黑树
<br />一棵高度为h的查找树的各种操作的性能为O(h),当树的高度较低时,性能较好,当高度很高时,和链表没什么区别。从上一章可以知道,随机构造的二叉查找树的期望高度为O(lgn)。本章介绍一种平衡的查找树:红黑树,确保在最坏情况下,基本动态集合的操作时间为O(lgn)。<br /> <br />红黑树的性质:<br />1) 每个结点是红的或黑的<br />2) 根节点是黑的<br />3) 每个叶节点(NIL)是黑的<br />4) 如果一个结点是红的,那么它的两个儿子是黑的;换言之红结点的父原创 2011-02-26 10:08:00 · 1646 阅读 · 0 评论 -
算法导论第十四章:数据结构的扩张
<br /> 在应用工程中,需要在现有的数据结构上有所创新,但很少需要创造出全新的数据结构。通常情况下,只要向标准的数据结构中增加一些信息即可。可以对数据结构编入新的造作,以支持所需的应用。但是,数据结构的扩张并不总是轻而易举的,附加的信息需要能为该数据结构的常规操作所更新和维护。这一章讨论通过扩展红黑树构造的数据结构。动态顺序统计<br /> 第9章介绍了顺序统计的概念,在一个无序的集合中,任意的顺序统计量都可以在O(n)时间内找到。在这一节里,将介绍如何修改红黑树的结构,使得任意的顺序统计量都原创 2011-02-26 10:20:00 · 1866 阅读 · 0 评论 -
算法导论十一章:散列表
实现字典的一种有效的数据结构为散列表,在最坏的情况下,在散列表中查找一个元素的时间与在链表中查找一个元素的时间相同,为Θ(n)。在实践中,散列技术的效率是很高的,在一些合理的假设下,在散列表中查找一个元素的期望时间为O(1)。散列表是普通数组概率的推广。 11.1直接寻址表当关键字的全域U比较小时,直接寻址时一种简单而有效的技术。假设某个动态集合都一个取自全域U={0,1,...,m-1}的关键字,假设没有两个元素具有相同的关键字。我们用一个数组T[0...m-1](直接寻址表),每个位置对应全域U中的一个原创 2010-11-30 16:54:00 · 2338 阅读 · 0 评论 -
算法导论第五章:概率分析和随机算法
注:由于输入公式困难,本篇用 C(n,k)表示组合,n选k;P(n,k)表示排列,n选k;∑k=a~b 表示求和。5.1 雇佣问题假设你要雇佣一个新的办公室助理,雇佣代理每天想你推荐一个应聘者(连续推荐n个),你面试这个人,如果这个应聘者比目前的办公室助理更优秀,你就原创 2010-09-05 12:11:00 · 15110 阅读 · 5 评论 -
算法导论第十章:基本数据结构
引言 数据结构<br />集合:如同在数学中一样,集合也是计算机科学的基础。不过数学上的集合时不变的,而算法所操作的集合是动态改变的。数据结构这一部分介绍在计算机中表示和操作有穷动态集合的一些基本技术。<br /> <br />字典:许多算法要求能够将元素插入集合,从集合中删除元素,以及测试元素是否属于集合。支持这些操作的动态集合就叫字典。另一些算法可能需要更复杂的操作,实现动态集合的最好方案取决于要支持什么样的集合操作。<br /> <br />动态集合上的操作:下面给出一些典型的操作<br />SEAR原创 2010-11-30 14:45:00 · 1830 阅读 · 0 评论 -
算法导论第十二章:二叉查找树
<br />查找树是一种数据结构,它支持多种动态集合操作,包括search, minimum, maximum, predecessor, successor, insert以及delete。他既可以用作字典,也可以用作优先队列。<br />二叉查找树上基本操作的执行时间和树的高度成正比。对一棵n个结点的完全二叉树来说,这些操作的最坏情况运行时间为Θ(lgn)。但是如果树是含有那个结点的线性链,则这些操作的最坏运行时间是Θ(n)。本章可以看到一棵随机构造的二叉查找树的期望高度为O(lgn)。<br />实际原创 2011-02-26 10:04:00 · 3639 阅读 · 0 评论 -
算法导论第二章:算法入门
本章介绍了一个贯穿本书的框架,后续章节的算法设计和分析都是在这个框架中进行的。 首先分析了一下如何用插入排序来解决排序问题,定义了一种“伪代码”来描述算法。在描述了算法后,再证明他能正确的完成任务,并对运行时间进行分析。引入一种记号,侧重于表达运行时间是如何随着待排序的数据项数而增加的。之后还要介绍算法设计中的“分治法”,并利用该方法来设计一个称为合并排序的算法,对合并算法的运行时间进行了分析。原创 2010-07-03 11:32:00 · 3178 阅读 · 0 评论 -
算法导论第六章:堆排序
堆排序是一种原地(in place)排序算法。堆排序还引入另一种算法设计技术,利用某种数据结构来管理算法执行中的信息,堆数据结构不仅在排序中有用,还可以构成一个有效的优先队列。6.1 堆(二叉)堆数据结构是一种数组对象,如图6-1所示,它可以被视为一颗完全二叉树,树中的每个节点与数组中存放该节点值的那个元素对应。树的每一层都是填满的,最后一层可能除外。堆A具有两个属性:length[A]是数组中的元素个数,heap-size[A]是存放在A中的堆的]元素个数。也就是说虽然A[1...length[A]]都可原创 2010-10-01 22:00:00 · 4788 阅读 · 1 评论 -
算法导论第八章:线性时间排序
前面介绍的算法都有一个共同的性质:排序结果中,各元素的次序基于输入时间的比较,我们把这类排序算法称为比较排序。 8.1比较排序算法的时间下界决策树模型比较排序的过程可以被抽象地视为决策树。一棵决策树是一棵满二叉树,表示某排序算法作用于给定输入所做的所有比较。排序算法的执行对应于遍历一条从树的根到叶节点的路径。每个内结点对应一个比较ai&aj,左子树决定着aiaj以后的比较。当到达一个叶节点时,排序算法就已确定。排序算法能够正确工作的的必要条件是,n个元素的n!种排列都要作为决策树的一个叶节点出现。设决策树的原创 2010-10-12 22:50:00 · 7124 阅读 · 0 评论 -
算法导论第九章:中位数和顺序统计学
<br />在一个有n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。中位数是出现在i=(n+1)/2处(下中位)或i=(n+1)/2+1处(上中位)。<br /> 9.1最小值和最大值<br />在一个有n个元素的集合中,要做多少次比较才能确定其最小元素呢?可以很容易地给出n-1这个上界:依次查看集合中的每个元素,并记录比较过程中的最小元素。<br /> <br />n-1也是这个问题的比较次数下界:对于任意一个确定最小值的算法,可以把它看做是在各元素之间进行的一场锦标赛,每次比较都是锦标赛中原创 2010-11-20 23:19:00 · 6152 阅读 · 0 评论 -
算法导论第一章:算法概念介绍
算法<br />所谓算法就是定义良好的计算过程,它取一个或一组数值作为输入,并产生出一个或一组值作为输出。或者可以看做是解决一个具有良好规格说明的计算问题的计算过程。<br /> <br />如果一个算法对其每个输入实例都能输出正确的结果并停止,则称它是正确的。不正确的算法对于某些输入来说可能根本不会停止,或者停止时给出的不是预期的结果。不过如果这些“不正确”算法的错误率能够得到控制的话,有时也是有用的。<br /> <br />算法可以用自然语言、计算机程序或者硬件设计等形式来表达,不论采用何种形式,唯一原创 2010-07-03 11:05:00 · 1168 阅读 · 0 评论