随笔分类 -  算法与数据结构

静态查找表 - 顺序查找、二分查找、插值查找、斐波纳契查找
摘要:查找表(Search table)是由同一类型的数据元素(或记录)构成的集合。关键字(key)是数据元素中某个数据项的值,又称为键值,用它可以表示一个数据元素,也可以标识一个记录的数据项(字段),称之为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(primary key)。而对于 阅读全文

posted @ 2018-02-26 10:27 AlanTu 阅读(550) 评论(0) 推荐(0) 编辑

AOE网与关键路径简介
摘要:前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题。如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程,这个流程的时间就是最短时间。 在前面讲了AOV网的基础上,来介绍一个新的概念。在一个表示工程的带权有 阅读全文

posted @ 2018-02-26 10:25 AlanTu 阅读(5442) 评论(1) 推荐(0) 编辑

AOV网与拓扑排序
摘要:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex Network)。AOV网中的弧表示活动之间存在的某种制约关系,AOV网中不能存在回路,让某个活动的开始要以自己完成作为先决条件,显然是不可 阅读全文

posted @ 2018-02-26 10:23 AlanTu 阅读(3776) 评论(1) 推荐(1) 编辑

最短路径 - 弗洛伊德(Floyd)算法
摘要:为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例。图7-7-12的左图是一个简单的3个顶点的连通网图。 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点的最短路径权值和的矩阵。P代表对应顶点的最短路径的前驱矩阵。在未分析任何顶点之前,我们将D命名为D( 阅读全文

posted @ 2018-02-26 10:20 AlanTu 阅读(649) 评论(0) 推荐(0) 编辑

最短路径 - 迪杰斯特拉(Dijkstra)算法
摘要:对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法。本文先来讲第一种,从某个源点到其余各顶点的最短路径问题。 这是一个按路径长度递增的次序产生最 阅读全文

posted @ 2018-02-26 10:17 AlanTu 阅读(659) 评论(0) 推荐(0) 编辑

图解最小生成树 - 克鲁斯卡尔(Kruskal)算法
摘要:我们在前面讲过的《克里姆算法》是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树也是很自然的想法,只不过构建时要考虑是否会形成环而已,此时我们就用到了图的存储结构中的边集数组结构,如图7-6- 阅读全文

posted @ 2018-02-26 10:13 AlanTu 阅读(3130) 评论(0) 推荐(0) 编辑

图解最小生成树 - 普里姆(Prim)算法
摘要:我们在图的定义中说过,带有权值的图就是网结构。一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树 阅读全文

posted @ 2018-02-26 10:11 AlanTu 阅读(6215) 评论(0) 推荐(0) 编辑

图 - 广度优先遍历
摘要:图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traverse Graph)。 图的遍历方法一般有两种,第一种是我们在前面讲过的《深度优先遍历(Depth First Search)》,也有称为深度优先搜索,简称为DFS。第二 阅读全文

posted @ 2018-02-26 10:09 AlanTu 阅读(5644) 评论(0) 推荐(0) 编辑

图 - 深度优先遍历
摘要:图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traverse Graph)。 图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也有称为深度优先搜索,简称为DFS。第二种是《广度优先遍历( 阅读全文

posted @ 2018-02-26 10:07 AlanTu 阅读(480) 评论(0) 推荐(0) 编辑

图 - 存储结构之邻接表
摘要:对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法。 邻接表的处理方法是这样的。 1、图中顶点用一个一维数组存储,另外,对于 阅读全文

posted @ 2018-02-26 10:06 AlanTu 阅读(5471) 评论(0) 推荐(0) 编辑

图 - 存储结构之邻接矩阵
摘要:图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 我们来看一个实例,图7-4-2的左图就是一个无向图。 我们再来看一个有向图样例 阅读全文

posted @ 2018-02-26 10:04 AlanTu 阅读(451) 评论(0) 推荐(0) 编辑

图 - 定义和术语总结
摘要:一、图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中的数据元素,我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是 阅读全文

posted @ 2018-02-26 10:03 AlanTu 阅读(316) 评论(0) 推荐(0) 编辑

线索二叉树
摘要:我们知道满二叉树只是一种特殊的二叉树,大部分二叉树的结点都是不完全存在左右孩子的,即很多指针域没有被充分地利用。另一方面我们在对一棵二叉树做某种次序遍历的时候,得到一串字符序列,遍历过后,我们可以知道结点之间的前驱后继关系,也就是说,我们可以很清楚地知道任意一个结点,它的前驱和后继是哪一个。可是这是 阅读全文

posted @ 2018-02-26 10:02 AlanTu 阅读(265) 评论(0) 推荐(0) 编辑

二叉树 - 遍历和存储结构
摘要:在《二叉树的定义和性质》中我们已经认识了二叉树这种数据结构。我们知道链表的每个节点可以有一个后继,而二叉树(Binary Tree)的每个节点可以有两个后继。比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char it 阅读全文

posted @ 2018-02-26 10:00 AlanTu 阅读(235) 评论(0) 推荐(0) 编辑

迷宫问题 - 队列与广度优先搜索
摘要:队列也是一组元素的集合,也提供两种基本操作:Enqueue(入队)将元素添加到队尾,Dequeue(出队)从队头取出元素并返回。就像排队买票一样,先来先服务,先入队的人也是先出队的,这种方式称为FIFO(First In First Out,先进先出),有时候队列本身也被称为FIFO。 下面我们用队 阅读全文

posted @ 2018-02-26 09:59 AlanTu 阅读(1718) 评论(0) 推荐(0) 编辑

迷宫问题 - 堆栈与深度优先搜索
摘要:堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0 阅读全文

posted @ 2018-02-26 09:58 AlanTu 阅读(1142) 评论(0) 推荐(0) 编辑

Solutions for the Maximum Subsequence Sum Problem
摘要:The maximum subarray problem is the task of finding the contiguous subarray within a one-dimensional array of numbers (containing at least one positiv 阅读全文

posted @ 2018-02-26 09:57 AlanTu 阅读(156) 评论(0) 推荐(0) 编辑

单链表 - 插入和删除操作
摘要:下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示。 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见《单链表反转》,否则程序后面的w 阅读全文

posted @ 2018-02-26 09:51 AlanTu 阅读(3045) 评论(0) 推荐(0) 编辑

双向链表实现队列与循环链表
摘要:一、双向链表(double linked list)如图26.5,是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。双向链表的基本操作与单链表基本一样,除了插入和删除的时候需要更改两个指针变量,需要注意的是修改的顺序很重要,插入如图3-14-5,删除如图3-14-6。 链表的delete操作 阅读全文

posted @ 2018-02-26 09:48 AlanTu 阅读(3133) 评论(0) 推荐(0) 编辑

二叉树 - 定义和性质以及特殊二叉树
摘要:一、二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。如图1就是一棵二叉树 图1 二叉树的特点: (1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。 (2)左 阅读全文

posted @ 2018-02-26 09:46 AlanTu 阅读(5547) 评论(0) 推荐(0) 编辑

导航