
算法导论第三版
文章平均质量分 91
Gastation
谋事在人
展开
-
第一部分 基础知识
之前一直想看下神书算法导论,由于种种原因一直没有仔细研读,从今天开始,接下来一个一个多月的时间里,争取一天一章内容,认真研读这本书。 第一部分,这一部分将引导读者开始思考算法的设计和分析问题,简单介绍算法的表达方法、将在本书中用到的一些设计策略,以及算法分析中用到的许多基本思想。原创 2017-06-01 10:11:24 · 350 阅读 · 0 评论 -
第 四 部分 高级设计分析技术 第15章 动态规划
这一部分介绍了设计和分析高效算法的三种重要技术:动态规划、贪心算法、和摊还分析。 动态规划通常用来解决最优化问题,在这类问题中,通过做出一组选择来达到最优解。在做出每个选择的同时,通常会生成与原问题形式相同的子问题。当多于一个选择子集都生成相同的子问题时,动态规划技术通常通常就会有效,其关键技术就是对每个这样的子问题都保存其解,当其重复出现时即可避免重复求解。 与动态规划类似,贪心算法通原创 2017-08-28 22:55:05 · 613 阅读 · 0 评论 -
第 11 章 散列表
散列表是实现字典操作的一种有效数据结构。尽管在最坏情况下散列表查找一个元素的与链表中的时间相同,达到θ(n)。然而在实际应用中,在一些合理的假设下,在散列表中查找一个元素的平均时间是O(1)。 散列表是普通数组概念的推广。当实际存储的关键字数目比全部的可能关键字总数要小时,采用散列表称为直接数组寻址的一种有效替代,因为散列表使用一个长度与实际存储的关键字数目成比例的数组来存储。在散列表中,不原创 2017-06-28 14:52:59 · 383 阅读 · 0 评论 -
第三部分 数据结构 第 10 章 基本数据结构
数学中的集合是不变的,而由算法操作的集合却在整个过程中能增大、缩小或发生其他变化,称这样的集合是动态的。 动态集合中的元素 在动态集合的典型实现中,每个元素都由一个对象来表示,如果有一个指向对象的指针,就能对其各个属性进行检查和操作。一些类型的动态集合假定对象中的一个属性为标识关键字。 动态集合上的操作 分为两类:简单返回有关集合信息的查询操作和改变集合的修改操作。下面列出原创 2017-06-26 15:52:14 · 208 阅读 · 0 评论 -
第 9 章 中位数和顺序统计量
在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。例如,在一个元素集合中,最小值是第 1 个顺序统计量,最大值是第n个顺序统计量(i=n)。用非形式化的描述来说,一个中位数是它所属集合的“中点元素”。当n为奇数时,中位数是唯一的,位与i=(n+1)/2.当n为偶数时,存在两个中位数,分别位与i=n/2和i=n/2+1.因此,如果不考虑n的奇偶性,中位数总是出现在i=⌊(n+1)原创 2017-06-22 11:58:48 · 710 阅读 · 0 评论 -
第 8 章 线性时间排序
到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序的n个数的算法。归并排序和堆排序达到了最坏情况下的上界;快速排序在平均情况下达到上界。这些算法都有一个性质:在排序的最终结果中,个元素的次序依赖于它们之间的比较。称这些排序算法为比较排序。 8.1节证明对包含n个元素的输入序列来说,任何比较排序在最坏情况下都要经过Ω(nlgn)次比较。因此,归并排序和堆排序是渐近最优的,并且任何已知的原创 2017-06-22 10:11:05 · 334 阅读 · 0 评论 -
第二部分 排序和顺序统计量 第 6 章 堆排序
排序算法 插入排序最坏情况下可以再θ(n2)θ(n^2)时间内将 n 个数排好序。但是,由于其内层循环紧凑,对于小规模输入,是一张非常快的原址排序(如果输入数组中仅有常数个元素需要在排序过程中存储在数组之外,则称排序算法是原址的)。归并排序不是原址的。 第 6 章介绍的堆排序,是一种θ(nlgn)θ(n \lg n)时间的原址排序算法。 第 7 章介绍快速排序,也是一种原址排序,原创 2017-06-20 15:27:47 · 468 阅读 · 0 评论 -
第 7 章 快速排序
对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为θ(n2)θ(n^2)的排序算法。虽然最快情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度为θ(nlgn)θ(n\lg n),而且θ(nlgn)θ(n\lg n)中隐含的常数因子非常小。另外它还能够进行原址排序,甚至在虚存环境中也能很好地工作。7.4 快速排序的描述原创 2017-06-21 10:01:47 · 407 阅读 · 0 评论 -
第 13 章 红黑树
二叉搜索树在树的高度较高时,动态集合的操作可能并不比在链表上执行的快。红黑树是许多“平衡”搜索树的一种,可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lgn)。 13.1 红黑树的性质 红黑树是一颗二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出 2原创 2017-06-30 11:01:35 · 277 阅读 · 0 评论 -
第 5 章 概率分析和随机算法
本章介绍概率分析和随机算法.5.1 雇用问题概率分析 概率分析是在问题分析中应用概率的概念。大多数情况下,我们采用概率分析来分析一个算法的运行时间,有时也用来分析其他的量。我们对所有可能输入产生的运行时间取平均。当报告此种类型的运行时间时,我们称其为平均情况运行时间。 我们在确定输入分布时必须非常小心。对于某些问题,我们可以对所有可能的输入集合做某种假定,然后采用概率分析来设计一个高效算原创 2017-06-09 11:39:11 · 507 阅读 · 0 评论 -
第 4 章 分治策略
在分治策略中,我们递归地求解一个问题,在每层递归中应用如下三个步骤: 分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。 解决递归地求解出子问题。。如果子问题规模足够小,则停止递归,直接求解。 合并 将子问题的解组合成原问题的接。 当子问题足够大,需要递归求解时,我们称之为递归情况。当子问题变得足够小,不再需要递归时,我们说递归已经“触底”,进入了基本情原创 2017-06-08 20:28:37 · 590 阅读 · 0 评论 -
第12 章 二叉搜索树
搜索树结构支持许多动态集合操作,因此,使用一棵搜索树既可以作为一个字典又可以作为一个优先队列。 二叉搜索树的基本操作所花费的时间与这棵树的高度成正比。对于 n 个节点的一个完全二叉树来说,这些操作的最坏运行时间为θ(lgn)。然而,如果这棵树是一条 n 个节点组成的线性链,那么同样的操作就要花费θ(n)的最坏运行时间。 12.1 什么是二叉搜索树 一颗二叉搜索树是以一颗二原创 2017-06-29 11:19:39 · 424 阅读 · 0 评论 -
第 2 章 算法基础
本章将要介绍一个贯穿本书的框架,后续的算法设计与分析都是在这个框架中进行的。2.1 插入排序输入:n个数的一个序列< a1, a2, … , an >。 输出:输入序列的一个排列< a1’, a2’, … , an’>,满足a1’ <= a2’ <=…<=an’。 我们希望排序的数也称为关键词。 本书中通常将算法描述为用一种伪代码书写的程序。将伪代码过程命名为INSERTION-SORT,其中原创 2017-06-01 11:19:11 · 413 阅读 · 0 评论 -
第 3 章 函数的增长
当输入规模足够大时,使得只有运行时间的增长量级有关时,我们要研究算法的渐近效率。也就是说,我们关心当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加。通常,渐近地更有效的某个算法对很小的输入外的所有情况将是最好的。 本章给出几种标准方法来简化算法的渐近分析。下一节首先定义几类“渐近记号”,其中,我们已经见过一个例子是Θ记号。然后,我们给出贯穿本书使用的几种记号的约定。原创 2017-06-07 16:24:43 · 1118 阅读 · 0 评论 -
第 16 章 贪心算法
对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的贪心算法。它在每一步都做出当时看起来最佳的选择。也就是说,它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。 贪心算法并不保证得到最优解,但对很多问题确实可以求得最优解。活动选择问题就是可以用贪心算法得到最优解。 16.1 活动选择问题 假定有一个 n 个活动的集合S={a1,a2,...,原创 2017-08-29 16:23:27 · 467 阅读 · 0 评论