随笔分类 - [19]【结构算法】
摘要:数据结构相关图 Good Good Study, Day Day Up. 顺序 选择 循环 总结
阅读全文
摘要:【1】字符串匹配问题分析 (1)字符串匹配一般算法 与 KMP算法比较: 一般算法:从父串的第一个字符开始与子串的第一个字符开始比较: 1、若相等,再比较各自的第二个字符,依次循环进行,直到整个子串结束。在子串没有完全匹配完之前,若有一个字符不相等。请参考以下若不相等。 2、若不相等,从父串的第二个
阅读全文
摘要:【1】双链表 双链表即双向链表,双链表的节点结构定义如下: 双链表节点结构如下图示: 双链表节点比单链表多一个前驱指针域。 【2】C语言版双链表 1、无环双链表。实现部分代码如下: 2、循环双链表。实现部分代码如下: 注意:双链表循环与无环的区别。 【3】C++版双链表 1、循环双链表,实现部分功能
阅读全文
摘要:【1】为什么需要平衡二叉树? 矛盾是推进事物向前发展的源动力。 那么平衡二叉树是从哪里来?肯定是有矛盾存在的。请看下面的分析: 【2】什么是平衡二叉树? 平衡二叉树的基本认识: 【3】平衡二叉树的构建原理 平衡二叉树的形成肯定是有一定规律可循的,那么平衡二叉树的“生长”原理是什么呢? 请看程老师下面
阅读全文
摘要:【1】二叉排序树二叉排序树,又称为二叉查找树。它或者是一棵空树,或者具有下列性质:1. 若它的左子树不空,则左子树上所有的结点的值均小于它的根结点的值;2. 若它的右子树不空,则右子树上所有的结点的值均大于它的根结点的值;3. 它的左右子树也分别为二叉排序树。【2】二叉排序树的代码实现结合下图以及实现代码分析(1)构建二叉排序树(2)实现代码 1 #include 2 using namespace std; 3 4 template class BST; 5 6 template 7 class BstNode 8 { 9 friend class BS...
阅读全文
摘要:【1】线性索引索引就是把一个关键字与它对应的记录相关联的的过程。索引是为检索而存在的。一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引,树形索引和多级索引。所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。重点了解三种线性索引:稠密索引,分块索引和倒排索引。【2】稠密索引稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项。所下图所示:对于稠密索引这个索引表而言,索引项一定是按照关键码有序的排列。为什么要这样做呢?索引项有序也就意味着,我们要查找关键字时,
阅读全文
摘要:【1】查找概论 查找表是由同一类型是数据元素(或记录)构成的集合。 关键字是数据元素中某个数据项的值,又称为键值。 若此关键字可以唯一标识一个记录,则称此关键字为主关键字。 查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找分为两类:静态查找表和动态查找表。 静态查找表:只作查找操作的查找表。主要操作: (1)查询某个“特定的”数据元素是否在查找表中。 (2)检索某个“特定的”数据元素和各种属性。 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经已经存在的某个数据元素。 主要操作: (1)查找时插入数据元素。 (2)查找时删
阅读全文
摘要:【1】关键路径 在我的经验意识深处,“关键”二字一般都是指临界点。 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点。 关键路径也正是研究这个临界点的问题。 在学习关键路径前,先了解一个AOV网和AOE网的概念: 用顶点表示活动,用弧表示活动间的优先关系的有向图: 称为顶点表示活动的网(Act
阅读全文
摘要:【1】拓扑排序在一个表示工程的有向图中,有顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。AOV网中的弧表示活动之间存在的某种制约关系。所谓拓扑排序,其实就是对一个有向图构造拓扑序列的过程。【2】拓扑排序算法对AOV网进行拓扑排序的基本思路:从AOV网中选择一个入度为0的顶点输出;然后删除此顶点,并删除以次顶点为尾的弧;继续重复此操作.....直到输出全部顶点或AOV网中不存在入度为0的顶点为止。由于拓扑排序过程中,需要删除顶点,显然用邻接表更加方便。因此我们需要为AOV网建立一个邻接表。另外,考虑到算法过程中始终需要查找入度为0的顶点?需要在原顶点
阅读全文
摘要:【1】为什么需要弗洛伊德算法?带权图中单个源点到所有顶点的最短路径问题可以用《迪杰斯特拉算法》求解。那如果要求图中每一个顶点与其它顶点之间的最短路径呢?类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次。这样,理论上我们便可以求得每一个顶点与其它顶点的最短路径,总的执行时间为O(n3)。好吧!为了实现这个中需求,可以采用另外一种求解算法:弗洛伊德算法。为了更好的理解弗洛伊德算法的精妙,我们先看简单的案例。如下图是一个最简单的3个顶点连通网图:【2】弗洛伊德算法弗洛伊德算法是非常漂亮的算法,简洁直观大气上档次。不过很可惜由于它的三重循环,因此也是O(n*n*n)的时间复杂
阅读全文
摘要:【1】最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径。 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径。并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径。 别废话了!整点实际的哈,你能很快计算出下图中由源点V0到终点V8的最短路径吗? 【2】迪杰斯特拉算法 迪杰斯特拉算法是按路径长度递增的次序产生最短路径的思路求解。 具体算法及其详细讲解如下:阅读程序前,先要搞明白几个数组作用: final[w]=1; 表示V0到Vw顶点已
阅读全文
摘要:【1】克鲁斯卡尔算法普里姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。克鲁斯卡尔算法是直接以边为目标去构建。因为权值是在边上,直接去找最小权值的边来构建生成树也是很自然的想法,只不过构建时要考虑是否会形成环路而已。此时我们用到了图的存储结构中的边集数组结构。以下是边集数组结构的定义代码:本算法所用同普里姆算法的实例,我们直接创建图的边集数组。并对边的权值从小到大排序后如下图:【2】克鲁斯卡尔算法及详解克鲁斯卡尔算法及其详解:鉴于此算法很简单,当 i=0, i=1, i=2时执行结果可以眼观,不再赘述。直接分析重点:此算法的Find函数由边数e决定,时间复杂度为O(loge
阅读全文
摘要:【1】什么是最小生成树?对于连通的带权图(连通网)G,其生成树也是带权的。生成树T各边的权值总和称为该树的权。权最小的生成树称为G的最小生成树(Minimum SpannirngTree)。简记为MST。注意:最小是指权值最小一个连通图的生成树是一个极小的连通子图,它包含全部的顶点,但只有足以构成一棵树的n-1条边。求最小生成树有两种算法:普里姆算法和克鲁斯卡尔算法不好理解?看不懂?能通俗点不?看个实例哈:假设你是电信实施工程师,需要为一个镇的九个村庄架设通信网络做设计。村庄位置大致如下图,之间连线的数字表示村与村间的可通达直线距离。你们领导要求你必须用最小的成本完成这次任务。你说怎么办?好,
阅读全文
摘要:【1】图的基本概念(1)图是由顶点集合以及顶点间的关系集合组成的一种数据结构。 Graph = (V,E) V是顶点的又穷非空集合;E是顶点之间关系的有穷集合,也叫边集合。 (2)有向图:顶点对是有序的;无向图:顶点对是无序的。 (3)无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边,用无序偶对(Vi,Vj)来表示。 如果图中任意两个顶点时间的边都是无向边,则称该图为无向图: 由于是无向图,所以连接顶点A与D的边,可以表示为无序对(A,D),也可以写成(D,A) 对于如上无向图来说,G=(V,{E}) 其中顶点集合V={A,B,C,D};边集合E={(A,B),(B...
阅读全文
摘要:【1】什么是堆?堆是一种特殊的完全二叉树(关于完全二叉树可以参见随笔《树》)。堆分为两种:最大堆和最小堆最大堆只需要满足父节点大于两个子节点,而子节点之间没有要求。最小堆只需要满足父节点小于两个子节点,而子节点之间没有要求。那么,既然作为一棵完全二叉树,每层中的节点应该是从左到右填满的。如果一个节点没有左儿子,那么它一定也没有右儿子。并且在第N层中如果存在节点,肯定是由左向右依次排列,而且第N-1层必须是填满的。【2】堆的实现最小堆的实现代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using...
阅读全文
摘要:【1】队列的概念 (1)队列(Queue)是运算受到限制的一种线性表。 只允许在表的一端进行插入,而在另一端进行删除元素的线性表。 队尾(rear)是允许插入的一端。队头(front)是允许删除的一端。 (2)空队列是不含元素的空表。 (3)队列是先进先出的线性表。 【2】循环队列 关于循环队列请看
阅读全文
摘要:【1】栈的基本概念 (1)栈是限定仅在表尾进行插入和删除操作的线性表。所谓的表尾是指栈顶,而不是栈底。 (2)栈是后进先出的线性表。 (3)把允许插入和删除的一端称为栈顶,另一端称为栈底。 (4)不含任何元素的栈称为空栈。 判定条件为top等于-1。 (5)栈是一个线性表,栈元素具有线性关系。 【2
阅读全文
摘要:【1】线性表的链式存储 线性表的顺序存储结构特点: 逻辑关系上相邻的两个元素在物理位置上也相邻; 可以随机存取任一元素,它的存储位置可用一个简单直观的公式表示。 然而,从另一个角度来看,这个优点也表明了这种存储结构的弱点: 在做插入或删除操作时,需要移动大量的元素。 线性表的链式存储不要求逻辑上相邻
阅读全文
摘要:【1】树的基本概念 1: 树属于一种非线性数据结构 2: 树以分支关系描述数据元素之间的层次结构 3: 树(tree)是 n(n≥0) 个结点的有限集 4: 树的结构中,有且仅有一个特殊的结点,称为树的根结点(root) 5: 树中存在唯一的称为根的数据元素 6: 树中各子树是互不相交的集合 7:
阅读全文
摘要:【1】线性结构在数据元素的非空有限集中,线性结构特点:a. 存在唯一的一个被称作“第一个”的数据元素b. 存在唯一的一个被称作“最后一个”的数据元素c. 除第一个之外,集合中的每个数据元素均只有一个前驱d. 除最后一个之外,集合中每个数据元素均只有一个后继【2】线性表线性表是最常用且简单的一种数据结构。一个线性表是n个数据元素的有限序列。线性表中的数据元素可以是各种各样的,但同一线性表中的元素必定具有相同特性。在复杂的线性表中,一个数据元素可以由若干个数据项组成。这种情况下,常把数据元素称为记录。而含大量记录的线性表称为文件。【3】顺序表线性表的顺序表示指用一组地址连续的存储单元依次存储线性表
阅读全文