- 博客(39)
- 收藏
- 关注
原创 数据结构与算法课程设计---最小生成树的应用
假定有这么一个问题,有11个城市,城市之间有一些天然气管道,铺设天然气管道需要花费不同的金额,现在要你选择其中一些天然气管道,使得所有城市可以互相联通且花费最小。
2023-06-01 18:40:59
2303
32
原创 进程间通信---管道
想要实现本地任意两个进程之间的通信, 可以通过命名管道来实现. 命名管道是一种特殊类型的文件(管道文件), 两个进程通过命名管道的文件路径打开同一个管道文件, 此时这两个进程也就看到了同一份资源,进而就可以进行进程间通信了。写端进程不写, 读端进程一直读, 那么此时会因为管道里面没有数据可读, 对应的读端进程会被挂起, 直到管道里面有数据后, 读端进程才会被唤醒.读端进程不读, 写端进程一直写, 那么当管道被写满后, 对应的写端进程会被挂起, 直到管道当中的数据被读端进程读取后, 写端进程才会被唤醒.
2023-04-23 18:29:51
706
10
原创 图的最短路径
概念从在带权有向图G中的某一顶点出发, 找出一条通往另一顶点的最短路径, 最短也就是沿路径各边的权值总和达到最小.分类给定一个带权图G的每条边(vi,vj)上的权值都是非负实数. 另外, 给定V中的一个顶点s充当源点.基本思想: 按路径长度递增的次序来产生最短路径算法.把V分成两组:dist[] : 记录从源点s到其它顶点当前的最短路径长度. 初始时源点s对应的元素为0, 其它为无穷大.pPath[] : pPath[i]表示从源点到顶点i之间的最短路径的前驱顶点的下标. 初始时全为-1, 在算法结束时,
2023-01-21 22:48:43
3108
25
原创 图的关键路径(AOE网络)
在AOE网中, 有些活动是可以并行进行的. 从源点到汇点的有向路径可能有多条, 并且这些路径长度可能不同. 完成不同路径上的活动所需的时间虽然不同, 但是只有所有路径上的活动都已经完成, 整个工程才能算结束. 因此, 从源点到汇点的所有路径中, 具有最大路径长度的路径称为关键路径, 而把关键路径上的活动称为关键活动.AOE网和AOV网都是有向无环图, 不同之处在于它们的边和顶点所代表的含义不同, AOE网中的边有权值, 而AOV网中的边无权值, 仅代表顶点之间的前后优先关系.这两条最长路径即为关键路径.
2023-01-18 21:56:06
5197
11
原创 图的拓扑排序(AOV网络)
图的每条边弧处理一次图的每个顶点访问一次采用邻接表表示时, 时间复杂度为O(n+e).采用邻接矩阵表示时, 时间复杂度O(n2).空间复杂度都为O(n).
2023-01-15 21:11:26
2627
6
原创 图的最小生成树
在无向图中, 一条边会在邻接矩阵中存储两次, 对于(u,v)这条边, (u,v)与(v,u)这两条意义相同的边都会存储到邻接矩阵中, 所以我们该如何将这两条边中的一条压入堆中呢?在无向图中, 一条边会在邻接表中存储两次, 对于(u,v)这条边, (u,v)与(v,u)这两条意义相同的边都会存储到邻接表中, 所以我们该如何将这两条边中的一条压入堆中呢?我们可以发现如果图中有较小相等的权值边, 最小生成树可能不唯一, 但是最小生成树上的权值之和是相等的. 上面两种方案的权值之和都是50, 但因为(v。
2023-01-12 21:18:48
4284
16
原创 二叉树的遍历(非递归)
遍历二叉树, 是指按一定的规则和顺序访问二叉树的所有结点, 使每一个结点都被访问一次, 而且只被访问一次.也可以是NRL, 因为这两种遍历方法都是先访问根结点, 所以没有区别, 掌握其中一种, 另一种也随之掌握.BFS: 是指沿着二叉树的宽度优先遍历二叉树的结点, 即从上到下从左到右逐层遍历二叉树的结点.由于二叉树是非线性结构, 因此, 二叉树的遍历实质上是将二叉树的各个结点排列成一个线性序列.层序遍历就是根据二叉树的结构从上到下从左到右逐层遍历二叉树的结点.给你一棵二叉树的根节点。
2023-01-09 22:09:44
8617
3
原创 图的生成树与生成森林
对于有向图来说, 若从某一顶点到图中的每个顶点都有路径, 则能够访问到图中的所有顶点, 否则不能访问到所有顶点. 因此判断有向图的强连通性, 需要依次从所有顶点出发遍历, 只有从所有顶点出发遍历到其它所有顶点, 该有向图才具有强连通性, 如果从某一个顶点出发遍历, 不能连续遍历到其它顶点, 则该有向图不具有强连通性.若无向图G是非连通图, 从图中某一顶点出发遍历图, 不能访问到该图的所有顶点, 需要依次对图中的每一个连通分量进行深度优先遍历或者广度优先遍历, 即需要从多个顶点出发进行DFS或者BFS.
2023-01-06 21:16:30
3127
35
原创 图的遍历(深度DFS与广度BFS)
*设图G有n个顶点, e条边, 在广度优先遍历算法中, 每一个顶点都会进一次队列且只进一次, 同时每次要遍历每个顶点对应的链表中所有边表顶点一次, 因此若采用邻接表作为存储结构, 广度优先遍历的时间为O(n+e).若采用邻接矩阵作为存储结构, 则时间为O(n。无向图G, 从顶点A出发, 一种可能的深度优先遍历: A,B,E,G,D,F,C. 另一种可能的深度优先遍历: A,C,F,G,E,B,D. 所以当存储结构和遍历算法不确定时, 其遍历结果可能不唯一.), 而空间复杂度均为O(n). **
2023-01-03 18:39:19
1290
30
原创 图的概念及存储结构
若图中顶点对是有序的, 即边是有方向的,边集E(G)为有向边的集合, 则图G称为有向图. 一般将边称为弧(arc), 以有序对表示一条从顶点u出发到达顶点v的弧, 其中: u称为弧尾或者起点, v称为弧头或者终点. 在有向图中, 和是不一样的.若图中顶点对是无序的, 即边是无方向的, 边集E(G)为无向边的集合, 则图G称为无向图. 以无序对(u,v)表示u和v之间存在一条无向边. 在无向边中边是对称的, (u,v)和(v,u)表示同一条边.
2022-12-31 18:34:41
896
7
原创 数据结构-归并排序与基数排序
归并的含义是将两个或者两个以上已经有序的子序列合并成一个新的有序的序列。归并排序的基本思想是分治法,也就是先让子序列有序,再将子序列合并成有序的序列,类似二叉树的后序遍历。假设待排序的元素有n个,可以将这n个元素视为n个长度为一的子序列,然后两两归并,得到n/2个有序子序列。之后继续两两归并直到合并成长度为n的有序序列为止;上述这种两两归并的方法叫做二路归并排序。...
2022-08-25 21:04:05
1182
14
原创 数据结构-快速排序
快速排序的基本思想是分治法,在待排序元素中任取一个元素作为基准,通过一定的操作使得一边的元素都小于该基准值,而另一边的元素都大于该基准值。通过这一趟排序划分被选为基准值的元素放在了最终正确的位置。然后对该基准值的左右两边元素分别递归地重复上述过程,直到左右两边的区间只有一个元素或者区间不存在,也就是待排序的所有元素都放在了其最终位置上。
2022-08-24 18:12:57
2668
13
原创 数据结构-红黑树
红黑树也是一种二叉排序树,在红黑树中每个结点存储着对应的颜色(红色或者黑色),由于AVL树的高度平衡是因为非常频繁地调用旋转来保存自身平衡的,代价较大。所以在AVL树的基础上进一步放宽条件,引入红黑树,即红黑树的最长路径不会比最短路径长两倍。......
2022-08-18 12:05:53
1206
8
原创 数据结构-AVL树(平衡二叉树)
规定在插入和删除二叉搜索树的结点时,要保证任意结点的左右子树高度差的绝对值不超过1,我们将这样特殊的二叉搜索树称为AVL树(平衡二叉树)。每一个结点中有记录其左右子树高度差的平衡因子,也即平衡因子的值只可能是-1,0,1。(1如果某结点的左子树高度比右子树高度高一则平衡因子为-1,如果某结点的左子树高度比右子树高度低一则平衡因子为1,如果某结点的左子树高度与右子树高度一样则平衡因子为0)。............
2022-08-11 23:08:30
1131
1
原创 数据结构-二叉搜索树
二叉搜索树也称二叉排序树或者二叉查找树,它是在普通二叉树上加入一些特性所形成的:1,若左子树非空,则左子树上所有结点的值均小于根结点的值。2,若右子树非空,则右子树上所有结点的值均大于根结点的值。3,其左右子树也分别是一棵二叉搜索树。......
2022-08-07 16:01:18
1828
4
原创 数据结构-链式二叉树
对于那些非完全二叉树,由于顺序存储结构的空间利用率低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每一个结点。在链式二叉树中,结点结构通常包括数据域和若干个指针域。......
2022-08-02 12:04:38
2695
2
原创 Linux | 工具使用(vim gcc g++ gdb yum git)
vim编辑器,gcc/g++编译器,gdb调试器,yum软件包管理器,git版本控制器,make指令,Makefile文件。
2022-07-31 12:07:10
1174
5
原创 数据结构-堆(完全二叉树)
堆是一种数据结构,它与操作系统的虚拟进程地址空间中的堆是两回事。堆的逻辑结构是一颗特殊的完全二叉树,它要求双亲结点中的数据要大于或者小于其左右孩子结点中的数据;而堆的物理结构是由动态数组来实现的。 堆可以分为大根堆与小根堆。设数组a存储着堆中的数据,大根堆就是双亲结点的数据大于其左右孩子结点的数据(a i >= a 2*i + 1 && a i >= a 2*i + 2);小根堆就是双亲结点的数据小于其左右孩子结点的数据(a i ...
2022-07-27 12:48:12
1679
8
原创 数据结构-队列(链队列与循环队列)
队列也是一种特殊的线性表,其操作受到限制。只允许在队列的一端进行插入数据操作,而在队列的另一端进行删除数据操作。在队列中,进行插入数据操作的一端叫做队尾,其操作叫做入队列或者进队列;而进行删除数据操作的一端叫做队头或者队首,其操作叫做出队列或者离队列。如上图所示,n1,n2,n3,n4,n5依次从队尾入队,队头元素是n1,队尾元素是n5;而出队只能从另一端队头出,次序依次为n1,n2,n3,n4,n5。......
2022-07-24 22:43:30
2053
10
原创 Linux | 权限概念
因为Linux是一个多用户操作系统,所以Linux下可以同时存在多个用户。而超级用户root只有一个,root具有Linux最高权限,一般不受到权限约束;普通用户可以有多个,要受到权限的约束。Linux下的用户表示着权限大小。......
2022-07-22 18:12:41
2003
6
原创 数据结构-栈
栈是一种特殊的线性表,其只允许在固定一端进行插入和删除操作。允许进行数据插入和删除的一端叫做栈顶,而不允许数据插入和删除的那一端叫做栈底。如上图所示,n1为栈底元素,n5为栈顶元素。由于栈只能在栈顶进行插入删除操作,所以压栈的次序依次为n1,n2,n3,n4,n5;而出栈的次序为n5,n4,n3,n2,n1;由此可见,栈的特性可以概括为后进先出(LastInFirstOut,LIFO)。.........
2022-07-20 23:57:34
910
5
原创 数据结构-带头双向循环链表
链表的种类非常丰富,有带头结点的或不带头结点的,有单向的或双向的,有循环的或非循环的,这样组合起来有2*2*2=8种链表结构。头结点与头指针的概念:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头链表中第一个结点,该结点通常不存储数据。 引入头结点可以带来两个优点:1.由于第一个数据结点的位置被存储在头结点的指针域中,因此在链表的第一个位置上的操作和在链表其他位置上的操作一致,无须进行特殊处理。2.无论链表是否为空,其头指针都指向头结点,因此空表与非空表的处理也得到统一。........
2022-07-18 00:19:54
1583
10
原创 Linux | 基础指令
在学习基础指令之前,我们要清楚的是Linux的整个目录结构是一个多叉树结构,因为这种树结构能让Linux下的文件或者目录都有唯一确定的绝对路径。路径可以分为绝对路径与相对路径1.以根目录“/”开始的路径叫做绝对路径。2.不以根目录开始,而是以当前路径作为参考点来定位文件或者其他目录的方式叫做相对路径。在Linux中以“/”作为路径分割符。我们在Linux中敲击各种指令,其实就是在使用Linux。......
2022-07-15 18:51:30
538
1
原创 单链表的反转,中间结点,回文结构
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 给定一个链表的 头节点 head ,请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。......
2022-07-13 12:08:40
267
1
原创 C++|缺省参数与函数重载
缺省参数是声明或者定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果有指定默认值的参数没有接收到实参值则采用该默认值,否则使用实参值。 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同。......
2022-07-11 10:09:23
317
2
原创 C++|命名空间与引用
为了解决这种命名冲突,C++增加了命名空间这样的语法。让每个人在各自的命名空间作用域里定义变量,函数,类等。 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。...
2022-07-10 12:38:08
1044
原创 数据结构-单链表
链表能按需申请释放空间,插入和删除操作不需要移动元素,只需要修改结点里指针变量的指向就可以,但也会失去顺序表可随机读写的优点。
2022-07-08 12:47:09
434
1
原创 数据结构-动态顺序表
对于动态顺序表,在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就将原有的存储空间扩充或者另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性地划分所有空间。......
2022-07-06 11:43:40
990
4
原创 数据结构-静态顺序表
顺序表又分为静态顺序表和动态顺序表。对于静态顺序表,在静态分配时,由于数组的大小和空间事先已经固定好了,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃。
2022-07-04 21:04:00
1358
原创 我的C语言.条件编译与预处理指令
#ifdefifdef是判断后面标识符是否被#define定义。 如果被定义了就执行#ifdef与#endif之间的语句。 如果没有被定义就不会执行#ifdef与#endif之间的语句。 #ifdef只管后面的标识符是否被定义,如果标识符被定义了不管后面的标识符是何值都会被执行。...
2022-04-16 10:59:36
734
原创 我的C语言.编译链接运行
编译编译分为三个部分: 预编译(预处理)->编译->汇编预编译(预处理)删除注释 #define定义的标识符常量与宏的替换 头文件的包含编译词法分析 语法分析 语义分析 符号汇总 将源代码转换为汇编代码汇编将汇编代码转换为二进制机器指令 生成符号表链接...
2022-04-15 22:32:41
654
原创 我的C语言.数据的存储
1.整形在内存中的存储char unsigned char signed char short unsigned short signed short int unsigned int signed int long unsigned long signed long在计算机中整数有三种表示方式,即原码、反码和补码。 在原,反,补码中,最高位表示符号位,其他位表示数据位。当符号位为1时,表示负数,当符号位为0时,表示正数。 正数的原码,反码,补码相同。负数的原码,反码...
2022-04-06 13:42:45
753
原创 我的C语言.了解内存函数
memsetvoid* memset(void* ptr,int value,size_t num);该函数的作用就是将一段内存块中的内容修改为某一特定的整数值,常用于初始化。 第一个参数就是要修改数据的首地址,其类型是void*,说明它可以为任何类型的数据进行初始化。 第二个参数是int,就是要将该数据修改成一个什么样的整形。 第三个参数是一个无符号整形,指定要修改多少个字节大小。memcpyvoid* memcpy(void* d,const void* s,size_t nu.
2022-03-31 15:14:27
799
原创 我的C语言.字符串函数的模拟
strlensize_t strlen(const char* str)strlen是求字符串的长度,也就是求字符串中\0之前字符出现的个数,需要特别注意的是该函数的返回值是无符号的。1.计数法2.指针减指针法首先,我们要明白指针减指针的意义是:表示指针之间的元素个数。3.函数...
2022-03-20 17:33:46
766
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人