
《算法导论》笔记
文章平均质量分 72
nklofy
compiler, vm, code obfuscator
展开
-
《算法导论》笔记(7) 区间树、B树
动态顺序统计。一种是红黑树结点储存附加子树的元素数size。一种是储存中序遍历的秩r。插入、删除时对附加属性的维护。相类似的扩展的红黑树附加属性f若仅依赖于x、x.left、x.right,还可能包括x.left.f与x.right.f,则插入删除时维护所有结点的属性f,不影响O(lg(n))渐近性能。原创 2015-02-05 15:29:12 · 572 阅读 · 0 评论 -
《算法导论》笔记(10)贪心算法 部分习题
习题16.1-4 区间图着色问题。边最多的顶点G,其边数n即需要的颜色数,也即教室数。有n种颜色,顶点标为第i种颜色,则此活动可放在第i个教室举行。从一顶点开始广度优先遍历,将相连接的点标为不同颜色,标颜色同时检查与此相连的所有点颜色不同。然后检查全部顶点,有未标色的顶点,按照上法重新开始标色。习题16.1-5 如果每个活动有值vk,要求vk总和的最大值,那么这个题就需要用动态规划求解了。时间原创 2015-02-09 10:38:24 · 3487 阅读 · 0 评论 -
《算法导论》笔记(13) 单源最短路径,所有结点对的最短路径
单源最短路径,单目的地最短路径,单结点对最短路径,所有结点对最短路径。最短路径的子路径也是最短路径。最短路径不包含环路。松弛操作,三角不等式。前驱子图,最短路径树。 Bellman-Ford算法。边总数-1次循环,每次循环将所有边进行松弛操作,最终得到最短路径,或者报错存在w为负数的环路。relax(u, v){ if(u.d+w(u, v)<v.d) {v.d=u.d+w(u,v)原创 2015-02-16 09:17:50 · 651 阅读 · 0 评论 -
《算法导论》笔记(12) 基本的图算法,最小生成树
首先是图的表示。G=(V, E),两种标准表示方法。一是邻接链表,一是邻接矩阵。邻接链表有|V|条链表,链表Adj[u]包含所有与结点u有边关联的结点v。邻接矩阵是|V|*|V|的二维矩阵,aij可用来表示结点i与j之间有无边或边的权重。 广度优先搜素。从源结点出发向外扩展,访问当前结点的全部相连结点并一一入队列,然后将队列中最前结点出列以相同方法访问其子结点,直到所有结点都被访问。访问过程原创 2015-02-15 22:18:04 · 601 阅读 · 0 评论 -
《算法导论》笔记(15) 最小生成树 部分习题
习题23.1-11 给定图G和一棵最小生成树T,假设减少了位于T之外的某条边的权重。因为T内的边,是连接所有结点的权重最小的,那么首先将T外的减少权重的边(u, v)加入T,然后在u, v中寻找所有的路径,去掉路径中权重最大的边。习题23.2-3 使用斐波那契堆实现的Prim算法与使用二叉堆比较。因为斐波那契堆实现优先队列,使Prim算法的运行时间为O(E+VlgV),而二叉堆实现优先队列的P原创 2015-02-19 01:48:01 · 5782 阅读 · 2 评论 -
《算法导论》笔记(18) 最大流 含部分习题
流网络,容量值,源结点,汇点,容量限制,流量守恒。反平行,超级源结点,超级汇点。Ford-Fulkerson方法。残存网络,增广路径,最小切割定理。f是最大流,残存网络不包含增广路径,|f|等于最小切割容量三者等价。基本的Ford-Fulkerson算法。Edmonds-Karp算法。为了算法的收敛性。残存网络中用广度优先寻找增广路径。证明运行时间为O(V*E^2):对特定一条边,其成为关原创 2015-03-19 12:37:17 · 5368 阅读 · 4 评论 -
《算法导论》笔记(6)链表到红黑树 部分习题
习题10.2-8, 记第i个元素的np为np1,np2… 则np0xor np1 xor np2 xor np3 ….npi得到npixor np0,np0是表头的地址。若定义np0为0x00000000,(np1xor np2 xor np3…. xor npi)即为第i+1个元素的相对地址。若要逆转链表,则查找时从最末位向前连续xor即可。习题10.4-5 二叉树那章有道题相同,不用栈不用原创 2015-02-05 15:28:13 · 519 阅读 · 0 评论 -
《算法导论》笔记(5)链表到红黑树
基本数据结构:链表,队列,散列表,二叉树,红黑树。栈和队列都是抽象的结构,不一定是物理连续的内存空间。但必须实现push()和pop()的抽象接口。链表有单、双向链表和循环链表。可按照iterator++或者iterator--的方式访问。另外要注意的是插入或删除时对指针的操作。某些语言不支持指针和对象,那么实现链表有2种方式。多维数组或1维数组。多维数组的实现方式是A[i][j][k]中的j原创 2015-02-05 11:28:11 · 898 阅读 · 0 评论 -
《算法导论》笔记(9) 动态规划 部分习题
一些本章的习题的解法简答及伪码。15.1-5 斐波那契数的子问题图。每个斐波那契数与前两个斐波那契数有关。所以有N个顶点,2*(N-2)条边。15.2-4 矩阵链乘法的子问题图。N个矩阵的子问题是N-1对,所以共有(N-1)*N/2与N*(N-1)*(N-2)/2条边。15.3-6 外币兑换问题。必须是不重复的兑换。可以做一个集合S={D1, D2, D3…}代表兑换序列,sn原创 2015-02-09 10:37:47 · 614 阅读 · 0 评论 -
《算法导论》笔记(16) 单源最短路径 部分习题
习题21.1-3 Bellman-Ford算法改进为m+1次松弛后终止。图中结点若在s->v的路径中则作标记。松弛过程中,若有标记的结点全部不更新v值,则停止。此时松弛次数为m+1趟。习题21.1-5 松弛方法改为结点已有d值,对其所有入边选择w+ d习题21.1-6 寻找权重为负值的环。用2维矩阵保存所有结点之间的最短路径,也包括自己到自己的路径。然后按照Bellman-Ford算法运行原创 2015-03-03 08:38:35 · 5655 阅读 · 0 评论 -
《算法导论》笔记(17) 所有结点对最短路径 部分习题
习题25.1-6 O(n^3)时间内从已经计算出的最短路径权重矩阵L计算出前驱矩阵Π。任意的L[i, j]最短路径,若j结点前驱为k,则必然有L[i, j]= L[i, k]+ w[k, j]。如此可遍历L矩阵的第i行所有元素L[i, k],若L[i, j]= L[i, k]+ w[k, j],表明k是i-> j最短路径的j的前驱结点。习题25.1-7 在Extend_Shortest_Pat原创 2015-03-11 08:46:05 · 2029 阅读 · 0 评论 -
《算法导论》笔记(1)排序 含部分习题
为什么是《算法导论》读书笔记?因为这本书是经典中的经典,读这本书对算法学习帮助非常大,读书笔记值得写。而且从这本书的读书笔记开始写博客,也是一个比较容易上手的办法。一为复习算法,一为练笔。开篇讲算法的基本概念。从插入和归并排序举例说明伪代码的写法,算法的代价,分治的思想。2.1节有个细节,其实非常值得重视,即循环不变式。这是算法正确性的核心概念。记得曾看过一本Knuth的书《编程的修炼》,原创 2015-02-02 14:21:02 · 509 阅读 · 0 评论 -
《算法导论》读书笔记(2)复杂度、分治策略 部分习题
继续。第3章,函数的增长。这章比较简单。渐进符号,O, Θ, Ω。函数的上下界。练习3.2-8,k*ln(k)>=C1*n; k*ln(k)思考题3-6,a: n; b: lg*(n); c: log2(n); d: log2(n)-1; e: -lg(lg(n)); f: 无穷大; g: -log3(log2(n)); h: log(lgn)(n/2) //非最优;第4章,分治原创 2015-02-02 15:07:27 · 793 阅读 · 0 评论 -
《算法导论》笔记(3) 有关概率论
短篇,关于第5章。都是概率论,内容忽略,直接到习题吧。带星号的5.1-2,Random(0,1)只返回0和1,这里有个坑是二项式分布的问题,直接求和不可取。为得到random(a,b),应该将random(0,1)重复N次后,按顺序放入一个N位2进制数字中,对(b-a+1)取模,即得random(a,b)。复杂性为theta(n)。function random(a,b){ for i原创 2015-02-03 15:09:02 · 698 阅读 · 0 评论 -
《算法导论》笔记(8) 动态规划、贪心法、摊还分析 简述
动态规划的步骤:构造最优解的结构,子问题求解后保存,计算最优解的值。最优解的结构是张表。有两种方法计算最优解,一是自顶向下递归求解,保存已知的子问题的解到数组或散列表,需要时在表中查询此解;二是自底向上求解,每个子问题只求解一次,向上合并问题直至最终得到最优解。其实这两个方法没有本质区别,因为方法1是递归定义和保存已知子问题解,本质上也是先分解到最底层然后每个子问题求解保存再向上合并。动态规划算法的运行时间与顶点和边的数量呈线性关系。动态规划算法要求可以划分彼此无关的子问题,且具有小的重叠子问题。子问题无关原创 2015-02-07 17:43:14 · 1008 阅读 · 0 评论 -
《算法导论》笔记(11) 摊还分析 部分习题
习题11.1-3 i为2的幂时代价为i,其余代价为1,聚合分析(1+2+1+4+1+1+1+8.....)/n,若n趋近无穷大,极限为3。每次操作摊还代价为3.习题11.2-2 核算法解上题。在i/2+1到第i-1次操作之间,每次操作实际代价1,信用2,经过i/2次之后,累积信用为i,第i个操作一次性付出代价i,消耗信用为i-1,若n足够大,可知每个操作的摊还代价为3。习题11.3-2 势原创 2015-02-09 10:39:08 · 2082 阅读 · 0 评论 -
《算法导论》笔记(14) 基本的图算法 部分习题
习题22.1-5 有向图G(V, E)的平方图。链表表示时,对每结点u的Adj[u]中所有v加入队列,后边出队边将Adj[v]加入Adj[u]中。矩阵表示时,若w[i, j]、w[j, k]同时为1则将w[i, k]置1.习题22.1-6 O(V)的时间寻找通用汇点。汇点的特征是邻接矩阵的第j列除[j, j]外所有元素为1. 可将每行调整[j ,j]后作为一个整数,所有整数与运算,为1的位是汇原创 2015-02-17 21:14:18 · 625 阅读 · 0 评论 -
《算法导论》笔记(4)堆排序与快速排序 含部分习题
堆排序。堆是一个不需要指针的二叉树,不需要指针是因为对下标运算得到父、左、右三元素。不用指针的好处是省空间,交换上下元素时运算更简单,另外便于迅速定位父、子结点,构建时快速遍历同层结点以及上一层结点。但因为不用指针,需要队列(deque或vector)来储存数据,以满足动态进出的要求。而对于实际的应用场景,随着堆的增长,申请越来越大的连续内存空间,一定是要跨区域的,其实还是牵涉了指针的运算,只是封原创 2015-02-04 14:53:40 · 517 阅读 · 0 评论