努力学习数据结构
文章平均质量分 68
程子的小段
关注一下我的B站账号吧:https://space.bilibili.com/481428639?spm_id_from=333.1007.0.0
展开
-
排序算法之归并排序与基数排序
基于归并的思想,归并即将两个或两个以上的有序表组合成一个新的有序表。归并排序:用归并的方法进行排序。建设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1。两两归并,得到 n/2 个长度为2或1的有序子序列。再两两归并,如此重复,直至得到一个长度为n的有序序列为止。将两个有序子序列r1[low…mid] r1[mid+1…high]归并为一个有序序列,存入r2[low…high]将r1[]前半段排序放入r2[]的前半段将r1[]后半段排序放入r2[]的后半段归并r2原创 2022-06-24 07:17:38 · 244 阅读 · 0 评论 -
选择类排序法
每趟选择一个关键字最小的记录作为当前要确定的记录。第一趟:选择一个关键字最小的记录,并和第一个记录交换。第二趟:在剩余的序列中,选择一个关键字最小的记录,并和第二个记录交换。重复共n-1趟即可完成排序。第i趟,确定第i个记录k为最值的下标j为搜索的下标最好情况:有序,比较次数n(n-1)/2,移动次数0,时间复杂度为O(n2)。最坏情况:第一个记录关键字最大,其余记录有序,比较次数n(n-1)/2,移动次数3(n-1),时间复杂度为O(n2)。空间复杂度:O(1)。稳原创 2022-06-23 09:19:18 · 667 阅读 · 0 评论 -
交换类排序法
通过相邻记录进行交换,逐步将待排序序列变成有序序列的过程。第1趟:从第1个记录开始,扫描待排序记录序列,若相邻的两个记录逆序,则交换位置(消除一个逆序),最后第n个记录就是关键字最大的记录。第2趟:同上述方法,对前n-1个元素冒泡排序,最后第n-1个记录就是次关键字最大的记录。以此类推,直到第n-1趟完成后结束;或者在某一趟冒泡排序过程中没有发现一个逆序则可结束。最好情况:有序。比较次数n-1次,移动次数0次,时间复杂度为O(n)。最坏情况:逆序。比较次数n(n-1)/2次,移动次数3原创 2022-06-22 07:54:01 · 400 阅读 · 0 评论 -
插入类排序法
将第i个记录插入到前面i-1个已排好的记录子集中。具体:将第1个记录看做已排好的有序单元素子集,i从2到n循环进行直接插入。直接插入排序是最简单、最基本的插入排序法。算法分析最好情况:有序比较次数:n-1,移动次数:先指定一个增量,将待排序记录序列分割成若干“较稀疏”的子序列,对各子序列分别进行直接插入排序。逐步缩小增量并继续对形成的新子序列进行直接插入排序。最后一轮,取增量为1,即对全部记录进行一次直接插入排序。各子序列进行直接插入排序一般并不是先对一个子序列进行插入排序,再对另一个原创 2022-06-21 10:49:03 · 218 阅读 · 0 评论 -
排序的基本概念
是将一组具有相同数据类型的数据元素调整为按关键字从小到大或从大到小排列的过程。主关键字:得到的排序结果唯一。次关键字:排序结果不一定唯一。数据项组合:排序结果不一定唯一。例如:待排序序列:{48,62,35,77,55,14,35,98,22,40}排序结果序列:{14,22,35,35,40,48,55,62,77,98}{14,22,35,35,40,48,55,62,77,98}内部排序:整个排序过程完全在内存中进行。外部排序:待排序记录数据量太大,内存无法容纳全部数据,排序需要借原创 2022-06-20 10:24:40 · 371 阅读 · 0 评论 -
基于树的查找法 树表式查找法
(1) 定义:二叉排序树或者是一棵空树, 或者是具有如下性质的二叉树。① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值。② 若它的右子树非空, 则右子树上所有结点的值均大于根结点的值。③ 它的左右子树也分别为二叉排序树。二叉排序树的特性:中序遍历的结果为一个递增的有序序列。逆中序遍历的结果为一个递减的有序序列。(2) 存储结构描述二叉排序树的插入与创建(1) 二叉排序树的插入插入关键字key的算法思想:若二叉排序树是空树,则key成为二叉排序树的根。否则,则将key与二叉原创 2022-06-19 10:21:05 · 355 阅读 · 0 评论 -
基于线性表的查找法
用所给的关键字与线性表中的各记录的关键字逐个比较,直到成功或失败。列表的存储结构:顺序结构、链式结构设置监视哨的顺序查找法平均查找长度平均查找长度基本思想:每次将待查找的列表缩小为原来的一半。适用条件:顺序表 && 有序表。例如:待查元素的关键字为46折半查找判定树(二叉判定树)描述折半查找过程的二叉树。把当前查找区间的中间位置序号作为根结点,左子表和右子表递归处理为根结点的左子树和右子树,由此得到的二叉树。(1) 最坏情况查找成功时,最坏需要比较次数等于判定树的原创 2022-06-18 09:39:48 · 355 阅读 · 0 评论 -
查找的基本概念
即数据元素。例如:一个学生记录(元素){101,{“Emma”,89}}由同一类型的记录构成的集合。列表的实现:可以使用任意的数据结构去实现。例如:线性表、二叉树。关键字:记录的某个数据项的值,使用它在列表标识记录。主关键字:如果关键字能唯一的标识一个记录。次关键字:如果关键字不能唯一的标识一个记录。当记录只有一个数据项时,该数据项就是关键字。查找:根据给定关键字的值,在列表中确定有无一个记录的关键字与给定值相同。查找成功:找到相应的记录,并返回该记录在列表中的位置。查找失败:找不到相应的记原创 2022-06-17 09:13:31 · 86 阅读 · 0 评论 -
数据结构 图的应用
图是否连通的判断:是否仅调用一次搜索过程。图的连通分量:每次调用得到的顶点序列恰为各连通分量的顶点集。调用搜索过程的次数就是连通分量的个数。顶点u到顶点v的简单路径:路径中的顶点均不相同。[算法思想] 有无:从顶点u开始,进行深度(或广度)优先搜索,如果能搜索到顶点v,则表明从顶点u到顶点v有一条路径。是否是简单路径:由于在搜索过程中每个顶点只访问一次,所以这条路径必定是一条简单路径。记录:在搜索过程中,把搜索的线路记录下来,搜索到v退出即可得到简单路径。记录搜索线路:设置一个数组pre[n],当从某原创 2022-06-16 13:03:16 · 1367 阅读 · 0 评论 -
数据结构 图的遍历
1. 图的遍历从图中的某个顶点出发,按某方法多图中的所有结点访问且访问一次。2. 图的复杂性顶点关系任意、多对多的关系、连通图与非连通图、孤立结点、回路。3. 访问标识数组visited[n]为每一个顶点设置一个一个访问标识visited[i] ,初值设为0表示未访问,一旦访问则设为1表示已访问。4. 遍历方法:深度优先搜索、广度优先搜索深度优先搜索(DFS):类似树的先根遍历(1) 基本思想选择一个顶点作为起始点,首先访问该顶点。依次以该顶点的邻接点作为出发点,深度优先搜索邻接点。对于原创 2022-06-15 10:45:41 · 814 阅读 · 0 评论 -
图的存储结构
邻接矩阵:图的静态数组存储法邻接表:稀疏图的链式存储法十字链表:有向图的链式存储法邻接多重表:无向图的链式存储法邻接表表示法:数组表示法(静态)两个数组:顺序表、邻接矩阵顺序表:存储顶点信息的一维数组邻接矩阵:存储图中顶点之间关联关系的二维数组例1:邻接矩阵例2:邻接矩阵例3:邻接矩阵(1) 存储空间无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需为n(n+1)/2个存储空间。有向图邻接矩阵不一定对称;有n个顶点的有向图需为n²个存储空间。(2) 便于计算①原创 2022-06-14 12:42:59 · 508 阅读 · 0 评论 -
图的定义与基本术语
图(Graph)是一种网状数据结构,形式化定义如下:Graph=(V,R)V={x|x∈DataObject}R={VR}VR={ | p(x,y)∧(x,y∈V)}例1:V={A,B,C,D}R={,,,}例2:V={A,B,C,D,E}R={,,,,,,,,,,}={(A,B),(A,D),(B,C),(C,原创 2022-06-13 11:04:07 · 1005 阅读 · 0 评论 -
哈夫曼树及其应用
结点间的路径:从一个结点到另一个结点之间的分支序列。结点间的路径长度:从一个结点到另一个结点之间的所经过的分支数目。例如:B到F?路径:BE、EF 路径长度:2结点的权:给结点赋予的具有某种意义的实数,该实数称为结点的权。结点的带权路径长度:把从树根到某一结点的路径长度与该结点权的乘积,称为该结点的带权路径长度。例如:结点F的带权路径长度?7×3=21树的路径长度PL:树中从根到各个结点的路径长度之和。树的带权路径长度WPL :树中从根到叶子结点的各个带权路径长度之和。例如:PL=原创 2022-06-12 11:02:23 · 2003 阅读 · 0 评论 -
树、森林和二叉树的关系
(1) 结点存储结构:数据域、双亲域(2) 树的存储结构:顺序表(1) n个孩子链表每个结点的孩子构成一个单链表叶子结点的孩子链表为空结点组成:孩子位置域、下一个孩子指针域。(2) 顺序表n个结点组成。结点组成:数据域、孩子链表头指针域(1) 结点存储结构:第一个孩子指针域、数据域、下一个兄弟域(2) 树的存储结构:二叉链表树孩子兄弟链表结构与树的二叉树链表结构在物理结构上是完全相同的,只是逻辑含义不同而已。树与二叉树的对应关系加线:兄弟之间删线:与孩子之间(除老大孩子外)原创 2022-06-10 10:06:59 · 126 阅读 · 0 评论 -
二叉树遍历与线索化
遍历:按一定的规律对二叉树中的每个结点进行访问且仅访问一次。访问:输出结点信息、打印树、统计数目、各种计算等操作。目的:将非线性结构变成线性化的访问序列。DLRDRLLDRLRDRDLRLD规定先左后右的顺序的三种方案根据对根访问的先后命名遍历方案DLR 先序遍历LDR 中序遍历LRD 后序遍历(1) 先序遍历(DLR)操作过程若二叉树为空,则为空操作,否则依次执行如下三个操作:① 访问根结点;② 按先序遍历左子树;③ 按先序遍历右子树。先序遍历:ABDFGCEH原创 2022-06-09 11:48:53 · 1056 阅读 · 0 评论 -
数据结构之二叉树
二叉树结构简单,规律性强,适合计算机处理。任何树都可以转化为二叉树进行处理,不失一般性。每个结点的度不大于2。每个结点的孩子结点次序不能颠倒。Initiate(bt):初始化二叉树Create(bt):创建二叉树Destroy(bt):销毁二叉树Empty(bt):判断二叉树空Root(bt):求二叉树根Parent(bt):求双亲LeftChild(bt):求左孩子RightChild(bt):求右孩子Traverse(bt):遍历Clear(bt):清除性质1:在二叉树的第i层上至原创 2022-06-08 10:27:54 · 258 阅读 · 0 评论 -
树的定义与基本术语
树:是n(n≥0)个结点的有限集T。在任意一棵非空树中:① 有且仅有一个特定的结点,称为树的根(root),它没有直接前驱,但有零个或多个直接后继。② 其余n-1结点可分为m(m≥0)个互不相交的有限集T1,T2,…Tm,其中Ti又是一棵树,称为根的子树。树的定义具有递归性,即“树中还有树”。树的逻辑结构图示:如同一棵倒长的树 ① 倒置树结构表示法(树形表示法)② 文氏图表示法(嵌套集合表示法)③ 广义表表示法(嵌套括号表示法)(A(B(E(K,L),F),C(G),D(H(M),I,J)原创 2022-06-07 09:48:24 · 576 阅读 · 0 评论 -
数据结构之广义表
广义表一般记作GL=(d1,d2,…,dn)GL:广义表的名称。n:长度,结点的个数。di:可为单个元素,也可为广义表(子表),分别称为原子结点和表结点。表头:d1。表尾:其余元素组成的子表,即去掉表头元素的结果(d2,d3,…,dn)。可见,广义表的定义是递归定义的。例如:D=( ):空表,n=0A=(a,(b,c)):n=2,元素a、子表(b,c)B=(A,A,D):n=3,元素是A、A、DC=(a,C):n=2,一个递归的的表,元素是a、C。相当无穷表(a,(a,(…)))he原创 2022-06-06 09:45:07 · 832 阅读 · 0 评论 -
数据结构之数组
(1) 数组的概念由一组类型相同的数据元素构成的有限序列,且该有限序列存储在一块地址连续的内存单元中。(2) 一维数组是线性表A=(a1,a2,…an)其中,每个元素都是一个单元素。(2) 一维数组是线性表A=(a1,a2,…an)其中,每个元素都是一个单元素。(3) 二维数组是线性表吗?Am×n二维数组的阵列表示形式如下:矩阵Am×n可以看成n个列向量的线性表矩阵Am×n可以看成m个行向量的线性表即二维数组是“数据元素为一维数组”的线性表。ai,j有两个线性关系约束,aij既原创 2022-06-05 11:33:00 · 743 阅读 · 0 评论 -
数据结构之串
是由零个或多个字符组成的有限序列。记为S= ‘a1a2…an’ (n≥0)串的名字:串的标识符,如S。串的值:有限字符序列,如’12345’ 。串的长度:串中字符的个数。空串:是无任何字符组成的串。空格串:由一个或多个空格组成的串。如:一个空格串’ ’ 、多个空格的串’ '。两个串的长度相等,且对应字符都相等。子串:串中任意连续字符组成的子序列称为该串的子串。主串:包含子串的串。子串在主串的位置:以子串的第一个字符在主串中的位置来表示。例如:A=‘China Beijing’,B=原创 2022-06-04 10:51:41 · 3124 阅读 · 0 评论 -
数据结构之队列
队列是另一种限定性线性表,限定:一端插入元素,另一端删除元素。队尾(rear):允许插入的一端。队头(front):允许删除的一端。特性:先进先出队列:即FIFO表队列的表示和实现两种基本存储结构:循环队列、链队列循环队列:顺序存储的队列。链队列: 链式存储的队列。队头指针:指向头结点队尾指针:指向尾结点(1) 链队列结点类型定义(2) 链队列类型定义队头指针、队尾指针封装的结构体队头指针:Q.front、Q->front队尾指针: Q.rear、Q->rear循环原创 2022-06-03 10:59:52 · 634 阅读 · 0 评论 -
数据结构之栈
栈是一种限定性线性表,限定:插入和删除操作限制在栈顶进行,栈底固定。特性:后进先出栈:即LIFO表 栈的表示和实现两种基本存储结构:顺序栈、链栈顺序栈:顺序存储的栈。链栈: 链式存储的栈。(1) 初始化(2) 进栈(3) 出栈(4) 读栈顶元素(5) 双端栈:两个栈的共享技术双栈进栈出栈过程示意链栈链栈栈顶指针:链表的表头指针入栈、出栈操作:表头操作即可链栈结点类型、链栈类型的定义链栈结点类型: LinkStackNode链栈类型: LinkStack原创 2022-06-02 10:38:00 · 501 阅读 · 0 评论 -
线性表的链式存储
线性表既可顺序存储、亦可非顺序存储结点构成:数据域、指针域数据域:存储结点的值;指针域:存储直接后继的地址(指针),即指向直接后继结点。(1) 不带头结点的单链表(2) 带头结点的单链表(3) 带头结点的空单链表(1) 结点类型定义则结点类型为:Node已定义结点类型为Node,则结点地址的类型 Node *头指针L的类型 Node *next域的类型 Node *注:通过头指针L可以遍历所有结点,因此头指针L的类型可作为单链表的类型。(2)单链表类型的定义单链表的类型原创 2022-06-01 10:23:17 · 130 阅读 · 0 评论 -
线性表的顺序存储结构
顺序表及元素地址的计算顺序表:采用顺序存储结构的线性表。顺序表:关系线性化、结点顺序存元素地址的计算Loc(ai)=Loc(a1)+(i-1)k线性表顺序存储的表示(逻辑结构的实现)#define MAXSIZE 100 //宏定义typedef struct{ ElemType elem[MAXSIZE]; //空间 int Length; //表长度} SeqList; //SeqList为表类型名#define MAXSIZE 100 //宏定义原创 2022-05-31 13:17:20 · 164 阅读 · 0 评论 -
线性表的概念及其抽象数据类型
线性表的概念及其抽象数据类型线性表的逻辑结构1. 逻辑结构元素的性质:相同、有限线性表的长度:即元素的个数n空表:n=0n>0时,第一个元素:无直接前驱最后一个元素:无直接后继其余元素:只有一个直接前驱,一个直接后继线性表的概念线性表是由n(n≥0)个类型相同数据元素组成的有限序列。记作(a1, a2, …, ai-1, ai, ai+1, …, an) 表L表L的逻辑结构线性表的特点同一性:数据元素类型相同有穷性:数据元素个数有限有序性:序偶关系<ai, ai原创 2022-05-30 10:05:44 · 1155 阅读 · 0 评论 -
算法的空间性能分析
1. 算法耗费的空间算法占用的空间:是指算法占用辅助空间总和。∵辅助空间与计算机软硬件条件相关∴用辅助空间单元个数表示2. 算法的空间复杂度算法的空间复杂度S(n):定义为该算法所耗费存储空间的数量级。S(n) = O(f(n))例:将一维数组a中的n个数据逆序存放到原数组中,请分析两种算法的空间复杂度。算法1for(i=0;i<n;i++)b[i]=a[n-i-1];for(i=0;i<n;i++)a[i]=b[i];S(n)=O(n)算法2for(i=0;i&l原创 2022-05-29 13:15:42 · 1011 阅读 · 0 评论 -
数据结构之算法描述
1. 算法、语言、程序的关系① 算法:解题步骤② 语言:描述算法的一种工具,工具包括自然语言、程序设计语言、框图、伪代码等。③ 程序:使用某种语言,在计算机中实现算法。2. 设计实现算法的步骤① 确定结构关系:找出与求解有关的数据元素之间的关系。② 确定运算集合:确定在某一数据对象上所施加的运算。③ 存储结构:数据元素的存储表示。④ 语言选择:用于描述算法⑤ 设计算法算法的时间性能分析算法耗费的时间一个算法执行时间是指算法所有语句执行时间的总和。但执行时间与计算机软硬件条件相关原创 2022-05-28 09:25:03 · 724 阅读 · 0 评论 -
数据结构之算法
算法是规则的有限集合,是为解决特定问题而规定的一系列操作。不是程序,优于程序。算法的特征有限性、确定性、可行性、输入特性、输出特性① 有限性有限步骤、有限时间、非死循环② 确定性每个步骤确定、无二义性例如:继承父母双亲某一方法③ 可行性精确进行、有限次可实现例如:0.1+0.000000000001=?例如:32767+1=?④ 有多个或0个输入0个输入实质隐含基础输入⑤ 至少有一个或多个输出算法设计的要求正确、可读、健壮、高效、低耗(1) 正确性:满足要求的算法算法原创 2022-05-27 22:26:46 · 170 阅读 · 1 评论 -
数据结构的内容
数据结构的内容有哪些?元素的集合 + 关系的集合关系的三个方面?逻辑结构、物理结构、运算集合逻辑结构指数据元素之间逻辑关系的描述。(1) 四类基本逻辑结构集合、线性表、树、图(2) 两大类逻辑结构线性结构、非线性结构线性结构: 线性表、栈、队、字符串、数组、广义表非线性结构:树、图(3) 数据结构的形式定义∵ 元素集合+关系集合=数据结构∴ 数据结构是一个二元组Data_Structure = ( D, R )其中,D是数据元素的有限集,R原创 2022-05-26 12:54:17 · 313 阅读 · 0 评论 -
数据结构的基本概念
数据(Data)数据与信息的关系? 载体与本质程序处理的对象是? 数据数据是什么? 数据就是计算机化的信息数据与数值? 数值数据、非数值数据数据概念? 可计算机化的各种符号的集合数据举例:整数数据:N={…, -2, -1, 0, 1, 2, …}字符数据:C={A, B, … , Z}学生数据:S={记录1, … , 记录n}数据元素(Data Element)数据操作的基本单位和最小单位?数据元素(个体)与数据项举例1整数数据:N={…, -2, -1, 0, 1, 2,原创 2022-05-26 12:35:43 · 110 阅读 · 0 评论 -
Java工程师 数据结构与算法 队列及高级算法面试题(Day43)
1 什么是Java优先级队列(Priority Queue)?考察点:队列参考回答:PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。2 请你讲讲LRU算法的实现原理?考察点:LRU算法原创 2022-05-26 12:32:38 · 185 阅读 · 0 评论 -
Java工程师 数据结构与算法 堆与栈面试题(Day42)
1 请你解释一下,内存中的栈(stack)、堆(heap) 和静态区(static area) 的用法。考察点:堆栈参考回答:堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中)存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.一般由原创 2022-05-25 10:47:11 · 283 阅读 · 0 评论 -
Java工程师 数据结构与算法 排序面试题(Day41)
1 用java写一个冒泡排序?考察点:冒泡排序public static void main(String[] args) { int[] result = {2,4,1,3,6,5}; int temp; System.out.println("----冒泡排序前顺序----"); for (int i : result) { System.out.print(i); } for(int i=0;i<result.length-1;原创 2022-05-24 10:27:27 · 162 阅读 · 0 评论 -
Java工程师 数据结构与算法 数组面试题(Day40)
1 写一个算法,可以将一个二维数组顺时针旋转90度,说一下思路。考察点:数组public void rotate(int[][] matrix) { int n = matrix.length; for (int i = 0; i < n/2; i++) { for (int j = i; j < n-1-i; j++){ int temp = matrix[i][j];原创 2022-05-23 10:28:09 · 259 阅读 · 0 评论 -
Java工程师 数据结构与算法 链表面试题(Day39)
1 现在有一个单向链表,谈一谈,如何判断链表中是否出现了环考察点:链表参考回答:单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。解法:定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。2 谈一谈,bucket如果用链表存储,它的缺点是什么?原创 2022-05-22 10:28:57 · 129 阅读 · 0 评论 -
Java工程师 数据结构与算法 树面试题(Day37)
1 TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?考察点:Tree参考回答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现原创 2022-05-20 10:16:23 · 214 阅读 · 0 评论 -
Java工程师 数据结构与算法 哈希面试题(Day36)
1 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方?考察点:JAVA哈希表参考回答:Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。2 请说一说,Java中的HashMap的工作原理是什原创 2022-05-19 12:25:55 · 187 阅读 · 0 评论