数据结构
文章平均质量分 84
starter_zheng
这个作者很懒,什么都没留下…
展开
-
线性表 —— 链表
一、链表在链表存储中,每个结点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息,如单链表中前驱结点包含后继结点的地址信息,这样就可以通过前驱结点中的地址信息找到后继结点的位置。链表的特性:不支持随机访问支持存储空间的动态分配链表中进行插入操作无须移动元素二、 单链表在每个结构中除了包含数据域外,还包含一个指针域,用以指向其后继结点。带头结点的单链表中,头指针 hea...原创 2019-11-10 10:52:24 · 1217 阅读 · 0 评论 -
数据结构 —— 算法的时间复杂度
一、非递归情况二、递归情况(迭代法)迭代法的基本步骤是先将递归算法简化为相应的递归方程,然后通过重复迭代,将递归方程的右端变换成一个级数,最后求级数的和,再预计和的渐进阶。示例1:算法的递归方程为:T(n) = T(n - 1) + O(1)请给出该算法的时间复杂度迭代展开:T(n) = T(n - 1) + O(1) = T(n - 2) + O(1) + O(...原创 2019-11-10 10:05:03 · 1321 阅读 · 0 评论 -
查找 —— 平衡二叉排序树
一、定义二叉排序树的时间复杂度为 O(n),平衡二叉排序树的时间复杂度为 O(logn)平衡二叉树又称 AVL 树,是一种特殊的二叉排序树,拥有更高的查询效率。平衡二叉树或是一棵空树,或满足下列性质的一棵非空的二叉树T:T的左子树和右子树的深度之差的绝对值不超过1;T的左子树和右子树均为平衡二叉树。二叉树T的结点平衡因子BF(Balance Factor)为左子树的深度减去右子树的深...原创 2019-06-27 15:55:12 · 756 阅读 · 0 评论 -
图 —— 图的遍历搜索
深度优先搜索遍历图的深度优先搜索遍历类似于二叉树的先序遍历。它的基本思想是:首先访问出发点 v,并将其标记为已访问;然后选取与 v 邻接的未被访问的任意一个顶点 w,并访问它;再选取与 w 邻接的未被访问的任一顶点并访问,以此重复进行。实现int visit[maxSize]; //全局变量,用于存储结点是否被访问void DFS(AGraph *G,int v) //参数:图G和访问点...原创 2019-06-24 16:38:39 · 297 阅读 · 0 评论 -
查找 —— 二叉排序树
一、定义二叉排序树(Binary Sort Tree)或是一棵空树,或满足下列性质的一棵非空的二叉树T:如果T的左子树非空,则左子树所有结点值小于T的根值;如果T的右子树非空,则右子树所有结点值大于T的根值;T的左子树和右子树均为二叉排序树。二、查找关键字(1)算法思想(2)实现typeof struct BTNode{ int key; struct BTNode...原创 2019-07-03 07:58:47 · 331 阅读 · 0 评论 -
排序 —— 最佳归并树
一、引入初始记录经过 ”置换-选择“ 排序后,得到的是长度不等的初始归并段,此时需要进行归并排序。在外部排序的归并排序中,将当前的 p 组记录(每组含 k 个记录段)归并为存放到外存的 p 个有序记录的过程称为一趟归并,可见每个记录在每趟归并中需要两次 I/O操作(读写操作各一次),因此为了优化归并树的带权路径长度,减少归并次数,需要用到 “最佳归并树”二、算法思想参考哈夫曼树三、算法...原创 2019-07-02 17:50:30 · 3065 阅读 · 0 评论 -
图 —— 图的存储结构
邻接矩阵一个图的邻接矩阵表示是唯一的。适合于稠密图的存储。邻接矩阵的存储空间为O(n^2)邻接矩阵是图的顺序存储结构顶点类型:typedef struct { int no; // 顶点编号 char info; // 顶点的其他信息}VertexType; // 顶点类型图的邻接矩阵类型:typedef struct { int edges[maxSiz...原创 2019-06-24 11:48:54 · 617 阅读 · 0 评论 -
排序 —— 置换-选择算法
一、引入生成初始归并段时,我们把含有 n 个记录的文件传入内存,按照给定的 内排序算法 或 置换-选择排序算法 划分成 m 个规模较小的有序的记录段。内排序算法生成初始归并段的过程如下:把含有 n 个记录的文件,按内存大小 w 分成若干长度为 w 的子文件(归并段);分别将各子文件(归并段)调入内存,采用有效的内排序方法排序后送回外存。产生 n/w 个初始归并段。我们可以看到,使用...原创 2019-07-02 17:01:42 · 5090 阅读 · 0 评论 -
图 —— 图的基本概念
图我们知道,数据之间的关系有 3 种,分别是 “一对一”、“一对多” 和 “多对多”,前两种关系的数据可分别用线性表和树结构存储,而图存储结构用于表示"多对多"的关系。图由结点的有穷集合 V 和边的集合 E 组成。为了与树形结构进行区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对。若两个顶点之间存在一条边,则表示这两个顶点具有相邻关系。有向图...转载 2019-06-24 07:24:41 · 873 阅读 · 0 评论 -
查找 —— 散列表
一、定义顺序存储的结构类型需要一个一个地按顺序访问元素,当这个总量很大且我们所要访问的元素比较靠后时,性能就会很低。散列表是一种空间换时间的存储结构,是在算法中提升效率的一种比较常用的方式,但是所需空间太大也会让人头疼,所以通常需要在二者之间权衡。散列表可以 根据给定的关键字来计算出关键字在表中的地址二、哈希函数的种类(1)直接寻址法取关键字或关键字的某个线性函数值为散列地址。即 H(k...原创 2019-07-07 18:05:50 · 1082 阅读 · 0 评论 -
排序 —— 直接插入排序
算法思想将一个记录插入到已排序好的有序表中(同时要巴原来位置上的元素向后顺移),从而得到一个新的记录数增1的有序表。算法过程算法性能分析(1)时间复杂度分析无论什么情况,外部循环始终逐一执行,外部循环次数为n考虑最坏的情况,即整个序列都是逆序的,则内层循环需要逐一执行,内部循环次数为(n-1)/2,故总循环次数为 n(n-1)/2,其算法复杂度是 O(n^2)考虑最好的...原创 2019-06-26 16:15:47 · 3814 阅读 · 0 评论 -
排序 —— 基数排序
一、算法思想基数排序的算法思想是“多关键字排序”,包括”最高位优先法“和”最低位优先法“两种方法最高位优先法(MSD):先对最高位关键字k1(如百位)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如十位)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列最低位优先法(L...原创 2019-07-01 21:20:53 · 1329 阅读 · 0 评论 -
排序 —— 败者树
一、引入及算法思想在多路归并的过程中,如果有K个顺串,每次有K个候选值,要找出其中的最小值,普通的做法需要进行K-1次比较,而使用 “败者树” ,则只需要O(logK)次比较,其原理就像我们平常的分组比赛,一个参赛者在小组出线之后,只需要与其他小组出线的参赛者比赛即可决出最后的冠军(最值),而不需要和其他所有参赛者都比一遍。败者树中含有两种不同类型的结点叶子结点:其值为当前参与归并的归并段...原创 2019-07-02 23:20:27 · 696 阅读 · 0 评论 -
排序 —— 外部排序
一、算法思想若待排序记录一部分在内存,一部分在外存,则称为外部排序。外部排序可以概括成一句话:将内存作为工作空间来辅助外存数据的排序。外部排序的对象称为 “记录”“页”先规定一些下文会用到的符号的含义n:记录总数m:记录段总数p:记录段的分组组数k:每个分组包含的记录段数量l:每个记录段包含的记录数量(1)生成初始归并段把含有 n 个记录的文件传入内存,按照给定的 内排序算法...原创 2019-07-02 23:38:26 · 1209 阅读 · 0 评论 -
查找 —— B-树和B+树
一、定义B-树是一种特殊的平衡m叉排序树,要求所有叶节点在同一层。B-树中所有结点孩子结点个数的最大值称为 B-树 的阶,通常用 m 表示,从查找效率考虑,要求 m>=3一颗 m 阶的 B- 树,或为空树,或为满足下列特性的m叉树:树中每个结点至多有m棵子树;如果根结点不是叶子结点,则至少有 2 棵子树,对应 1 个关键字;除了根之外的所有非终端结点至少有 ⌈m/2⌉ 棵子树,对...原创 2019-07-05 23:43:39 · 529 阅读 · 0 评论 -
排序 —— 归并排序
一、算法思想归并排序可以看作一个分而治之的过程:先将整个序列分为两半,对每一半分别进行归并排序,将得到两个有序序列,然后将这两个序列归并成一个序列即可二、算法过程三、实现...原创 2019-07-01 13:48:22 · 321 阅读 · 0 评论 -
排序 —— 堆排序
一、算法介绍堆:堆是一种数据结构,可以把堆看成是一棵完全二叉树,这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小,则这样的堆称为大顶堆;若父亲小孩子大,则这样的堆称为小顶堆。堆化:将当前结点(假设为a)的值与其孩子结点进行比较,如果存在大于 a 值的孩子结点,则从中选出最大的一个与a交换,当 a 来到下一层的时候重复上述过程,直到 a 的孩子结点...原创 2019-06-30 13:25:48 · 624 阅读 · 0 评论 -
排序 —— 简单选择排序
一、算法思想选择表L的最大(小)元素,与最后位置上元素交换。其步骤如下:对于表 L=(a1,az,a3,.…,ai.…,an),顺序遍历,选择出最大元素所在位置,与最后位置元素交换;对于除最后一个元素之外的剩余部分构成的子表重复(1),直到剩余部分构成的子表表长等于1为止。二、算法过程...原创 2019-06-29 18:07:45 · 448 阅读 · 0 评论 -
排序 —— 快速排序
一、算法思想从待排序列中任取一个元素(例如取第一个)作为枢轴,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。二、算法过程以第1趟快速排序为例,详解过程:(1)首先,选择256作为枢轴,i=0,j=length-1,分别指向头、尾关键字(2)将 j 从右向左开始扫描,...原创 2019-06-28 10:59:11 · 827 阅读 · 0 评论 -
排序 —— 冒泡排序
一、算法思想每趟不断将记录两两比较,并按“前小后大”(或“前大后小”)规则交换。二、算法过程三、实现void BubbleSort(int R[],int n){ int i,j; int temp; for(i=0;i<n;i++) { for(j=0;j<n-1-i;j++) { if(R[j]>R[j+1]) { temp...原创 2019-06-28 00:11:55 · 360 阅读 · 0 评论 -
排序 —— 希尔排序
一、算法思想先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。技巧: 子序列的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依次取5,3,1),直到dk=1为止。二、算法过程三、算法性能分析(1)时间复杂度分析最坏时间复杂度为O(n^2)最好时间复杂...原创 2019-06-27 23:25:44 · 557 阅读 · 0 评论 -
排序 —— 折半插入排序
一、算法思想在已形成的有序表中折半查找,并在适当位置插入,把原来位置上的元素向后顺移。二、算法过程其中,红色部分是已形成的有序表,黑色部分是待排序元素三、实现void insertSort(int R[],int n) //待排关键字存储在R[]中,个数为n{ int i,j; int temp; int mid; int low; int high; for(i=1...原创 2019-06-27 23:01:19 · 1431 阅读 · 1 评论 -
最小生成树(无向图) —— PRIM 算法和 KRUSKAL 算法
PRIM 算法PRIM 算法的实质是 动态规划。首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V,以此类推。KRUSKAL 算法...原创 2019-06-24 20:59:16 · 3898 阅读 · 0 评论 -
查找 —— 静态查找法(顺序查找法、折半查找法、分块查找法)
一、顺序查找法算法思想:依次与每个关键字逐个比较,如果与给定值相等,则查找成功,返回成功值;如果与所有关键字都不相等,则查找失败,返回失败值。其平均查找长度是(n+1)/2实现:int Search(int R[],int n,int k) // 在长度为n的R[]中查找数值为k的元素{ int i; for(i=0;i<n;i++) { if(a[i]==k) r...原创 2019-06-27 11:56:26 · 1192 阅读 · 0 评论 -
排序 —— 排序的基本概念
什么是排序?将一组杂乱无章的数据按一定的规律顺次排列起来。排序的目的是便于查找。排序算法的好坏如何衡量?时间效率: 排序速度(即排序所花费的全部比较次数)空间效率: 占内存辅助空间的大小稳定性: 若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称此排序算法是稳定的。内部排序和外部排序内部排序: 若待排序记录都在内存中,称为内部排序。内部排序基本操作有两种:...转载 2019-06-26 15:26:11 · 1385 阅读 · 0 评论 -
图 —— AOE网和关键路径
基本概念AOE网(Activity On Edge): 是一个带权的有向无环图,其中以顶点表示事件,弧表示活动,权表示活动持续的时间。AOV和AOE的不同点: AOV的顶点表示活动,AOE的顶点表示事件(新活动开始、旧活动结束);AOV的边表示活动之间的先后关系,AOE的边表示活动。关键路径: 路径长度最长的路径算法过程步骤一:顶点(事件)的最早发生时间对图进行拓扑排序,得到各顶点...原创 2019-06-25 13:40:40 · 4798 阅读 · 0 评论 -
数据结构—— 特殊矩阵
对称矩阵在一个n阶方阵A中,若元素满足下述性质:ai,j=aj,ia_{i,j}=a_{j,i}ai,j=aj,i则称A为对称矩阵。(1)只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间,这样,能节约近一半的存储空间(2)元素的个数为:n(n+1)/2n(n+1)/2n(n+1)/2三角矩阵上三角矩阵矩阵下三角部分(不包括对角线)元素全为c(c可以...原创 2019-05-22 00:10:55 · 3963 阅读 · 0 评论 -
数据结构 —— 数组
一维数组(a0,a1,....,an−1)(a_0,a_1,....,a_{n-1})(a0,a1,....,an−1)如果a0a_0a0 存放在内存 100100100 的位置,则 aia_iai 存放在 100+i100+i100+i 的位置二维数组[(a0,0,a0,1,....,a0,n−1),...,(an−1,0,an−1,1,....,an−1,n−1)][(a_...转载 2019-05-21 23:58:00 · 190 阅读 · 0 评论 -
数据结构 —— 广义表
什么是广义表广义表是一种非线性的数据结构,它的表元素可以是原子或者广义表的一种线性表的扩展结构。广义表的长度:为表中最上层元素的个数广义表的深度:为表中括号的最大层数表头和表尾:当广义表非空时,第一个元素为广义表的表头,其余元素组成的表是广义表的表尾广义表的常用表示① E=()E是一个空表,其长度为0,其深度为1② L=(a,b)L是长度为2的广义表,它的两个元素都是原子,...原创 2019-05-21 23:55:52 · 11542 阅读 · 0 评论 -
数据结构 —— 队列的定义、存储结构和基本操作
什么是队列队列是一种操作受限的线性表,队列只允许在表的一端进行插入,在表的另一端进行删除。可进行插入的一段称为队尾,可进行删除的一端称为队头。队列的主要特点就是先进先出。依照存储结构可分为:顺序队和链式队。顺序队列其中,循环队列必须损失一个存储空间(如上图中下标为0的空间),如果控件0也存入元素,则队满和队空的条件都是q.front==q.rear,此时便无法区分队空和队满了。...原创 2019-05-12 00:14:30 · 2752 阅读 · 0 评论 -
数据结构 —— 栈的定义、存储结构和基本操作
什么是栈栈是一种只能在一段进行插入或删除操作的线性表。栈顶:允许进行插入或删除操作的一端,由一个栈顶指针来指示。栈底:相对于栈顶的另一端,是固定不变的。栈的主要特点就是先进后出。依照存储结构可分为:顺序栈和链式栈顺序栈栈空状态:s.top==-1栈满状态:s.top=maxSize-1非法状态(上溢和下溢):栈满就是一种继续入栈就会上溢的状态,对应的栈下溢就是栈空的时候继...原创 2019-05-09 21:47:53 · 4403 阅读 · 0 评论 -
线性表 —— 顺序表
定义线性表是具有相同特征数据元素的一个有限序列。该序列中所含元素的个数叫作线性表的长度,用 n 表示,当 n = 0 时,表示线性表是一个空表。线性表可以是有序的,也可以是无序的线性表的存储结构有顺序存储结构和链式存储结构两种。前者称为顺序表,后者称为链表。顺序表就是把线性表中的所有元素按照其逻辑顺序,依次存储到从指定的存储位置开始的一块连续的存储空间中。在链表存储中,每个结点不仅包...原创 2019-05-09 20:38:46 · 2006 阅读 · 0 评论 -
数据结构 —— 基本概念
数据结构的基本概念数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。包括逻辑结构、存储结构和对数据的运算。一、逻辑结构线性结构:是一个数据元素的有序集合,存在“一对一”的线性关系非线性结构:存在“一对多”的线性关系,如树或图二、存储结构顺序存储结构:把逻辑上相邻的结点存储在物理位置上相邻的存储单元中链式存储结构:结点间的逻辑关系是由附加的指针字段来表示索引存储结构:...原创 2019-05-14 09:11:27 · 352 阅读 · 0 评论 -
数据结构 —— 串的定义、存储结构和基本操作
串的定义串是由零个或多个字符组成的有限序列。串中字符的个数称为串的长度,含有零个元素的串叫空串串中任意连续的字符组成的子序列称为该串的字串,包含字串的串称为主串,某个字符在串中的序号称为这个字符的位置串是限定了元素为字符的线性表串的存储结构定长顺序存储:// 定长顺序存储typedef struct { char str[maxSize+1]; //串的最大长度为maxSi...原创 2019-05-14 00:16:00 · 8274 阅读 · 3 评论 -
数据结构 —— ADT(抽象数据类型)
什么是ADTADT可以看作一些数据对象以及附加在这些数据对象上的操作的集合ADT重在对功能的描述而不关心具体实现对于栈来说,数据对象集为存储在栈内的数据元素,操作集为元素进栈,元素出栈,判断栈是否为空的操作对于队列来说,数据对象集为存储在队列内的数据元素,操作集为元素进队,元素出队,判断队是否为空的操作ADT的表示(以线性表为例)三元组表示(D,S,P),其中D是数据对象,S是D...原创 2019-05-13 20:20:17 · 4855 阅读 · 0 评论 -
树 —— 寻找二叉排序树的前驱后继(中序遍历)
一,基本概念前驱结点:节点val值小于该节点val值并且值最大的节点 后继节点:节点val值大于该节点val值并且值最小的节点二,寻找途径前驱结点(a)若一个结点有左子树,那么该结点的前驱节点是其左子树中val值最大的结点(即左子树中最右边的结点)(b)若一个结点没有左子树1、若该结点是其父结点的右孩子,那么该结点的前驱结点即为其父结点。原创 2017-10-07 23:31:07 · 6019 阅读 · 0 评论 -
数据结构 —— 改进的KMP算法
KMP算法如果我们要对下面的主串P和模式串P进行匹配步骤一:i=3,j=3模式串 “abab” 对应的 next 数组为-1 0 0 1(0 0 1 2整体右移一位,初值赋为-1),当模式串 P 和主串 S 进行匹配时,发现b跟c失配,于是模式串 P 右移 j - next[ j ] = 3 - 1 =2位。步骤二:i=3,j=1右移2位后,b又跟c失配。事实上,因为在上一步的匹配中,...原创 2019-05-16 20:29:06 · 6044 阅读 · 2 评论 -
数据结构 —— KMP算法
简单匹配算法如果我们要对下面的主串P和模式串P进行匹配步骤一:i=10,j=6匹配失败,i 回到上一次匹配的起始位置的下一位,j=0步骤二:i=5,j=0由此可见,简单匹配算法存在两个问题i 发生了回溯(从 i=10 跳到了 i=5 )没有利用到前面已匹配到的信息(ABCDAB),增加了计算量因此,我们提出了KMP算法KMP 算法步骤一:当 i=10,j=6 时已匹...原创 2019-05-16 20:16:13 · 1098 阅读 · 0 评论 -
树 —— 二叉树的定义、存储结构和性质
二叉树的定义我们把满足以下两个条件的树型结构叫做二叉树(Binary Tree):每个结点的度都不大于2;每个结点的孩子结点次序不能任意颠倒。五种基本形态:两种特殊的二叉树满二叉树: 在一棵二叉树中,如果所有的分支结点都有左孩子和右孩子的结点,并且叶子结点都集中在二叉树的最下一层,则这样的二叉树称为满二叉树。完全二叉树: 如果对一棵深度为k、有n个结点的二叉树进行编号后,各结点...原创 2019-05-22 08:46:41 · 736 阅读 · 0 评论 -
图 —— AOV网和拓扑排序
AOV网(Activity On Vertex network): 以顶点表示活动,弧表示活动之间的优先关系的DAG图。拓扑排序: 是有向图的全部顶点的一个线性序列,该序列保持了原有向图中各顶点间的相对次序。拓扑排序算法思想: 对一个有向无环图,重复下列操作,直到所有顶点输出完。在有向图中选一个没有前驱的顶点输出(选择入度为0的顶点);从图中删除该顶点和所有以它为尾的弧(修改其它顶点入度...转载 2019-06-25 10:33:26 · 785 阅读 · 0 评论