上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 24 下一页

2018年2月26日

静态查找表 - 顺序查找、二分查找、插值查找、斐波纳契查找

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

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

AOE网与关键路径简介

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

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

AOV网与拓扑排序

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

posted @ 2018-02-26 10:23 AlanTu 阅读(3710) 评论(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 阅读(642) 评论(0) 推荐(0) 编辑

最短路径 - 迪杰斯特拉(Dijkstra)算法

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

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

图解最小生成树 - 克鲁斯卡尔(Kruskal)算法

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

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

图解最小生成树 - 普里姆(Prim)算法

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

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

图 - 广度优先遍历

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

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

图 - 深度优先遍历

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

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

图 - 存储结构之邻接表

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

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

图 - 存储结构之邻接矩阵

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

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

图 - 定义和术语总结

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

posted @ 2018-02-26 10:03 AlanTu 阅读(308) 评论(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 阅读(231) 评论(0) 推荐(0) 编辑

迷宫问题 - 队列与广度优先搜索

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

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

迷宫问题 - 堆栈与深度优先搜索

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

posted @ 2018-02-26 09:58 AlanTu 阅读(1138) 评论(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 阅读(155) 评论(0) 推荐(0) 编辑

单链表 - 插入和删除操作

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

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

双向链表实现队列与循环链表

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

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

二叉树 - 定义和性质以及特殊二叉树

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

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

树 - 定义和基本概念

摘要: 一、树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(root)的结点。 (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,....,Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree),如 阅读全文

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

字符串 - KMP模式匹配

摘要: 在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数)。而计算机的大仙们发现这种回溯其实可以是不需要的。既然i值不回溯,也就是不可以变小,那么考虑的变化就是子串的pos值(j)了。通过分析发现子串中如果有相等字符,j值的变化就会不相同,也就是说,这个 阅读全文

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

字符串 - 基本操作

摘要: 字符串(string)是由0个或多个字符组成的有限序列。一般使用顺序存储结构,末尾以'\0'表示结束,但不计入字符串的长度。 示例程序:(改编自《大话数据结构》) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 阅读全文

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

队列 - 链式存储结构

摘要: 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点。空队列时,front和rear都指向头节点。 示例程序:(改变自《大话数据结构》) C++ Code 1 2 3 4 5 6 7 8 阅读全文

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

循环队列 - 顺序存储结构

摘要: 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO)。允许插入的一端称为队尾,允许删除的一端称为队头。我们在《栈的顺序存储结构》中发现,栈操作的top指针在Push时增大而在Pop时减小,栈空间是可以重复利用的,而队列的front、rear 阅读全文

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

栈 - 链式存储结构

摘要: 当单链表限定只能在头部进行插入和删除操作的时候,即为链栈,一般我们会将单链表的头指针和栈的栈顶指针top合二为一,通常对链栈来说,是不需要头节点的,因为我们维护了栈顶指针。对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间,对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 阅读全文

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

栈 - 顺序存储结构

摘要: 栈(stack)是限定在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom) ,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 示例程序:(改编自《大话数据结构》) C++ Code 1 2 3 4 5 6 阅读全文

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

两栈共享存储空间

摘要: 数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为栈的末端,即下标为数组长度 n-1处。这样,如果两个栈增加元素,就是两端点向中间延伸。当top1 + 1 == top2 的时候为栈满。 示例代码:(改编自《大话数据结构》) C++ Code 1 2 3 4 5 阅读全文

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

静态链表

摘要: 首先我们让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每一个下标都对应一个data和一个cur。 数据域data用来存放数据元素,也就是通常我们要处理的数据;而游标cur相当于单链表中的next指针, 存放该元素的后继在数组中的下标。我们把这种用数组描述的链表叫做静态链表。 数 阅读全文

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

线性表 - 链式存储结构

摘要: 为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一个指示其 直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像,称为结点(Node)。N个结点链结成一个链表, 即为线性表(a1,a2,...,an)的链式存储结 阅读全文

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

线性表 - 顺序存储结构

摘要: 线性表的数据对象集合为 {a1,a2,....an},每个元素的类型均为Datatype。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。 线性表的顺序存储结构的优缺点: 优点:无须为表示表中 阅读全文

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

快速排序以及第k小元素的线性选择算法

摘要: 简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。时间复杂度为O(nlogn) 一.《data structure and 阅读全文

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

虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

摘要: 五条基本规则: 1、如果基类已经插入了vptr, 则派生类将继承和重用该vptr。vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的。 2、在遇到通过基类指针或引用调用虚函数的语句时,首先根据指针或引用的静态类型来判断所调函数是否属 阅读全文

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

详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

摘要: 一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文章。在使用boost库之前应该先下载后放在某个路径,并在VS 包含目录中添加。下面是boost 库里面的智能 阅读全文

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

容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

摘要: 一、容器适配器 stack queue priority_queue stack、queue、priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/deque/list对象创建了一个先进后出容器;queue是用deque或list对象创建了一个先进先 阅读全文

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

迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}

摘要: 一、迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章。 二、插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterator back_inserter front_insert_iterator front_insert 阅读全文

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

函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例

摘要: 一、适配器 三种类型的适配器: 容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈、队列和优先级队列 迭代器适配器:(反向迭代器、插入迭代器、IO流迭代器) 函数适配器:函数适配器能够将仿函数和另一个仿函数(或某个值、或某个一般函数)结合起来。 针对成员函数的函数适配器 针对一般函数的函数适 阅读全文

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

函数对象、 函数对象与容器、函数对象与算法

摘要: 一、函数对象 1、函数对象(function object)也称为仿函数(functor) 2、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。 3、任何重载了调用运算符operator()的类的对象都满足函数对象的特征 4、函数对象可以把它称之为smart function。 5、ST 阅读全文

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

剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)

摘要: 一、移除性算法 (remove) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 4 阅读全文

posted @ 2018-02-26 08:55 AlanTu 阅读(328) 评论(0) 推荐(0) 编辑

变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

摘要: 首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针。如果在函数内对容器元素做了修改,那么就属于变动性算法。 变动性算法源代码分析与使用示例: 一、copy、copy_backward C++ Code 1 2 3 4 5 阅读全文

posted @ 2018-02-26 08:53 AlanTu 阅读(399) 评论(0) 推荐(0) 编辑

上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 24 下一页

导航