![](https://img-blog.csdnimg.cn/20210903210710983.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 69
Stay--hungry
这个作者很懒,什么都没留下…
展开
-
数据结构期末复习
原创 2022-01-10 13:27:54 · 410 阅读 · 0 评论 -
其它排序方法
算法思想:第一趟对序列中所有奇数项i扫描,将a[i]和a[i+1]进行比较,a[i]>a[i+1],则将两者交换第二趟对序列中所有偶数项i扫描,将a[i]和a[i+1]进行比较,a[i]>a[i+1],则将两者交换第三趟对所有奇数项,第四趟对所有偶数项……,如此重复,直至整个序列有序代码:void f(int q[], int length){ int m = 1, n = 1; while (m || n) { m = 0, n = 0原创 2021-12-26 21:19:01 · 257 阅读 · 2 评论 -
B-树和B+树
大量数据存放在外存中,通常存放在硬盘中。由于是数据海量,不可能一次调入内存。因此,要多次访问外存。 但硬盘的驱动受机械运动的制约,速度慢。所以,主要矛盾变为减少访外次数。B-树B-树是一种平衡的多路查找树。二叉树中每个结点只能含有一个data元素和两个指针域,而B-树与之不同,B-树中每个结点可以含有m个指针域(m称为B-树的阶)和m-1个data元素。mmm阶B-树的特点:空树是B-树树中每个结点至多含有mmm个孩子结点(即有m个指针域、至多含有m−1m-1m−1个关键字)若树中结点数.原创 2021-12-12 15:27:06 · 306 阅读 · 0 评论 -
排序
注意:排序的稳定性所用的存储结构#define MAXSIZE 50typedef int KeyType;typedef struct{ KeyType key; /*...其它数据域...*/} ElemType;typedef struct{ ElemType data[MAXSIZE + 1];//从下标1开始存储 int length;//元素个数} SeqList;插入排序直接插入排序O(n2)O(n^2)O(n2)void Inse.原创 2021-09-04 19:51:40 · 217 阅读 · 0 评论 -
哈希表
文章目录哈希表哈希函数的构造方法直接定址法平方取中法折叠法除留余数法(最常用)处理冲突的方法开放定址法链地址法哈希表的查找哈希表查找算法的效率取决于比较的次数。 如果不经过比较就能确定要查找元素的位置,那么查找效率就会大大提高。哈希表基本思想:存储位置与关键字之间存在对应关系——哈希函数hashhashhash。即:Loci=hash(keyi)Loc_i=hash(key_i)Loci=hash(keyi) 哈希表的优点就是查找效率高,缺点是空间效率低。一般情况下,元素的关键字越多,越容易发生原创 2021-09-03 20:55:36 · 257 阅读 · 0 评论 -
树表的查找(二叉排序树与平衡二叉排序树)
二叉排序树二叉排序树又称二叉搜索树、二叉查找树。定义为:二叉排序树的性质:中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字排列的递增有序序列。二叉排序树的存储结构typedef int KeyType;typedef struct{ KeyType key; /*...其它数据域...*/ } ElemType;typedef struct BSTNode{ ElemType data; struct BSTNode *lChild; s原创 2021-09-01 18:30:33 · 339 阅读 · 0 评论 -
线性表的查找
查找算法的评价指标——平均查找长度(Average Search Length) 在查找过程中,需要比较关键字的平均次数。ASL=∑i=1nPiCiASL = \sum_{i=1}^nP_iC_iASL=i=1∑nPiCi其中PiP_iPi表示查找表中第iii个数据元素的概率,CiC_iCi表示在找到第iii个数据元素时与关键字比较的次数。文章目录线性表的查找顺序查找二分查找分块查找线性表的查找顺序查找顺序查找表的存储结构#define MAXSIZE 100typedef in.原创 2021-08-31 23:35:05 · 280 阅读 · 0 评论 -
最短路径问题
单源最短路径——Dijkstra算法关键思想:按路径长度递增的次序求最短路径。每一对顶点之间的最短路径——Floyd算法原创 2021-08-30 23:57:04 · 188 阅读 · 0 评论 -
AOE网与关键路径
AOE网AOE(activity on edge)网即边表示活动的网,是一个带权的有向无环图。顶点表示事件,弧表示活动,权表示活动持续的时间。AOV网是顶点表示活动的网,它只描述了活动之间的约束关系,是一个定性的研究。而AOE网是用有向边表示活动,边上的权值表示活动持续的时间,是一个定量的研究。AOE网是建立在AOV网基础之上(活动之间约束关系没有矛盾),再来分析完成整个工程至少需要多少时间,或者为缩短完成工程所需时间,应当加快那些活动等问题。关键路径计算各顶点的ve值是在拓扑排序中进行的,需要原创 2021-08-30 17:44:04 · 716 阅读 · 0 评论 -
AOV网与拓扑排序
AOV网几乎所有的工程都可分为若干个称为活动的子工程,而这些子工程之间通常受到一些条件的制约,如某些子工程必须要在其它子工程完成之后才能进行。用图的顶点表示子工程(活动),用弧表示活动之间的优先关系的有向无环图(Directed Acycline Graph, DAG)叫做AOV网(activity on vertex network)。在AOV网中不应该存在有向环,因为存在环就意味着某项活动以自身为先决条件,不合逻辑。因此,对给定的有向图,应首先判断网中是否存在环,检测的方法就是利用有向图的拓扑排序。原创 2021-08-29 23:16:25 · 917 阅读 · 0 评论 -
最小生成树
生成树的相关概念最小生成树(Minimum Spaning Tree)若图中所有权值均不相等时,该图的最小生成树是唯一的。若无向图中边数比顶点数小1,即图本身就是一棵树,则该图的最小生成树就是它本身。MST性质:若N=(V,E)N=(V,E)N=(V,E)是一个连通网,UUU是VVV的一个非空子集,若边(u,v)(u,v)(u,v)是一条具有最小权值的边,其中u∈U,v∈V−Uu\in U, v\in V-Uu∈U,v∈V−U,则必然存在一棵包含边(u,v)(u,v)(u,v)的最小生成树原创 2021-08-28 23:36:13 · 167 阅读 · 0 评论 -
图的遍历——DFS与BFS
图中可能存在回路,在访问完某个结点之后,可能会沿着某条边回到曾经访问过的结点。为避免重复访问,可以设置辅助数组visited[n],用来标记每个被访问过的结点。深度优先搜索(Depth First Search)广度优先搜索(Breadth First Search)...原创 2021-08-27 23:26:39 · 310 阅读 · 0 评论 -
图
图的相关概念图是一种非线性结构,图中的数据元素是多对多的关系。若图的顶点个数为nnn,边(弧)数为eee,顶点viv_ivi的度为TD(vi)TD(v_i)TD(vi),则图的边(弧)数与顶点的度满足关系:e=12∑i=1nTD(vi)e = \frac{1}{2}\sum_{i=1}^nTD(v_i)e=21i=1∑nTD(vi)图的存储结构邻接矩阵(数组表示法)图没有顺序存储结构,但可以借助二维数组来表示元素间的关系。无向图的邻接矩阵无向图的邻接矩阵的特点原创 2021-08-27 17:17:42 · 83 阅读 · 0 评论 -
哈夫曼树(最优二叉树)
文章目录哈夫曼树的一些基本概念哈夫曼树的构造(哈夫曼算法)哈夫曼树的存储不同的判别树的效率是不同的。哈夫曼树的一些基本概念但路径长度最短的二叉树不一定是完全二叉树。哈夫曼树就是带权路径长度WPL最短的树。(注意:“带权路径长度最短”是在度相同的树中比较所得,因此有“最优二叉树”、“最优三叉树”等之称)满二叉树不一定是哈夫曼树。特点:哈夫曼树中权值越大的叶子离根越近哈夫曼树不唯一哈夫曼树中只有度为0(叶子结点)或度为2(新结点)的结点,不含度为1的结点包含nnn个叶子结点的哈夫曼树原创 2021-08-25 18:05:06 · 390 阅读 · 0 评论 -
线索二叉树
一般的二叉树无法直接找到结点在某种遍历序列下的前驱和后继结点。为解决这个问题可以利用二叉链表中的空指针域。具有n个结点的二叉链表中共有2n个指针域,其中有n+1个指针域为空。在二叉树的遍历过程中,可得到结点的前驱信息和后继信息,同时将结点中的空指针域修改为其直接前驱或直接后继的信息(空的左孩子指针域存储前驱结点的地址,空的右孩子指针域存储后继结点的地址),修改后的二叉树称之为“线索二叉树(Threaded Binary Tree)”,该过程称为二叉树的线索化。因此二叉树的线索化就是对二叉树的遍历过程原创 2021-08-24 12:01:18 · 154 阅读 · 0 评论 -
二叉树
文章目录二叉树两种特殊的二叉树二叉树的性质二叉树的存储顺序存储链式存储二叉树二叉树是具有nnn个结点的有限集,它可能是空集(n=0n=0n=0),也可能是由一个根节点和两棵互不相交的二叉树组成(分别称为左子树、右子树)。二叉树的特点:每个结点最多有两个孩子(二叉树中不能存在度大于2的结点)子树有左右之分,次序不能颠倒。二叉树可以是空集合,左右子树可以是空集两种特殊的二叉树满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。在满二叉树中,从最后一个结点开始,连续地去掉任意个结点,原创 2021-08-17 22:33:36 · 385 阅读 · 0 评论 -
树和森林
树型结构中每个元素只有一个前驱,可以有多个后继。结点之间有分支,具有 层次关系。原创 2021-08-17 19:12:39 · 84 阅读 · 0 评论 -
广 义 表
原创 2021-08-16 19:34:29 · 97 阅读 · 0 评论 -
数组
文章目录数组特殊矩阵的压缩存储1,对称矩阵2,三角矩阵3,对角矩阵(带状矩阵)4,稀疏矩阵三元组实现——顺序存储结构三元组顺序表的操作1,表示稀疏矩阵十字链表实现——链式存储结构数组数组即按照一定格式排列起来,具有相同类型的数据元素的集合。n维数组:n-1维数组中的每个元素均为一维数组,也可理解为一维数组内的每个元素均是n-1维数组。n维数组中的每个元素处于n个向量中,有n个前驱元素,也有n个后继元素。线性表结构是数组结构的一个特例,数组结构又是线性表结构的拓展。数组结构具有结构固定的特点,一般不原创 2021-08-13 22:29:01 · 173 阅读 · 0 评论 -
链串
链串的表示一个结点中存放多个字符以提高存储密度,也称为“块链”。#define CHUNKSIZE 10 //块的大小由用户决定 typedef struct chunk{ char ch[CHUNKSIZE]; struct chunk *next;}ChunkNode;typedef struct{ ChunkNode *head, *tail;//块链的头指针、尾指针 int length; //块链的当前长度 }Linkstring;//字符串的块链结构 链串的操作1,原创 2021-08-12 20:14:21 · 106 阅读 · 0 评论 -
堆串
在顺序串中,若进行串的插入、连接、替换等操作,如果串的长度超过了MAXSIZE,则串会被截掉一部分。为克服这一缺点,可以采用动态存储分配。采用堆分配存储表示的串称为堆串。堆串的表示typedef struct{ char *str;//指向堆串起始地址的指针 int length;//堆串的长度 }HeapString;堆串的操作1,堆串的初始化、赋值、销毁void InitString(HeapString &S){ S.length = 0; S.str = NULL;原创 2021-08-12 14:33:09 · 837 阅读 · 2 评论 -
顺序串
一些基础字符串操作字符串是内容受限的线性表(即内容只能为字符)。几个概念:子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串真子串:不包括自身的子串子串位置:子串中第一个字符在主串中的位置(从1开始)串相等⟺\Longleftrightarrow⟺两个串长度相等且各个位置上的字符都相同注意:所有空串都是相等的顺序串的表示#define MAXSIZE 100typedef struct{ char ch[MAXLEN + 1];//从下标1开始存储(ch[0]闲置)原创 2021-08-07 21:00:47 · 206 阅读 · 0 评论 -
栈的应用——回文序列
将一个字符串全部存入栈中,再读取时,得到的便是倒序的字符串。与原字符串一个一个字符进行比对,若存在不相同的字符,则不是回文序列。#include <iostream>#include <cstring>using namespace std;#define STACKSIZE 100typedef char ElemType;typedef struct{ ElemType data[STACKSIZE]; int top;}SeqStack;void Push原创 2021-08-06 20:25:02 · 218 阅读 · 0 评论 -
栈的应用——迷宫求解
求迷宫中从入口到出口的路径,通常采用穷举法:从入口出发,顺某个方向向前摸索,若能走通,则继续向前走,否则原路返回,换另一个方向继续探索,直到探索到出口为止。为了保证在任何位置都能够原路返回,需要用一个栈来保存从入口到当前位置的路径。具体思路:如果当前位置“可通”,则纳入“当前路径”,并继续朝下一个位置探索,即切换下一个位置为当前位置如果当前位置不可通,则应沿“来向”退回到前一通道块,然后朝其它方向继续探索如果该通道块的四周方块均不可通过,则应从当前路径上删除该通道块在程序的实现中,定义墙元素原创 2021-08-03 23:30:37 · 1674 阅读 · 0 评论 -
栈的应用——算术表达式求值
一个算术表达式是由操作数、运算符和分界符组成的。为了简化问题,假设算术运算符仅由‘+’、‘-’、‘*’、‘/’、‘(’、‘)'六种符号组成。例如一个算术表达式为:6+(7-1)*3+10/2,这种运算符总出现在两个操作数之间的算术表达式称为“中缀表达式”。后缀表达式(逆波兰式Reverse Polish notation,RPN)一个表达式E的后缀形式可以如下定义:如果E是一个变量或常量,则E的后缀式是E本身。如果E是E1 op E2E_1\; op\; E_2E1opE2形式的表达式,原创 2021-07-28 22:48:59 · 345 阅读 · 0 评论 -
队列
队列队列只能在表尾进行插入元素,删除元素时只能删除第一个元素(表头),具有先进先出(FIFO)的特性。队列的应用队列常用于解决与“排队”相关的问题。1,舞伴问题假设在舞会上,男女各排成一队,男生队头与女生队头配为舞伴。如果两队初始人数不同,则较长队中未配对者等待下一轮。p51...原创 2021-07-24 17:27:01 · 71 阅读 · 0 评论 -
栈基础知识
栈和队列是限定插入和删除只能在表的端点进行的线性表栈栈只能在表尾进行插入或删除,具有后进先出(LIFO)的固有特性,向栈中添加元素称为“推入push”,从栈中取出元素称为“弹出pop”。栈与一般线性表的区别仅在于运算规则不同。若有n个元素进栈,则共有 C2nnn+1\frac{C_{2n}^{n}}{n+1}n+1C2nn 种出栈顺序顺序栈的表示#define STACKSIZE 100typedef struct{ ElemType data[STACKSIZE]; int t.原创 2021-07-24 17:26:13 · 103 阅读 · 0 评论 -
线性表应用——一元多项式
一元多项式相加使用顺序表#define MAXSIZE 100#include <iostream>using namespace std;typedef float ElemType;typedef struct{ ElemType *data; int length;}SeqList; void InitSeqList(SeqList &L){ L.data = new ElemType[MAXSIZE]; L.length = 0;} void Ad原创 2021-07-23 20:28:42 · 142 阅读 · 0 评论 -
循环链表、双向链表、循环双向链表
文章目录二,循环链表一些操作1,将两个循环链表合并O(1)O(1)O(1)三,双向链表一些操作1,双向链表的元素插入2,双向链表的元素删除四,双向循环链表一些操作1,尾插法插入元素2,直接创建一个含n个元素的循环双向链表3,求循环链表的元素个数(双向循环链表的遍历)4,元素的查找5,打印链表几种链表的比较顺序存储结构与链式存储结构的比较二,循环链表表中最后一个结点的指针域指向头结点优点:从表中任意一个结点出发都可以找到表中其它结点注意:循环链表的遍历结束条件循环链表中使用尾指针要比使用头指针更方原创 2021-07-22 22:56:46 · 79 阅读 · 0 评论 -
约瑟夫问题
n个人,编号分别为1、2、3、…、n,围成一个圈。他们按顺时针方向从编号为k的人由1开始报数,报数为m的人出列,他的下一个人重新从1开始报数,报数为m的人再出列。输入:n,k,m输出:出列的编号顺序思路一:双向循环链表创建一个不带头结点的双向循环链表,编号1~n,代表n人找到第k个结点(即第一个报数的人)从k结点处计数,删除计数为m的结点继续从下一个结点出计数,直到删除所有的结点...原创 2021-07-22 22:56:30 · 351 阅读 · 1 评论 -
数据结构与算法绪论
2021年7月18日21:13:56原创 2021-07-18 21:14:03 · 63 阅读 · 0 评论 -
顺序表、单链表
问题的解决方法的效率跟数据的组织方式有关原创 2021-07-08 20:03:38 · 104 阅读 · 0 评论 -
测量函数运行的时间
#include <stdio.h>#include <time.h>#define TIMES 1e7 //定义一个函数运行次数 clock_t start, end;//clock_t是clock()函数的返回类型double duration;//记录运行时间,以秒为单位 void function(){}int main(){ /*......*/ start = clock();//clock()函数返回从程序开始运行到调用clock()函数所经历原创 2021-07-07 19:24:00 · 220 阅读 · 0 评论 -
查找
一,顺序查找#include <stdio.h>#include <stdlib.h>#define FAILED -1int search(const int arr[], int key, int n)//查找元素数为n的数组arr中与key一致的元素{ int i = 0; while(1) { if (i == n) return FAILED;//数组遍历了一遍 if (arr[i] ==原创 2021-06-29 10:26:15 · 280 阅读 · 0 评论 -
时空复杂度
一,时间复杂度1,定义算法的时间复杂度是指运行算法时所需要消耗的时间资源。其定义是:如果一个问题的规模为n,解决这一问题的某算法所需要的时间为n的函数T(n)。当输入量n逐渐增大时,T(n)的极限情形评估了函数的增长率,用其表示算法的时间复杂度。由于算法的执行时间常与所用系统相关,因此,要评估算法的效率,不能使用微秒、纳秒这样的实际时间单位,而应该采用某种逻辑单位,来描述问题规模与处理数据所需时间之间的关系。算法的时间复杂度要比空间复杂度更重要。2,表示形式:表示形式定义内涵原创 2021-06-25 22:08:56 · 104 阅读 · 0 评论