《算法导论》读书笔记
文章平均质量分 68
onyheart
这个作者很懒,什么都没留下…
展开
-
总述
最近看到一部MIT的《算法导论》课程视频,结合书籍进行了学习。感受颇多。以前自己学习的笔记主要都是以纸质笔记为主,好多笔记再重新阅读的时候总有许多不便。因此,这次已博客的方式记录。网络上有很多朋友有相关的分析说明,而且有很多讲解非常清晰的博文。敝人在此写作,主要是对自己学习的一个梳理、总结,进行一些系统整理。很多时候看过就过了,没有总结,有时候很难把看过的东西提升为自己的东西。因此开篇写作的目原创 2013-10-19 21:34:44 · 539 阅读 · 1 评论 -
图之一(图的基本概念)
1. 图的分类(按边是否有向)1.1. 有向图边是有向的。边从一个顶点进入另一个顶点。强连通图,有向图中任何两点都有路(注意正反。即从任何点,都可到任何的另一点)。1.2. 无向图边是无向的。边表示一个顶点和另一个顶点关联。连通图,无向图中任何两点关联。2. 图的分类(按活动表示方式)2.1. 顶点表示原创 2013-11-23 20:13:04 · 736 阅读 · 0 评论 -
图之二(图的基本算法)
1. 图的存储表示1.1. 邻接表表示法对图中每个顶点,维护一个以该顶点为起点的终点的链表。整个图需要|V|条链表。邻接表即为这|V|条链表组成的表。场景:一般用于稀疏表。优点:Ø 有向图中,所有邻接表的链长度和为|E|;无向图中,所有邻接表的链长度和为2*|E|.Ø 每条链表的存储顺序没有要求。Ø 邻接表表示法中,存储空间为O(V+原创 2013-11-23 20:15:49 · 737 阅读 · 0 评论 -
数据结构之四(平衡查找树之一--红黑树)
数据结构之四(平衡查找树之一--红黑树)由二叉查找树随机情况下O(lgn)的操作(增、删、查)时间,因此希望得到一种下最坏情况O(lgn)的操作时间。由二叉树操作时间和树高相关,因此考虑将二叉树的高度保持为O(lgn),从而达到目的。平衡树包括:AVL,2-3树,2-3-4树,B树(B+,B*),R-B树(红黑树),Skip lists(跳跃表),Treap(树堆)1.原创 2013-11-09 23:34:18 · 489 阅读 · 0 评论 -
数据结构之三(二叉查找树)
查找树是一种动态数据结构,支持插入、删除、查找等操作。二叉查找树的复杂度和树的高度是成正比的。有n个节点的完全二叉树,树高为O(lgn)。但是如果树含义n个节点,如果为斜的,则成为链表,高度为O(n)。1. 二叉查找树每个节点最多有两个分支。对于每个节点。左孩子的任何节点小于根,根小于右孩子的任何节点。2. 二叉排序与快排的比较。二叉排序,使用将原创 2013-11-09 16:20:45 · 446 阅读 · 0 评论 -
排序之五(顺序统计、中位数法)
作为排序的一个扩展,给定一个含n个元素的无序数组,求第k小的数。 K取特殊值:如1或n,这时为求最小或最大值。只需要扫描一遍数组,记录下小的或大的数,只需要n-1次比较即可。如果要同时求最大和最小值,则一个方法可以先求最大,再求最小,可以在2*(n-1)比较解决;另一个方法是每次处理两个元素,先新的两个元素比较,再将大的和当前最大值比较,小的和当前最小值比较,这样每2个元素只需原创 2013-10-30 23:10:51 · 1358 阅读 · 0 评论 -
数据结构之五(数据结构的扩充、动态统计、区间树)
1. 动态有序统计静态统计:是指数据内容一旦确定,就不再有增加、删除操作,排序的内容是静态固定不变的。(见排序之五)动态统计:内容有可能有增减。动态统计主要有两种操作。一是获取数组中第i大的数。二是给一个数x,返回x在数组中的位置。动态统计实现方式:以红黑树为基础进行扩充,在每个节点x存储额外的一个记录信息---以x为根的子树的节点数(包含x自己,以及其内部孩子节点,原创 2013-11-11 00:11:39 · 1132 阅读 · 0 评论 -
数据结构之六(跳跃表Skip List)
跳跃表的优点:期望操作时间为O(lgn),且以概率1达到O(lgn),即操作几乎总是O(lgn),而不仅是以期望复杂度为O(lgn)。另外跳跃表实现相对简单。1. 跳跃表含义n个元素的跳跃表。l 跳跃表以多条链表来表示元素。l 每条链表都是排好序的有序链表。l 最底层的链表为普通的单链表,包含所有的元素。l 每一层(除了最底层)节点的选择为其下层元素的原创 2013-11-11 23:33:01 · 674 阅读 · 2 评论 -
图之四(最短路径)
1. 最短路径1.1. 最短路径:是带权有向图中,一个顶点u到另一顶点v之间权值最小的路径,最短路径可能不止一条。最短路径不能含有负权回路,否则在负权回路上循环则可以达到负无穷大;也不能有正权回路,否则从路径上去掉回路后,可以产生有向图源点和终点、权值更小的路径。因此最多有0权回路,而这时一定还有另外一条无回路的最短路径。因此可以将路径上的的0权回路都去掉原创 2013-11-26 23:38:02 · 814 阅读 · 0 评论 -
算法设计分析之一(平摊分析,表扩增,势能方法)
1. 平摊分析问题:hash表应该设置为多大?(使用链表解决冲突。)越大越好,这样查找越快;但是空间越大,浪费越大。因此,通常为存储元素的2倍。但是如果不知道要存储的元素的值呢?方法:使用动态表,思想为vector扩展容量的方式,空间满时重新分配两倍当前大小的空间,并移动元素,释放旧的空间。复杂度分析:每一次都有插入操作,在2的幂次方加1处还需要移动前面的所有元素。原创 2013-11-13 00:41:24 · 2988 阅读 · 0 评论 -
图之三(最小生成树)
1. 最小生成树最小生成树是无向联通带权图的最小联通分量(带权)。只用n-1条边连接n个顶点,且边的权值和最小。使用贪心算法,贪心和动态规划比,还有一个更强的性质,局部最优解即为全局最优解。2. 求解算法思想2.1. 通用的思想算法没一步都确定一条边,使得加入后仍然为最小生成树的子集。一般都是基于贪心算法思想来实现。2.2.原创 2013-11-24 00:30:52 · 689 阅读 · 0 评论 -
数据结构之二(续,高级hash)
问题:普通hash会导致对于特定的输入,其时间复杂度可以达到O(n)。为了解决这个问题,同快速排序的随机化一样,使用随机化算法来实现,从而可以使得复杂度不会依赖于输入,且性能能达到平均。1. 全域hash(universal hashing)全域hash:在执行的开始,随机地从一族hash函数中选择一个函数来执行hash。从而避免对特定输入导致的最差性能。H为有限的一组散原创 2013-11-06 00:34:39 · 933 阅读 · 0 评论 -
排序之一(插入排序、归并排序)
排序问题是各种算法问题中比较重要的问题。导论也已排序开篇。插入排序插入排序的思想:假设数组的前i-1个元素已经排好序,再将第i个元素插入前i个元素中的合适的位置;循环这个过程直到最后一个元素被插入到合适的位置。注意细节:由于1个元素的数组当然是有序的,因此在处理的时候,循环过程从2开始直到数组长度n即可。插入过程中,对于具体要插入的位置的确定。一是可以从i-1,原创 2013-10-19 23:29:16 · 815 阅读 · 0 评论 -
分治思想的应用
分治思想是把问题进行分解为不相交的子问题,直到子问题可解;最后再合并子问题的解得到问题的解。应用:二分查找x^n幂次求解斐波拉契数列求解。应用矩阵幂次关系。矩阵乘法,分块将次的技巧。H树,电路设计。原创 2013-10-20 10:54:24 · 571 阅读 · 0 评论 -
排序之二(快速排序及随机化)
快速排序 快排思想:快速排序是分治法的另一个重要应用。和归并的算法思想一样,也以分治思想为基础,不同之处在于划分的标准不同。归并以数组元素个数进行划分,将原数组划分为两个元素个数相当的子问题。快速排序则以关键字进行划分,将原数组划分为两部分,一部分比关键字小,另一部分比关键字大。设计思想:分治法。注意细节:实现细节上对于关键字的选择,一是以最小下标元素,二是原创 2013-10-20 17:24:54 · 466 阅读 · 0 评论 -
排序之四(线性时间排序)
排序模型排序时间下界引出的排序模型。基于比较的排序(决策树模型):n个元素的决策树叶节点需要n!个叶子。从而树高度由斯特劳林公式可以求得近似为O(nlgn)。因此最优的下限为O(nlgn)。普通排序都是基于比较的,如插入,归并,快排,堆排。其中归并和堆排是渐进最优的。基于比较的排序都可以转换为决策树模型。计数模型:基数模型:计数排序排序思想:堆排序既有归并排序的优点--原创 2013-10-26 00:31:46 · 534 阅读 · 0 评论 -
排序之三(堆排序)
堆排序堆排序既有归并排序的优点--O(nlgn)的时间复杂度,由有插入排序等排序的优点--原地排序。堆:含义n个元素的堆是指,当i[1,n/2]时,a[i]注意堆与二叉查找树的区别:二叉查找树一定是不大于一个,不小于另一个。堆是要么不大于两个,要么不小于两个;左右树之间没有比较关系;但是最小值(或最大值)一定在根处。堆排序思想:在原数组上进行堆操作,从而将数组进行排序。在大堆中取出原创 2013-10-23 23:22:57 · 451 阅读 · 0 评论 -
算法设计分析之三(动态规划,最长公共子序列)
1. 动态规划动态规划是通过组合子问题的解从而得到整个问题的解。1.1. 与分治算法区别分治法是将问题分解为独立的子问题,递归求解子问题,最后再合并子问题从而得到问题的解。动态规划并不要求子问题独立,因此子问题可以包含公共的子子问题。这时候如果用分治法,则会重复计算很多不必要的工作,即重复计算公共的子子问题。1.2. 思想动态规划是将子原创 2013-11-17 01:11:23 · 1851 阅读 · 0 评论 -
数据结构之一(基本数据结构)
从本章开始,讨论数据结构。动态集:数据结构讨论集合时,一般集合的元素是可以变化的,可以向集合中添加、删除、修改元素的值。动态集上的操作:查找、添加、删除、取最大值、取最小值、前驱、后继。基本数据结构:1 栈:后进先出(LIFO)。插入--入栈(PUSH),删除--出栈(POP),查看栈顶元素(TOP)。2 队列:先进先出(FIFO)。插入原创 2013-11-03 04:05:37 · 489 阅读 · 0 评论 -
数据结构之二(hash)
Hash表Hash表作为一种动态集合数据结构,一般只支持:插入、查询、删除操作;而且每个操作的时间复杂度一般控制在O(1)内。Hash表是普通数组的一种推广。因为数组可以在直接通过下标来定位要查找的元素,时间为O(1)。因此hash表目标也是使用一些技术,以达到可以在O(1)的时间内完成操作。(严格来说时间是和装载因子a相关的)Hash的方法。1. 直接寻址法前提原创 2013-11-03 17:42:46 · 845 阅读 · 0 评论 -
算法设计分析之二(竞争分析,自组织表)
1. 自组织表:定义两种操作l n个元素的列表L,访问(可能是查找,也可以是其他操作)元素x的代价与元素在列表中的位置有关(从表头到x的距离)。l 元素在L中的位置可以通过交换相邻的元素来改变,而这个操作的代价为O(1)。如果考虑用户的访问可能是一系列的,而且一个元素被访问后,再次被访问的概率会增大,因此考虑对一个元素访问后将该元素和其前驱的元素交换(代价为O(1原创 2013-11-14 22:26:33 · 3386 阅读 · 0 评论