数据结构(严蔚敏版复习)
文章平均质量分 85
qqssss121dfd
practice,practice,practice,excellent .
展开
-
队列数据结构
以下内容主要参考了严蔚敏版的数据结构教材 和栈相反,队列是一种先进先出的数据结构,它只允许在队列的一端进行插入操作,也就是入队列,在另一端进行删除操作,也就是出队列。允许插入的一端叫做队列尾,允许删除的一端叫做队列头。这种数据结构就和我们平时日常生活中排队进行某种活动相似,先来的排在队伍前面的人可以先进行活动,后来的人只能加在队伍的尾部排队。队列的简单示意图如图1所示。队列也是一种线性表。原创 2022-02-20 15:18:08 · 808 阅读 · 0 评论 -
数据结构栈的应用:括号匹配、迷宫求解
以下内容主要参考了严蔚敏版的《数据结构》教材,对自己也算是一个加强复习。 当我们在写代码的时候,经常会用到括号:小括号()()(),中括号[][][],大括号{}\{\}{},比如在ififif语句的条件判断中:/*简单的括号表达式*/if(state1){ operation1;}else{ operation2;}/*复杂的括号表达式*/if(((s原创 2021-12-19 16:42:40 · 926 阅读 · 0 评论 -
迭代,递归,回溯,P问题,NP问题,NP 完全问题,NP难问题,贪心,动态规划,Divide and Conquer
qwqw原创 2021-11-21 14:37:14 · 1086 阅读 · 0 评论 -
栈数据结构基础介绍
以下内容主要参考了严蔚敏版的《数据结构》教材,对自己也算是一个加强复习。 从数据结构的角度看,栈也是线性表,只不过是操作受限的线性表,其基本操作是线性表操作的子集。栈是限定仅仅在表尾进行插入或删除的线性表,表尾称为栈顶,表头称为栈底,不含元素的栈称为空栈。 对于栈S={a1,a2,...,an}S=\{a_1,a_2,...,a_原创 2021-07-18 17:13:00 · 264 阅读 · 0 评论 -
线性表的应用:一元多项式的表示及其相加
以下内容主要参考了严蔚敏版的数据结构教材,仅为加强学习,不做其他用途。 一元多项式pn(x)=p0+p1x+p2x2+...+pnxnp_n(x)=p_0+p_1x+p_2x^2+...+p_nx^npn(x)=p0+p1x+p2x2+...+pnxn一共有n+1n+1n+1个系数,在计算机中可以用线性表来表示。每一个节点的数据域存储每一项的系数:第0个节点存储系数p0p_0p0原创 2021-07-11 15:15:02 · 1117 阅读 · 1 评论 -
算法效率的度量和渐进时间复杂度的分析
什么是算法(AlgorithmAlgorithmAlgorithm)?算法对于任何合法的输入,能够在有限的时间里获取满足一定要求的输出。它是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。如图1所示。那怎样的算法才算是好的算法,一般不外乎两点:时间效率:算法获取满足一定要求的输出所需的时间越少越好。空间效率:除了输入输出所需要的额外的存储空间越少越好。 图1. &原创 2021-03-28 16:16:49 · 571 阅读 · 0 评论 -
广义表(Generalized Lists)
以下内容主要参考了严蔚敏版的数据结构教材。 以下内容主要参考了严蔚敏版的数据结构教材。原创 2020-09-21 15:53:58 · 1721 阅读 · 0 评论 -
最优查找树
以下内容主要参考了严蔚敏版的数据结构教材。 对于一个已经有序的序列{k0,k1,k2,...,kn−1}\{k_0,k_1,k_2,...,k_{n-1}\}{k0,k1,k2,...,kn−1},各关键字对应的权值分别为{w0,w1,w2,...,wn−1}\{w_0,w_1,w_2,...,w_{n-1}\}{w0,w1,w2,...,wn−1},需要构建一颗二叉树使得原创 2020-08-25 18:50:13 · 2283 阅读 · 0 评论 -
基数排序
以下内容主要参考了严蔚敏版的数据结构教材。 基数排序利用了多关键字排序的思想。有些关键字,比如三位的十进制数123123123可以看成是由三个关键字组成的复合关键字,个位,十位和百位分别可以看成一个关键字。对于关键字为三位十进制数的记录,百位的优先级最高,十位次之,个位最低。基数排序的基本操作是“分配”和“收集”。具体操作为从复合关键字中优先级最低的单个关键字开始,将该单关键字相同的复合关原创 2020-08-21 19:38:20 · 194 阅读 · 0 评论 -
归并排序
以下内容主要参考了严蔚敏版的数据结构教材。 归并排序的基本思想是将两个或多个有序序列组合成一个新的有序序列。下面的代码以及讲解以将两个有序序列组合成一个新的有序序列为例,即两路归并排序。具体做法是首先将待排序的序列中的n个记录当成n个有序的子序列,然后两两合并得到n2\frac{n}{2}2n个有序的子序列。然后再两两合并得到n4\frac{n}{4}4n个有序的子序列。以此类推直到得原创 2020-08-17 13:52:30 · 154 阅读 · 0 评论 -
希尔排序
以下内容主要参考了严蔚敏版的数据结构教材。 希尔排序又称为缩小增量排序。它也是对直接插入排序直接插入排序的一种改进。它基于以下两点对直接插入排序进行改进,使得希尔排序的时间复杂度较直接插入排序有一定改进。当待排序元素较少时,直接插入排序的效率较高。当待排序元素基本有序时,直接插入排序的效率较高。 希尔排序首先根据一定的增量原创 2020-08-16 17:58:36 · 166 阅读 · 0 评论 -
表插入排序
以下内容主要参考了严蔚敏版的数据结构教材。 #define MY_MAXIMUM 1000000#define TABLE_SIZE 10/* Function to print an array */void printArray(int arr[], int size){ int i; for (i = 0; i < size; i++) cout <&原创 2020-08-16 15:43:08 · 3148 阅读 · 0 评论 -
2路插入排序
一下内容主要参考了严蔚敏版的数据结构教材。 2路插入排序是对折半插入排序的进一步改进。它减少了折半插入排序中记录的移动次数,但是它需要和带排序的记录序列k0,k1,k2,...,kn−1k_0,k_1,k_2,...,k_{n-1}k0,k1,k2,...,kn−1同样大小的n个记录空间(数组d)。具体做法是:首先将k0k_0k0复制到d[0]d[0]d[0],并将d[0]d[0原创 2020-08-14 09:10:55 · 2184 阅读 · 1 评论 -
折半插入排序
直接插入排序算法简便且容易实现。当待排序记录的数量很小时,这是一种很好的排序方法。但是通常待排序序列中的记录数量很大,则不宜采用直接插入排序。直接插入排序的主要操作是比较和移动记录,我们可以从减少这两种操作的数量上来改进直接插入排序。 每次在一个有序的子序列中插入一个新的元素时,我们没有必要一个记录一个记录的去比较来寻找新插入的元素的插入位置,我们可以利用二分搜索的思想快速的去寻找待插入的原创 2020-08-12 16:00:23 · 888 阅读 · 0 评论 -
直接插入排序
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的记录增加1的有序表。 对于有n个元素的初始序列k0,k1,k2,...,kn−1k_0,k_1,k_2,...,k_{n-1}k0,k1,k2,...,kn−1,整个排序过程进行n−1n-1n−1趟插入。第一趟插入时将元素k0k_0k0看成是一个有序的子序列,然后将元素k1k_原创 2020-08-12 14:54:52 · 4706 阅读 · 1 评论 -
冒泡排序&快速排序
冒泡排序和快速排序都是一类借助交换进行排序的方法,快速排序是比较简单的一种。 冒泡排序首先将第一个记录的关键字和第二个记录的关键字进行比较,如果第一个记录的关键字大于第二个记录的关键字则将这两个记录的位置进行交换。然后比较第二个记录的关键字和第三个记录的关键字并进行同样的操作。直到比较完第n−1n-1n−1个记录的关键字和第nnn个记录的关键字,以上过程称为第一趟冒泡排序,它使得n个记录中原创 2020-08-12 10:27:06 · 1084 阅读 · 0 评论 -
堆排序
以下内容主要参考了严蔚敏版的数据结构教材。 对于n个元素的序列{k0,k1,k2,...kn−1}\{k_0,k_1,k_2,...k_{n-1}\}{k0,k1,k2,...kn−1},如果ki<=k2i+1k_i<=k_{2i+1}ki<=k2i+1且ki<=k2i+2k_i<=k_{2i+2}ki<=k2i+2(小堆)或者ki>原创 2020-08-08 15:44:07 · 182 阅读 · 0 评论 -
键树
键树又称为数字查找树(Digital Search Tree)。它是一颗度大于等于二的树,树中的每个节点不是包含一个或几个关键字,而是只含有组成关键字的符号。如果关键字是字符全是小写26个英文字母的单词,则节点中只包含一个小写字母字符。一个包含四个关键字{"cha","chao","che","la"}\{"cha","chao","che","la"\}{"cha","chao","che","la"}的键树如图1所示,字符$表示关键字的结束。原创 2020-08-06 14:37:21 · 1174 阅读 · 0 评论 -
B-树与B+树
dsgdsg原创 2020-07-26 17:35:11 · 271 阅读 · 0 评论 -
回溯法和树的遍历
以下内容主要参考了严蔚敏版的数据结构教材。 回溯法是求解某些计算问题的全部或部分解的通用算法,特别是带有限制条件的计算问题。它通过不断的产生完全解的片段并不断增长完全解的片段Backtracking is a general algorithm for finding all (or some) solutions to some computational problems, nota原创 2020-06-30 10:16:25 · 1425 阅读 · 0 评论 -
赫夫曼树和赫夫曼编码
以下内容主要参考了严蔚敏版的数据结构教材。 赫夫曼树又叫做最优树,是一类带权路径长度最短的树,这里讨论的是最优二叉树。 假设现在有n个权值w1,w2,...,wnw_1,w_2,...,w_nw1,w2,...,wn,如何构造一颗有n个叶子节点的二叉树使得二叉树的带权路径长度(∑k=1nwk∗lk\sum_{k=1}^n w原创 2020-06-26 19:27:31 · 272 阅读 · 0 评论 -
无向图的关节点和重连通分量
以下内容主要参考了严蔚敏版的数据结构教材。using namespace std;//图的邻接表表示//弧节点class GraphArcNode{private: int weight; int adjVertexIndex; GraphArcNode* nextArcNode;public: GraphArcNode(int d = 0, int index = 0) { weight = d; adjVerte原创 2020-06-23 19:16:50 · 1026 阅读 · 1 评论 -
无向图的最小生成树
以下内容主要参考了严蔚敏版的数据结构教材#define MY_INFINITY 1000000//图的数据结构class MGraph{private: vector<vector<int>> adjMatrix; vector<int> nodeData; int nodeNum;public: MGraph(int num) { nodeNum = num; nodeData原创 2020-06-20 16:25:09 · 4180 阅读 · 0 评论 -
有向图的强连通分量
以下内容主要参考了严蔚敏版的数据结构教材 以下算法求有向图的每一个强连通分量中的节点并把一个强连通分量中的所有节点放在一个集合中。 图1. 图1.//图的十字链表表示//弧节点class GraphArcNode{private: int weight; int tailIndex; int headIndex; GraphArcNode* nextTailA原创 2020-06-18 09:30:28 · 390 阅读 · 0 评论 -
无向图的连通分量和生成树
//图的邻接表表示//弧节点class GraphArcNode{private: int weight; int adjVertexIndex; GraphArcNode* nextArcNode;public: GraphArcNode(int d = 0, int index = 0) { weight = d; adjVertexIndex = index; nextArcNode = nullptr; } void setNextArcNode(GraphArc原创 2020-06-15 20:04:17 · 5729 阅读 · 0 评论 -
串的模式匹配算法(KMP)
以下内容主要参考与严蔚敏版的数据结构教材。 假设现在有一个主串s和一个子串t(模式串),通常主串的长度要大于子串的长度。在主串中找到和子串一样的子串并返回主串中找到的那个子串的第一个字符在主串中的位置叫做模式匹配。一个简单的例子如图1所示。 图1. 串的模式匹配的基本算法在开始的时候,在主串中索引iii指向pospospos原创 2020-06-12 20:05:06 · 880 阅读 · 0 评论 -
图的最短路径
以下内容主要参考了严蔚敏版的数据结构教材。 最短路径算法用来计算网络中两个节点之间的最短路径。在现实生活中网络可以是全国的交通网络,网络的节点是各个城市,节点之间的边的权值是城市之间的距离。这时最短路径算法可以用来规划由出发城市到目的城市的距离最短的路线。下面要介绍的是DijkstraDijkstraDijkstra算法(计算有向带权图中某一节点到其它所有节点的最短路径)和FloydFlo原创 2020-06-07 17:24:15 · 429 阅读 · 0 评论 -
图的遍历
以下内容主要参考了严蔚敏版的数据结构教材 从图中某一顶点出发遍访图中其余各节点,且使图中每一节点仅被访问一次,这一过程叫做图的遍历。图的遍历主要分为深度优先遍历(Depth First Search,DFS)和广度优先遍历(Broadth First Search,BFS) 深度优先遍历从图中某个顶点V1出发,访问并标记该节点。然原创 2020-06-03 10:21:43 · 760 阅读 · 0 评论 -
拓扑排序与关键路径(有向无环图的应用)
用顶点表示活动,用弧表示活动之间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV网。这种网可以用来表示一个施工流程图、一个产品的生产流程或者是某个专业的必修课程前后顺序关系。在AOV网中由一个顶点A指向另一个顶点B的箭头表示活动A必须在活动B开始之前完成,活动B也只有在活动A完成之后才能开始。在AOV网中不应该出现环,因为环意味着某项活动以自己为先决条件,显然这是荒谬的。如果设计出这样的工程原创 2020-06-01 19:40:01 · 698 阅读 · 0 评论 -
平衡二叉搜索树的插入与删除
以下内容主要参考了严蔚敏版的《数据结构》教材,但是教材里面只介绍了插入操作没有介绍删除操作,刚好在这篇文章里面有介绍删除操作且他好像也是参考严蔚敏版的《数据结构》教材里面的内容,因此我的删除操作主要参考于他这篇文章。 对于class BinarySearchNode{private: int data; int balanceFactor; BinarySearchNode*原创 2020-05-27 20:13:05 · 683 阅读 · 0 评论