数据结构
M͏͏r.D
这个作者很懒,什么都没留下…
展开
-
数据结构——Prim 算法与Dijkstra算法
Prim:(这里把权值理解成距离)假设,已经确定的点的集合为S,那么还未确定的点可以记为1-S,我们每次从还未确定的点集合1-S中,选择一个里离集合S中的点直接相连,且权值最小(贪心)的点加入S中,不妨被这个点为t,则S与1-S将发生变化:由于t变成了S中的点,那么1-S中与t相连的点的距离实际上变成了该点与S的距离。由于初始化时,已经有一个点已经标志,那么只需要循环N-1次就够了,而且只能是N-1次,否则可能会发生错误(视INF而定),这就是Prim算法。Kruskal:这个算法相对于Prim来说就比较好原创 2022-06-05 14:23:00 · 269 阅读 · 0 评论 -
数据结构——邻接表及广度优先遍历
邻接表我们发现,当图中的边数相对于顶点较少时,邻接矩阵是对存储空间的极大浪费。我们可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。回忆树结构的孩子表示法,将结点存入数组,并对结点的孩子进行链式存储,不管有多少孩子,也不会存在空间浪费问题。应用这种思路,我们把这种数组与链表相结合的存储方法称为邻接表(Adjacency List)。老师的代码/** * Adjacency list for directed graph. * * @author Fan Min minfanp原创 2022-05-31 14:04:45 · 193 阅读 · 0 评论 -
数据结构——图的遍历
在线性表,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继,即存在一对一的关系。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关,即存在一对多的关系。图是一种较线性表和数更加复杂的数据结构。在图结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关,图存在多对多的关系。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G 表示一个图原创 2022-05-31 13:51:38 · 276 阅读 · 0 评论 -
数据结构——N皇后问题
问题描述八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决原创 2022-05-25 19:30:38 · 354 阅读 · 0 评论 -
数据结构——哈夫曼树
哈夫曼树:树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。任务描述:从文件中读文本; 统计字符频次, 并建立字母表; 构造 Huffman 树; 将文本编码; 解码.版本一分析:parent, lchild, rchild 都用的是整数, 即下标. 也就是说, 先建立节点, 存放于一个数组 (线性表) 中, 再进行链接. 避免使用指针, 有静态链表的味道, good!代.原创 2022-05-25 19:20:00 · 904 阅读 · 0 评论 -
数据结构——二叉树的构建与遍历
概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒。二叉树的存储结构二叉树一般可以使用两种存储结构,一种顺序结构,一种链式结构。二叉树的性质 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.原创 2022-05-24 13:07:09 · 154 阅读 · 0 评论 -
数据结构——压缩矩阵的转置
压缩矩阵在实际应用中广泛使用老师的代码#include <stdio.h>#include <malloc.h>typedef int elem;/** * A triple for row index, column index, and data. */typedef struct Triple{ int i; int j; elem e;} Triple, *TriplePtr;/** * A triple for ro原创 2022-05-18 20:33:01 · 113 阅读 · 0 评论 -
数据结构——二维数组和矩阵乘法
思路:1、首先我们要定义三个二维数组来存储第一个矩阵、第二个矩阵和相乘后得到的新矩阵。2、对第一个、第二个矩阵的每个进行赋值(要注意的是我们需要让第一个矩阵的列数等于第二个矩阵的行数),然后将其打印出来。3、使用for循环语句,先遍历第二个矩阵的第j列的每一个元素,然后将其与第一个元素的第i列的每一个元素进行相乘并相加。将其运算后的结果放在对应第i行第j列的新数组中。4、再利用for循环将得到的新数组进行一个元素一个元素的输出。老师的代码#include <stdio.h>原创 2022-05-18 19:11:29 · 298 阅读 · 0 评论 -
数据结构——队列
队列是一种操作受限的线性表,只允许在表的前端(front)进行删除操作又称作出队,在表的后端进行插入操作,称为入队,符合先进先出(First in First out)的特性。在队尾插入元素叫做入队,对头删除元素叫做出队。1.链队列老师代码#include <stdio.h>#include <malloc.h>/** * 链队列的节点. */typedef struct LinkNode{ int data; LinkNode* next;}*Lin原创 2022-05-16 17:00:14 · 305 阅读 · 0 评论 -
数据结构——递归的应用(累加和汉诺塔问题)
什么是递归递归,就是在运行的过程中调用自己。构成递归需具备的条件:1. 子问题须与原始问题为同样的事,且更为简单;2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。累加#include <stdio.h>/** * Hanoi. */void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) { if (paraN <= 0) { return;原创 2022-05-11 21:00:57 · 274 阅读 · 0 评论 -
数据结构——表达式求值(栈的应用)
先附上老师的代码//202031061018 刘知鑫#include <iostream>#include <cstring>#include <algorithm>#include <stack>#include <unordered_map>using namespace std;stack<int> num;stack<char> op;void eval(){ auto b =原创 2022-05-09 18:19:38 · 349 阅读 · 0 评论 -
数据结构——括号匹配(栈的应用)
先附上老师的代码#include <stdio.h>#include <malloc.h>#define STACK_MAX_SIZE 10/** * Linear stack of integers. The key is data. */typedef struct CharStack { int top; int data[STACK_MAX_SIZE]; //The maximum length is fixed.} *CharSta原创 2022-05-09 18:09:25 · 83 阅读 · 0 评论 -
数据结构——栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。先附上老师的代码#include <stdio.h>#include <malloc.h>#define STACK_MAX_SIZE 10/.原创 2022-05-09 17:55:30 · 87 阅读 · 0 评论 -
数据结构——多项式的加法
先附上老师的代码#include <stdio.h>#include <malloc.h>/** * Linked list of integers. The key is data. The key is sorted in non-descending order. */typedef struct LinkNode{ int coefficient; int exponent; struct LinkNode *next;} *LinkList, *N原创 2022-05-04 20:15:33 · 211 阅读 · 0 评论 -
数据结构——静态链表
1.定义逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。也就是说静态链表是用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构。它的优点是和动态链表一样,删除和插入元素时间复杂度低;不足是和数组一样,需要提前分配一块较大的空间。2.老师的代码#include <stdio.h>#include <malloc.h>#define DEFAULT_SIZ原创 2022-05-03 12:38:48 · 413 阅读 · 0 评论 -
数据结构——双向链表
双链表是链表中的一种,他和单链表一样都是通过指针将一个个结点连接起来。他和单链表不同的地方在于:单链表的每个结点的指向只有一个,双向链表每个结点有两个指向。双向链表结点结构体双向链表每个结点除了存储数据data外,还有两个指针记录上一个结点和下一个结点的地址,分别是前驱指针prev和后继指针next先附上老师的代码#include <stdio.h>#include <malloc.h>/** * Double linked list of intege原创 2022-05-02 13:41:54 · 210 阅读 · 0 评论 -
数据结构——单链表
单链表的定义 由于顺序表的插入删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它不要求在逻辑上相邻的两个元素在物理位置上也相邻。 单链表的特点:单链表不要求逻辑上相邻的两个元素在物理位置上也相邻,因此不需要连续的存储空间。 单链表是非随机的存储结构,即不能直接找到表中某个特定的结点。查找某个特定的结点时,需要从表头开始遍历,依次查找。 对于每个链表结点,除了存放元素自原创 2022-04-27 21:46:37 · 975 阅读 · 0 评论 -
数据结构—线性表
线性表原创 2022-04-25 19:47:23 · 621 阅读 · 0 评论