
数据结构学习
文章平均质量分 77
kong_xz
这个作者很懒,什么都没留下…
展开
-
数据结构题目和知识点
查找:1.有序表折半查找成功/不成功时最多的比较次数: log2(n+1)2.判定树外部结点是:一次失败查找过程终止的结点3.分开查找线性表m个元素时,每块分为根号m个结点4.具有n层结点的AVL树至少有()个结点:N0=0;N1=1;N2=2;Nn=N(n-1)+N(n-2)+15.对于二叉排序树进行()可以得到从小到达的结点序列:中序遍历6.衡量查找算法好坏的主要标准是:关键字的平均比较...原创 2018-04-02 10:49:40 · 2322 阅读 · 0 评论 -
队列的应用
一、采用队列求解迷宫问题使用一个队列qu记录走过的方块,该队列的结构如下: typedef struct { int i,j; //方块的位置 int pre; //本路径中上一方块在队列中的下标} Box; //方块类型typedef struct{ Box data[MaxSize]; int front,rear; //队头指针和队尾指针}...原创 2018-03-04 18:15:35 · 499 阅读 · 0 评论 -
队列
一、 队列的定义 队列简称队,它也是一种运算受限的线性表,其限制仅允许在表的一端进行插入,而在表的另一端进行删除。把进行插入的一端称做队尾(rear),进行删除的一端称做队首或队头(front)。向队列中插入新元素称为进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其后继元素就成为队首元素。 由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按...原创 2018-03-04 18:07:52 · 966 阅读 · 0 评论 -
栈的应用
一、表达式求值表达式求值问题是:用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。为了方便,假设该表达式都是合法的数学表达式,例如,exp="1+2*(4+12)";在设计相关算法中用到栈,这里采用顺序栈存储结构。 例如: Exp = a*b + (c - d / e) *f前缀式: + * a b * - c / d e f中缀式: ...原创 2018-03-04 17:53:45 · 437 阅读 · 0 评论 -
哈夫曼树
一、 哈夫曼树的定义 设二叉树具有n个带权值的叶子节点,那么从根节点到各个叶子节点的路径长度与相应节点权值的乘积的和,叫做二叉树的带权路径长度。其中n表示叶子节点的数目,wi表示叶子节点ki的权值,li表示根到ki之间的路径长度(即从叶子节点到达根节点的分支数)。具有最小带权路径长度的二叉树称为哈夫曼树,也是最优树,由哈夫曼于1951提出。 二、 构造哈夫曼树 根据哈夫曼树的定义,一棵二叉树要...原创 2018-03-11 12:34:13 · 815 阅读 · 0 评论 -
线索二叉树
一、线索二叉树1.线索二叉树的概念 对于具有n个节点的二叉树,采用二叉链存储结构时,每个节点有两个指针域,总共有2n个指针域,又由于只有n-1个节点被有效指针所指向(n个节点中只有树根节点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域。遍历二叉树的结果是一个节点的线性序列。可以利用这些空链域存放指向节点的前驱和后继节点的指针。这样的指向该线性序列中的“前驱”和“后继”的指针,称作...原创 2018-03-11 12:23:02 · 371 阅读 · 0 评论 -
栈
一、栈的定义 栈是一种只能在一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,栈顶的当前位置由一个称为栈顶指针的位置指示器指示。当栈中没有数据元素时,称为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。栈的主要特点是“后进先出”,即后进栈的元素先出栈。栈也称为后进先出表。栈的几种基本运算如下: Init...原创 2018-03-03 16:54:46 · 546 阅读 · 0 评论 -
有序表
一、有序表的定义所谓有序表,是指这样的线性表,其中所有元素以递增或递减方式有序排列。为了简单,假设有序表元素是以递增方式排列。从中看到,有序表和线性表中元素之间的逻辑关系相同,其区别是运算实现的不同。若以顺序表、单链表存储有序表,会发现基本运算算法中只有ListInsert()算法与前面对应的运算有所差异,其余都是相同的。有序顺序表的ListInsert()算法如下:void ListInsert...原创 2018-03-03 10:25:05 · 19511 阅读 · 0 评论 -
二叉树的构造
一、二叉树的构造 同一棵二叉树具有唯一先序序列、中序序列和后序序列。但不同的二叉树可能具有相同的先序序列、中序序列和后序序列。给定先序、中序和后序遍历序列可以唯一确定这棵二叉树的树形。仅由一个先序序列(或中序序列、后序序列),无法确定这棵二叉树的树形。定理1:任何n(n≥0)个不同节点的二又树,都可由它的中序序列和先序序列唯一地确定。由上述定理得到以下构造二叉树的算法:BTNode *Create...原创 2018-03-10 14:45:42 · 582 阅读 · 0 评论 -
图
一、图的基本概念1. 图的定义 图(Graph)G由两个集合V(vertex)和E(Edge)组成,记为G=(V,E)。其中V是顶点的有限集合,记为V(G),E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G)。 说明:对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0-n-1。通过编号唯一确定一个顶点。在图G中,如果代表边的顶点对是无序的,则称G为无向图,无向图中代表边的...原创 2018-03-12 14:12:24 · 2964 阅读 · 0 评论 -
图的存储结构
一、邻接矩阵存储方法邻接矩阵是表示顶点之间相邻关系的矩阵。设G=(V,E)是具有n(n>0)个顶点的图,顶点的顺序依次为0~n-1,则G的邻接矩阵A是n阶方阵,其定义如下:(1)如果G是无向图,则: A[i][j]=1:若(i,j)∈E(G) 0:其他(2)如果G是有向图,则: A[i][j]=1:若<i,j>∈E(G) 0:其他(3)如果G是带权无向图,则:...原创 2018-03-12 14:26:15 · 9421 阅读 · 2 评论 -
图的遍历
一、 图的遍历的概念从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。如果给定图是连通的无向图或者是强连通的有向图,则遍历过程一次就能完成,并可按访问的先后顺序得到由该图所有顶点组成的一个序列。根据搜索方法的不同,图的遍历方法有两种:一种叫做深度优先搜索法(DFS);另一种叫做广度优先搜索法(BFS)。 二、 深...原创 2018-03-12 14:50:33 · 612 阅读 · 0 评论 -
线性表的查找
一、查找的基本概念被查找的对象是由一组记录组成的表或文件,而每个记录则由若干个数据项组成,并假设每个记录都有一个能唯一标识该记录的关键字。在这种条件下,查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。 若在查找的同时对表做修改运算(如插入和删除),则相应的表称之为动态查找表,否则称之...原创 2018-03-14 12:25:48 · 12315 阅读 · 0 评论 -
递归
一、递归的定义在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。 例如,以下是求n!(n为正整数)的递归函数。 int fun(int n) { if (n==1) //语句1 ...原创 2018-03-06 17:27:17 · 530 阅读 · 0 评论 -
拓扑排序
一、拓扑排序设G=(V,E)是一个具有n个顶点的有向图,V中顶点序列v1,v2,…,vn称为一个拓扑序列当且仅当该顶点序列满足下列条件:若<i,j>是图中的边(即从顶点i到j有一条路径),则在拓扑序列中顶点i必须排在顶点j之前。在一个有向图中找一个拓扑序列的过程称为拓扑排序。 例如,计算机专业的学生必须完成一系列规定的基础课和专业课才能毕业,假设这些课程的名称与相应代号有...原创 2018-03-13 19:21:11 · 583 阅读 · 0 评论 -
最短路径
一、路径的概念在一个无权图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。对于带权图,考虑路径上各边上的权值,则通常把一条路径上所经边的权值之和定义...原创 2018-03-13 15:44:45 · 452 阅读 · 0 评论 -
串的模式匹配
设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子串。通常把主串s称为目标串,把子串t称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串t;不成功则指目标串s中不存在模式串t。 一、Brute-Force算法(即简单匹配算法)从目标串s=“s0s1…sn-1”的第一个字符开始和模式串t=“t0t1…tm-1”中的第一个字符比较,若相等,则继续逐个比...原创 2018-03-06 11:40:41 · 3575 阅读 · 0 评论 -
链串
链串的组织形式与一般的链表类似。主要的区别在于,链串中的一个节点可以存储多个字符。通常将链串中每个节点所存储的字符个数称为节点大小。链串节点大小的选择与顺序串的格式选择类似。节点大小越大,则存储密度越大。但存储密度越大,一些操作(如插入、删除、替换等)有所不便,且可能引起大量字符移动,因此它适合于在串基本保持静态使用方式时采用。节点大小越小(如节点大小为1时),运算处理越方便,但存储密度下降。为简...原创 2018-03-06 11:26:33 · 2942 阅读 · 0 评论 -
生成树和最小生成树
一、生成树的概念 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有构成一棵树的(n-1)条边。如果在一棵生成树上添加一条边,必定构成一个环。一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边,如果一个图有n个顶点和小于(n-1)条边,则是非连通图。如果它多于(n-1)条边,则一定有回路。但是,有(n-1)条边的图不一定都是生成树。最小生成树:图的所有生成树中具有边上的权值...原创 2018-03-13 15:29:22 · 8027 阅读 · 0 评论 -
串的基本概念和顺序串
一、 串的基本概念串(或字符串),是由零个或多个字符组成的有穷序列。含零个字符的串称为空串,用Ф表示。串中所含字符的个数称为该串的长度(或串长)。通常将一个串表示成“a1a2…an”的形式。其中最外边的双引号本身不是串的内容,它们是串的标志,以便将串与标识符(如变量名等)加以区别。每个ai(1≤i≤n)代表一个字符。当且仅当两个串的长度相等并且各个对应位置上的字符都相同时,这两个串才是相等的。一个...原创 2018-03-05 19:01:21 · 6477 阅读 · 0 评论 -
二叉树的遍历
一、二叉树的遍历二叉树遍历的概念: 二叉树的遍历是指按照一定次序访问树中所有节点,并且每个节点仅被访问一次的过程。它是最基本的运算,是二叉树中所有其他运算的基础。1. 先序遍历过程先序遍历二叉树的过程是:① 访问根节点;②先序遍历左子树;③先序遍历右子树。2. 中序遍历过程中序遍历二叉树的过程是:① 中序遍历左子树;② 访问根节点;③中序遍历右子树。3. 后序遍历过程后序遍历二叉树的过程是:...原创 2018-03-10 14:40:42 · 385 阅读 · 0 评论 -
二叉树的存储结构和实现
一、二叉树存储结构 1)二叉树的顺序存储结构 二叉树的顺序存储结构中节点的存放次序是:对该树中每个节点进行编号,其编号从小到大的顺序就是节点存放在连续存储单元的先后次序。 若把二叉树存储到一维数组中,则该编号就是下标值加1(注意C/C++语言中数组的起始下标为0)。树中各节点的编号与等高度的完全二叉树中对应位置上节点的编号相同。 定义为:typedef ElemType SqBTree[MaxS...原创 2018-03-10 14:20:00 · 22228 阅读 · 0 评论 -
数据的逻辑结构类型、存储结构类型、抽象数据类型
一、逻辑结构类型集合:数据元素间仅同属一个集合,无其他关系。线性结构:1:1关系,开始和终端节点都是唯一的,除了开始节点和终端节点以外,其余节点都有且仅有一个前驱节点,有且仅有一个后继节点。树形结构:1:n关系,开始节点唯一,终端节点不唯一。除终端节点以外,每个节点有一个或多个后续节点;除开始节点外,每个节点有且仅有一个前驱节点。图形结构:n:n关系,没有开始节点和终端节点,所有节点都可能有多个前...原创 2018-03-01 11:32:02 · 4964 阅读 · 0 评论 -
逻辑结构表示方法
为了更确切地描述一种数据结构,通常采用二元组表示如, B=(D,R) 其中,B是一种数据结构,它由数据元素的集合D(data)和D上二元关系的集合R(relation)所组成。 D={di| 1≤i≤n,n≥0},R={rj | 1≤j≤m,m≥0},di表示集合D中的第i个节点或数据元素。n为D中节点的个数,特别地,若n=0,则D是一个空集,因而B也就无结构可言,有时也可以认为它具有任一结构。r...原创 2018-03-01 11:00:53 · 3207 阅读 · 0 评论 -
数据结构的定义
数据:描述客观事物的数和字符的集合。是所有能被输入到计算机中,且能被计算机处理的符号的集合。它是计算机操作的对象的总称,也是计算机处理的信息的某种特定的符号表示形式。数据对象:是具有相同性质的若干个数据元素的集合。数据元素:数据的基本单位,由数据项组成。数据项:最小数据单位。数据>数据对象>数据元素>数据项数据结构:是指数据以及数据元素相互之间的联系。可以看作是相互之间存在着某种...原创 2018-03-01 10:43:13 · 1571 阅读 · 0 评论 -
哈希表查找
一、哈希表的基本概念哈希表(Hash Table)又称散列表,是除顺序表存储结构、链接表存储结构和索引表存储结构之外的又一种存储线性表的存储结构。哈希表存储的基本思路是:设要存储的对象个数为n,设置一个长度为m(m≥n)的连续内存单元。以线性表中每个对象的关键字ki(0≤i≤n-1)为自变量,通过一个称为哈希函数的函数h(ki),把ki映射为内存单元的地址(或称下标)h(ki),并把该对象存储在这...原创 2018-03-15 11:16:01 · 11764 阅读 · 2 评论 -
广义表
一、广义表的定义广义表简称表,它是线性表的推广。一个广义表是n(n≥0)个元素的一个序列,若n=0时则称为空表。设ai为广义表的第i个元素,则广义表GL的一般表示与线性表相同: GL=(a1,a2,…,ai,…,an)其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。如果ai是单个数据元素,则ai是广义表GL的原子;如果ai是一个广义表,则ai是广义表GL的子表。 广...原创 2018-03-08 15:51:08 · 41162 阅读 · 2 评论 -
树表的查找
顺序查找、二分(折半)查找和索引查找都是静态查找表,其中二分查找的效率最高。静态查找表的缺点是当表的插入或删除操作频繁时,为维护表的有序性,需要移动表中很多记录。这种由移动记录引起的额外时间开销,就会抵消二分查找的优点(二分查找和分块查找只适用于静态查找表)。若要对动态查找表进行高效率的查找,可以使用树表。以二叉树或树作为表的组织形式,称为树表。一、二叉排序树 二叉排序树(简称BST)又称二叉查找...原创 2018-03-14 19:25:16 · 5135 阅读 · 0 评论 -
稀疏矩阵
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t 十分小时,即s<<t时,称该矩阵为稀疏矩阵。例如一100×100的矩阵,若其中只有100个非零元素,就可称其为稀疏矩阵。一、 稀疏矩阵的三元组表示(顺序)稀疏矩阵的压缩存储方法是只存储非零元素。由于稀疏矩阵中非零元素的分布没有任何规律,所以在存储非零元素时还必须同时存储该非零元素所对应的行下标和列下标。稀疏矩阵中的每一个非零...原创 2018-03-07 14:53:42 · 2183 阅读 · 0 评论 -
特殊矩阵的压缩存储
特殊矩阵的主要形式有:(1)对称矩阵(2)上三角矩阵/下三角矩阵(3)对角矩阵它们都是方阵,即行数和列数相同。一、对称矩阵的压缩存储 若一个n阶方阵A[n][n]中的元素满足a i,j=a j,i(0≤i,j≤n-1),则称其为n阶对称矩阵。由于对称矩阵中的元素关于主对角线对称,因此在存储时可只存储对称矩阵中上三角或下三角中的元素,使得对称的元素共享一个存储空间。这样,就可以将n2个元素压...原创 2018-03-07 14:35:55 · 15456 阅读 · 0 评论 -
算法及其描述
一、算法数据元素之间的关系有逻辑关系和物理关系,对应的操作有逻辑结构上的操作功能和具体存储结构上的操作实现。 通常把具体存储结构上的操作实现步骤或过程称为算法。算法有五个重要的特性1)有穷性 2)确定性 3)可行性 4)有输入 5)有输出算法设计应满足以下几条目标: 1)正确性 2)可使用性 3)可读性 4)健壮性 5)高效率和低存储量需求二、 算法时间复杂度分析通常有两种衡量算法效率的方法:事后...原创 2018-03-01 16:48:00 · 12240 阅读 · 0 评论 -
插入排序、交换排序
一、排序的基本概念 所谓排序,是要整理表中的记录,使之按关键字递增(或递减)有序排列。其确切定义如下:输入:n个记录,R0,R1,…,Rn-1,其相应的关键字分别为k0,k1,…,kn-1。输出:Ri,0,Ri,1,…,Ri,n-1,使得ki,0≤ki,1≤…≤ki,n-1 (或ki,0≥ki,1≥…≥ki,n-1)。算法的稳定性当待排序记录的关键字均不相同时,排序的结果是惟一的,否则排序的结果不...原创 2018-03-15 17:21:49 · 1455 阅读 · 0 评论 -
树
一、 树的定义形式定义:树:T={D,R}。D是包含n个节点的有穷集合(n≥0)。当n=0时为空树,否则关系R满足以下条件: 有且仅有一个节点d0∈D,它对于关系R来说没有前驱节点,节点d0称作树的根节点。除节点d0外,D中的每个节点对于关系R来说都有且仅有一个前驱节点。D中每个节点对于关系R来说可以有零个或多个后继节点。递归定义:树是由n(n≥0)个节点组成的有限集合(记为T)。其中...原创 2018-03-09 14:03:58 · 3243 阅读 · 1 评论 -
双链表 、循环链表
一、双链表 对于双链表,采用类似于单链表的类型定义,其DLinkList类型的定义如下: typedef struct DNode //声明双链表节点类型 { ElemType data; struct DNode *prior; //指向前驱节点 struct DNode *next; //指向后继节点 } DLinkList;1....原创 2018-03-02 15:31:00 · 486 阅读 · 0 评论 -
线性表的链式存储
一、线性表的链式存储—链表在链式存储中,每个存储节点不仅包含有所存元素本身的信息(称之为数据域),而且包含有元素之间逻辑关系的信息,即前驱节点包含有后继节点的地址信息,这称为指针域,这样可以通过前驱节点的指针域方便地找到后继节点的位置,提高数据查找速度。 若一个节点中的某个指针域不需要任何节点,则仅它的值为空,用常量NULL表示。在线性表的链式存储中,为了便于插入和删除运算的实现,每个链表带有一个...原创 2018-03-02 14:48:45 · 1245 阅读 · 0 评论 -
基数排序
前面所讨论的排序算法均是基于关键字之间的比较来实现的,而基数排序是通过“分配”和“收集”过程来实现排序。基数排序是一种借助于多关键字排序的思想对单关键字排序的方法。一般地,记录R[i]的关键字R[i].key是由d位数字组成,即kd-1,kd-2,…k0,每一个数字表示关键字的一位。其中kd-1为最高位,k0是最低位,每一位的值都在0≤ki<r范围内,其中r称为基数。基数排序有两种:最低位优先(L...原创 2018-03-16 10:51:07 · 1827 阅读 · 0 评论 -
归并排序
归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表。Merge()实现了一次归并 :void Merge(RecType R[],int low,int mid,int high) { RecType *R1; int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下...原创 2018-03-16 10:45:36 · 454 阅读 · 0 评论 -
选择排序
选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子表的最后,直到全部记录排序完毕。两种选择排序方法:(1)简单选择排序(或称直接选择排序)(2)堆排序一、直接选择排序基本思想:第i趟排序开始时,当前有序区和无序区分别为R[0..i-1]和R[i..n-1](0≤i<n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]...原创 2018-03-16 10:39:46 · 1248 阅读 · 0 评论 -
顺序存储结构
一、线性表的顺序存储结构-顺序表顺序表:把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。 这样,线性表中第一个元素的存储位置就是指定的存储位置,第i+1个元素(1≤i≤n-1)的存储位置紧接在第i个元素的存储位置的后面。假定线性表的元素类型为ElemType,则每个元素所占用存储空间大小(即字节数)为sizeof(ElemType),整个线性表所...原创 2018-03-02 11:23:41 · 1670 阅读 · 0 评论 -
线性表的基本概念
一、 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列。 该序列中所含元素的个数叫做线性表的长度,用n表示,n≥0。 当n=0时,表示线性表是一个空表,即表中不包含任何元素。设序列中第i(i表示逻辑位序)个元素为ai(1≤i≤n),线性表的一般表示为: (a1,a2,…ai,ai+1,…,an)其中a1为第一个元素,又称做表头元素,a2为第二个元素,an为最后一个元素,又称做表尾元素。 ...原创 2018-03-02 10:57:27 · 998 阅读 · 0 评论