Data Structure and Algorithms
iffTimes
非当世奇才,然亦非常之人矣
展开
-
算法导论 第二章: Getting Started
这一章初步介绍算法的分析以及算法的设计。贯穿整本书的主题。算法分析: 算法的分析是针对计算机程序性能和资源利用的理论研究。常见的分析分为三类: (1)Worst-case: [通常被关注] T(n)=#max time on any input of size n (2)Average-case:[有时候被关注] T(n)=#expeced原创 2015-07-01 16:41:14 · 544 阅读 · 0 评论 -
算法导论 第十九章:斐波拉契堆
斐波拉契堆是由一组最小堆有序树组成,每棵树遵循最小堆性质,并且每棵树都是有根而无序的。所有树的根通过left和right指针来形成一个环形的双链表,称为该堆的根表。 对于一个给定的斐波拉契堆H ,可以通过指向包含最小关键字的树根指针H.min来访问。堆中每个节点还包含x.mark,x.degree两个域,x.degree表示x的子女表中的子女个数;x.mark表示从x上次成为另一个节点子女原创 2015-07-18 14:45:21 · 4505 阅读 · 1 评论 -
算法导论 第十六章:贪心算法之单任务调度问题
贪心算法是使所做的选择看起来都是当前最优的,通过所做的局部最优选择来产生一个全局最优解。其具有的性质如下:1)贪心选择性质:一个全局最优解可以通过局部最优(贪心)选择来达到。即,在考虑如何做选择时,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。 这一点是贪心算法不同于动态规划之处:在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。因此,解动态规划问原创 2015-07-18 10:07:33 · 12551 阅读 · 0 评论 -
算法导论 第十五章:动态规划之棒的切割(Rod Cutting)
和分治法一样,动态规划(Dynamic programming)是通过组合子问题的解而解决整个问题的。其不同点在于:1)分治法是将问题划分成一些独立的子问题,递归求解各个子问题,然后合并子问题的解而得到原问题的解2)动态规划使用于子问题不独立的情况,也就是各个子问题包含公共的部分。若采用分治法,会有重复的求解公共部分,而动态规划算法对每个子问题只求解一次,然后抢劫过保存在一张表中,从而原创 2015-07-17 22:24:41 · 3696 阅读 · 0 评论 -
算法导论 第二十一章:不相交集合的数据结构
不相交集合(Disjoint-set )数据结构保持一组不相交的动态集合S={S(1),S(2),...,S(k)}.每个集合通过一个代表(representative)来识别,即集合中的某个成员。设x表示一个对象,不相交集合支持操作:MAKE-SET(x):建立一个新的结合,其唯一成员(也即代表)就是x。因为各集合是不相交的,故要求x没有在其他集合中出现过。UNION(x,y):将包含x原创 2015-07-18 15:41:10 · 1856 阅读 · 0 评论 -
算法导论 第二十一章:不相交集合森林
在不相交集合中的另一种更快的实现中,用有根树来表示集合。树中的每个成员指向其父节点,每棵树的根包含了代表(representative),并且是他自己的父节点。不相交森林即由多棵这样的树组成,如下图所示:[注:(b)是(a)UNION(e,g)的结果]采用上述表示方法直观上并不比采用链表表示算法更快,但是可以通过“按秩合并”和“路径压缩”来提升效率。按秩合并(union by ra原创 2015-07-18 16:14:01 · 1615 阅读 · 0 评论 -
算法导论 第二十二章:拓扑排序
拓扑排序(针对有向无回路图DAG)是深度优先搜索的一个应用,其结果图中所有顶点的一个线性排列。伪代码如下:EG:拓扑排序完整代码如下:#include#include#include#includeusing namespace std;#define UDG 0#define DG 1#define WHITE 0 #define原创 2015-07-20 01:48:08 · 957 阅读 · 0 评论 -
算法导论 第二十二章:图的搜索
图有两种标准的表示方法,即邻接矩阵和邻接表(通常邻接矩阵用于稠密图,邻接表用于稀疏图)。如下:对于图的搜索有两种方法:深度优先搜索 & 广度优先搜索。广度优先搜索(Breadth-first search) 广度优先搜索是将已发现和未发现顶点之间的边界沿其广度方向向外扩展。亦即算法首先会发现和s距离为k的所有点,然后才会发现和s距离为k+1的其他顶点。伪代码:原创 2015-07-20 01:18:45 · 955 阅读 · 0 评论 -
算法导论 第二十三章:最小生成树
如下无向图G=(V,E),首先确定几个概念:割(Cut): 如果无向图(u,v)∈E的一端点属于S,而另一个端点属于V-S时,则称(u,v)通过割(S,V-S)轻边(Light edge): 如果某条边的权值是通过一个割的所有边中最小的,则称该边为通过这个割的一条轻边。安全边(Safe edge): 如果一条边(u,v)能够加入集合A中而不违反循环不变式,则该边称为安全边。也即A∪原创 2015-07-20 22:38:11 · 985 阅读 · 0 评论 -
算法导论 第二十四章:单源最短路径
在单源路径问题中常涉及到松弛技术(Relaxation),其原理如下:Bellman-Ford 算法该算法主要是解决边的权重可能为负的情况。伪代码如下:EG:运行时间:O(VE)。Bellman-Ford 算法的一个重要应用是差分约束(Difference and Constraints),其原理如下:对于一个差分约束Ax有像无循原创 2015-07-20 23:43:43 · 1850 阅读 · 0 评论 -
算法导论 第二十五章:有向图的传递闭包
已知一有向图G=,顶点集合V={1,2,...,n},我们可能希望确定对所有顶点对i,j ∈ V,图G中事发后都存在一条从i到 j 的路径。G的传递闭包定义为图,其中: 在Θ(n^3)时间内计算出图的传递闭包的一种方法是对E中每条边赋以权值1,然后运行Floyd-Wars原创 2015-07-21 01:20:54 · 7673 阅读 · 0 评论 -
算法导论 第二十五章:每对顶点间的最短路径
Floyd-Warshall 算法 设G的顶点为V={1,2,...,n},对于每个k考虑顶点的一个子集{1,2,...,k}。对于任意一对顶点i,j ∈ V,考察 从i到 j 且中间顶点皆属于集合{1,2,...,k}的所有路径,设p是其中的一条最小权值路径:1)如果k不是路径p中的中间顶点,则p的所有中间顶点皆在集合{1,2,...,k-1}中。因此从顶点i到顶点j且满足所有中间顶原创 2015-07-21 00:49:54 · 1368 阅读 · 0 评论 -
算法导论 第四章:分治法(一)
无论是在生活中还是在计算机科学中,“分而治之”的思想占据着举足轻重的地位,其原理如下: 1)将一个复杂的问题分成若干个相同或相似的子问题 2)递归求解子问题,当子问题规模很小时,可直接求解 3)将所有子问题的解合并,即为原问题的解 两个例子:1.最大子数组问题(maximum-subarray problem) 即一段非空的,连续的有最大和的一原创 2015-07-13 16:38:21 · 760 阅读 · 0 评论 -
算法导论 第三十一章:数论
1.求两个数的最大公约数方法一:欧几里得算法(辗转相除)递归形式,如伪代码:非递归形式:1)计算 r=a mod b(0≤r2) 互换:置 a←b,b←r,并返回第1步。方法二:扩展的欧几里得算法d=gcd(a,b)=ax+by伪代码如下:========================================原创 2015-07-21 20:19:31 · 943 阅读 · 0 评论 -
算法导论 第十八章;B 树
B树是为磁盘或其他直接存取辅助存储设备而设计的一种平衡查找树。B树的”分支因子“可能很大,即每个节点可以有很多子女。这一因子由所用磁盘特性所决定,并且可以降低磁盘I/O操作次数。许多数据库系统都使用B树或B树的变形来存储信息。B树结构形式如下:其特点:1)每个节点x有以下域:a) x.n:当前存储在节点x中的关键字b) x.n 个key值,以非降序顺序存放,即 x.key原创 2015-07-18 11:34:27 · 942 阅读 · 0 评论 -
算法导论 第十四章:区间树
区间树是一种对动态集合进行维护的红黑树,具体设计如下:step1:基础数据结构 我们选择的基础数据结构式红黑树,其中每个节点增加原创 2015-07-16 21:23:32 · 12589 阅读 · 2 评论 -
算法导论 第四章:分治法(二)
矩阵乘法问题 设矩阵A,B是nxn的方阵,我们将用分治法求解 C=A*B 。 我们用蛮力方法求解的运行时间复杂度为:。利用分治法,将A,B,C划分成4个n/2 x n/2 的矩阵,如下: 所以有: 采用分治思想,其伪代码表示如原创 2015-07-13 19:04:19 · 653 阅读 · 0 评论 -
算法导论 第五章:随机算法
许多随机算法通过排列给定输入数组来是输入随机化。在这里我们将讨论两种随机化方法。假设给定一个数组A,他包含元素1到n,我们的目标就是构造这个数组的一个随机排列。 方法一: 为数组中个每一个元素A[i]赋予一个随机优先级P[i],然后根据优先级对数组A中的元素进行排序。如初始数组A=,且随机的优先级P=,将得出数列B=,因为第2个优先级最小,接着是第4个,...这个过原创 2015-07-13 20:21:11 · 837 阅读 · 0 评论 -
算法导论 第三章:渐进符与递归式的求解
递归式的纠结是在第四章讲的,这里提到第三章来和渐渐进符一起简要介绍。1. 五种渐近符(Asymptotic notation) 2. 三种求解递归式(recurrences)的方法(1)代入法(substitution method)两步骤:a.猜测解的形式 (靠经验)b.用数学归纳法找出满足的解的常数EG:用代入法求解:原创 2015-07-13 14:38:57 · 1644 阅读 · 0 评论 -
算法导论 第六章:堆排序
(二叉)堆数据结构是一种数组对象,如下图所知,他可以被视为一颗完全二叉树。其有如下性质:1)对于i节点(i表示下标),其父节点为Li/2」,左孩子节点为2i,右孩子节点为2i+12)最大堆满足:A[PARENT(i)] ≥ A[i] ;最小堆满足:A[PARENT(i)] ≤ A[i]3)堆的高度为:Θ(lgn)4)子数组元素A[ (Ln/2」+1)...n]是树中的所原创 2015-07-14 18:49:24 · 705 阅读 · 0 评论 -
算法导论 第七章:快速排序(Quicksort)
前面我们谈论到的归并排序、堆排序的时间复杂度都是O(nlgn),快速排序的时间复杂度也为Θ(nlgn)。但在实际中,快排序往往要优于前两种,因为隐藏在Θ(nlgn)中的常数因子非常小。此外,快速排序是一种就地(in place)排序,在虚拟内存、硬件缓存等环境中非常有效。 快速排序的基本原理为分治:1)将数组A[p...r]划分成两个子数组A[p...q-1]和A[q+1...r]原创 2015-07-14 19:53:33 · 673 阅读 · 0 评论 -
算法导论 第八章:线性时间排序
1.计数排序(Counting sort) 其基本思想是:对于每一个元素x,确定小于x的元素的个数,然后直接将x放在输出数组的合适位置中。其伪代码如下:EG:每个输入的元素的范围是0~k,k 不能太大,如果太大,分配给C的内存就会很大!当k=O(n)时,该算法的时间复杂度为:Θ(n)。此外计数排序是稳定排序,这一思想在接下来介绍的基数排序中很有用。计数排序完整代码如原创 2015-07-14 21:20:08 · 593 阅读 · 0 评论 -
算法导论 第十一章:哈希表
当将一个域U中的元素映射到一个哈希表T中时,我们如何映射?若映射到同一位置怎么办?前一个问题我们通过hash函数来解决,后一个问题我们通过“冲突处理”解决。1.Hash 函数(1)除法 h(k) = k mod m m的选取:素数,且不要太靠近 2的幂次方(2)乘法其中,0EG:当m=8=2^3,w=7时:(3)全域哈希原创 2015-07-15 21:22:18 · 1103 阅读 · 0 评论 -
算法导论 第六章:优先级队列
虽然堆排序的时间复杂度为O(nlgn),但在实际中,快速排序(下一章将介绍)往往要优于堆排序。尽管如此,堆数据结构在其他方面有着很大的用处,如用于优先级队列的实现。因为堆可让优先级队列的所有操作的时间复杂度为O(lgn)。最大优先级队列常用于共享主机上的作业调度,最小优先级队列常用于事件驱动的模拟中。以最大优先级队列为例,其支持的操作如下:1)INSERT(S,x): 向集合中插入元素x原创 2015-07-14 19:10:10 · 861 阅读 · 0 评论 -
算法导论 第十章:基本数据结构
1.栈基本操作:所有操作的运行时间均为:O(1)2.队列基本操作:所有操作的运行时间均为:O(1)3.链表基本操作:SEARCH和DELETE操作的时间为:Θ(n),INSERT操作的时间为:O(1)4.指针与对象对象的多重数组表示:对象的单数组表示:5.有根树有根树的表示:【注:这一章写的很简单,原创 2015-07-15 16:27:16 · 589 阅读 · 0 评论 -
算法导论 第十二章:二叉查找树(Binary Search Trees)
二叉查找树具有如下性质: x是二叉查找树中的一个节点,如果y是x左子树中的一个节点,则y.key ≤ x.key ; 如果 y 是 x 右子树中的一个节点,则 x.key ≥ y.key. 在二叉树上执行的基本操作的时间与树的高度成正比。当这棵树是完全二叉树时,这些操作的最坏情况运行时间为Θ(lgn);如果该树是含n个节点的线性链,则这些操作的最坏情况的运行时间为原创 2015-07-16 16:49:12 · 750 阅读 · 0 评论 -
算法导论 第十三章:红黑树
红黑树(red-black tree)是一种“平衡”查找树,它能保证最坏情况下,基本的动态集操作时间为O(lgn).性质:1)每个节点要么是红的,要么是黑的2)根节点和叶子节点(NIL)是黑色的3)若一个节点是红色的,则他的两个孩子节点是黑色的4)对于每一个节点x,从该节点到其子酸节点的所有路径上包含相同数目的黑节点(#black nodes = black-height(x)原创 2015-07-16 17:24:32 · 775 阅读 · 0 评论 -
算法导论 第九章:顺序统计量(Order Statistic)
在一个由n个元素组成的集合中,第i个顺序统计量(order statistic)即为该集合中第i小的元素。当i=1时,即为最小值;当i=n时,即为最大值;当i=L(n+1)/2」时,即为中位数(median)。求第i个顺序统计量可以定义为形式化的定义为选择问题(selection problem): 输入:一个包含n个(不同的)的书的集合A和一个数i,1≤i≤n 输出:元素x∈A,它恰原创 2015-07-15 14:50:39 · 3954 阅读 · 0 评论 -
算法导论 第十四章:数据结构的扩张
对一种数据结构的扩张过程可分为四步骤:1)选择基础数据结构2)确定要在基础数据结构中添加哪些信息3)验证可用基础数据结构上的基本修改操作来维护这些新添加的信息4)设计新的操作动态顺序统计 动态顺序统计在红黑树的基础上添加x.size域,满足:x.size = x.left.size+x.right.size+1,扩张的结构如下:操作:1)检索具有给定秩的元原创 2015-07-16 20:36:32 · 755 阅读 · 0 评论 -
算法导论 第三十三章:字符串匹配
朴素字符串匹配算法 用一个循环来找出所有有效位移,该循环对n-m+1个可能的每一个s值检查条件P[1...m]=T[s+1...s+m]。伪代码如下:EG:Rabin-Karp 算法 已知一个模式P[1...m],设p表示其相应的十进制数的值。类似地,对于给定的文本T[1...n],用ts来表示长度为m的子字符串T[s+1...s+m] (s=0,1,.原创 2015-07-21 22:46:31 · 683 阅读 · 0 评论