数据结构与算法
ChanCherry、
信安小白,欢迎大家多多交流! CSDN大多数时候好像用来记笔记[捂脸]
个人博客:https://chancherry.github.io/
有事可以Q我3324838931
展开
-
哈希(散列)表、哈希函数基本知识
哈希表这些查找方法的特点:记录在表中的位置和其关键字间不存在确定关系,查找的过程为给定值依次和各个关键字进行比较,查找的效率取决进行比较的关键字个数。它们的平均查找长度(ASL)都不为0.若希望ASL=0方法:预先知道所查关键字在表中的位置。即:记录在表中位置和其关键字之间的确定关系。在一般情况下,需在关键字和记录在表中的存储位置之间建立一个函数关系,以f(key)作为关键字为key的记录在表中的位置,通常称这个函数f(key)为哈希函数。哈希函数是一个映像,即:将关键字的集合映射到某个地址集原创 2020-06-17 14:08:44 · 1209 阅读 · 0 评论 -
期末复习——递归和分治算法
分治算法分治法是算法设计领域一种非常重要的算法设计策略。分治法,顾名思义就是用我们平常所说的“分而治之”的思想来解决复杂的、难以直接解决的问题。如:Hanoi塔问题。许多著名算法都是采用了分治法的算法思想,如:排序算法中的快速排序算法、归并排序算法、查找算法中的折半查找算法、著名的大整数相乘算法、棋盘覆盖、Hanoi塔算法。常常在使用分治法的时候也会用到递归,所以常说分治法和递归是一对孪生兄弟。适用分治法解决的问题所应具备的基本特征问题应该可以分解成为规模较小的子问题,也就是说分解的原创 2020-06-12 15:29:27 · 450 阅读 · 0 评论 -
期末复习——表达式求值问题
问题分析确定计算规则,即明确运算符的优先级->要考虑相邻两个算符的优先级确定当前处理字符是运算符还是操作数每个运算符的运算次序要由它之后的一个运算符来定算法思路设立操作数栈与运算符栈;设表达式的结束符为“#”,预设运算符栈的栈底为“#”;若当前字符是操作数,则直接压入操作数栈;若当前字符是运算符,且运算符的优先级高于栈顶运算符则进栈;否则,从操作数栈中弹出两个操作数并弹出运算符栈的栈顶运算符,经计算后将结果压入操作数栈。...原创 2020-06-12 10:44:13 · 299 阅读 · 0 评论 -
期末复习——队列的概念及应用
队列的概念队列:限定所有的插入操作在表的一端进行,而删除操作在表的另一端进行的线性表。允许进行插入操作的一端称为队尾(rear),允许进行删除操作的一端称为队头(front)。特点:先进先出队列的基本操作队列初始化:InitQueue(q)初始化一个空队;入队操作:InQueue(q,x)对已存在的队列q,插入一个元素×到队尾。操作成功,返回值为TRUE,否则返回值为FALSE;出队操作:OutQueue(q,x)删除队首元素,并返回其值。操作成功,返回值为TRUE;读队头元素:F原创 2020-06-12 10:23:13 · 640 阅读 · 0 评论 -
期末复习——一元多项式的表示及运算
一个一元多项式pn(x)可按升幂的形式写成:pn(x) = p0+p1X+p2X2+p3X3+…+pnXn可以用线性表存储:(p0,p1,p2,…,pn)例:2+x5+10x100可以只存储非0项,用单链表存储多项式的结点结构:typedef struct Polynode{ int coef; int exp; Polynode *next;}Polynode,*Polylist;两个多项式相加A(x) = 7+3x+9x8+5x17B(x) = 8x+22x7-9x8定原创 2020-06-12 07:23:24 · 1638 阅读 · 0 评论 -
期末复习——双向链表
双向链表在单链表的每个结点里再增加一个指向其前趋的指针域prior。这样形成的链表中就有两条方向不同的链,我们称之为双(向)链表。结构定义:typedef struct DNode{ ElemType data; struct DNode*prior,*next;}DNode,*DoubleList;双向链表示意图前插操作算法int Dlinklns(DoubleList L, int i, ElemTypee){ DNode *s,*p; ... ... s=(DN原创 2020-06-12 00:27:02 · 307 阅读 · 0 评论 -
期末复习——循环链表
应用实例 约瑟夫环问题约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的。这个问题最初的原型是约瑟夫在公元70年的时候,在抗击罗马的战斗中一直进行顽强的抵抗,守住了裘达伯特城达47天之久,最后城市沦陷以后,他和四十多名将士就躲在一个洞穴里,当时大家都非常顽强说:“要投降,吾宁死”,后来约瑟夫就想了一个办法,我们每个人把旁边的一个人杀死,轮流的杀死,杀死的顺序由抽签来决定,最后他抽到了最后一签,但他也没杀死他旁边的这个人,他们两个人一起活了下来,然后投降了罗马。约瑟夫环原创 2020-06-11 20:39:17 · 357 阅读 · 0 评论 -
期末复习——单链表及其基本操作
单链表的概念定义:采用链式存储结构的线性表称为链表。从实现角度可以分为:静态链表、动态链表;从链接方式可以分为:单链表、双向链表、循环链表;单链表:链表中的每一个结点只有一个指针域。单链表包括两个域:数据域:用来存储结点的数据值;指针域:用来存储数据元素的直接后继的地址。结点的定义:typedef struct Node{ ElemType data; struct Node *next;}LNode,*LinkList;基本操作单链表建立有时为了操作方便,在单链表原创 2020-06-09 11:15:54 · 653 阅读 · 0 评论 -
期末复习——线性表的概念及顺序存储
之前学的时候没太在意,现在期末复习的时候还是做一下笔记吧,不然内心有点不安φ(..)线性表的概念定义:线性表是由n(n≥0)个类型相同的数据元素a1,a2,…,an组成的有限序列,记作(a1,a2,…,an)。数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后驱。特点:同一性:线性表由同类数据元素组成,每一个ai必须属于同一数据对象。有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数。有序性:线性表中相邻元素之间存在着序偶关系<ai,a.原创 2020-06-09 10:09:43 · 812 阅读 · 0 评论 -
经典排序算法
算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。...原创 2020-06-07 09:30:21 · 804 阅读 · 0 评论 -
二叉排序树相关笔记
二叉排序树的基本概念和查找定义:二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:①若它的左子树不空,则左子树上所有结点的值均小于根结点的值;②若它的右子树不空,则右子树上所有结点的值均大于根结点的值;③它的左、右子树也都分别是二叉排序树。二叉排序树的定义是一个递归定义的过程。保证小于根结点值的结点都落在左子树上,而大于根结点值的结点都落在右子树上。查找步骤:①若给定值等于根结点的关键字,则查找成功;②若给定值小于根结点的关键字,则继续在左子树上进行查找;③若给定值大于根结点的关键字原创 2020-05-20 07:50:08 · 858 阅读 · 0 评论 -
数据结构中的查找(顺序查找、折半查找、分块查找)
查找,就是根据给定的某个值在一组记录集合中确定某个“特定的”数据元素(记录)或者找到属性值符合特定条件的某些记录。查找表是由同一类型的数据元素(或记录)构成的集合。关键字:是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。主关键字:可以识别唯一的一个记录的关键字。次关键字:可以识别若干记录的关键字。对查找表常进行的操作:(1)查询某个“特定的”数据元素是否在查找表中(2)检索某个“特定的”数据元素的各种属性(3)在查找表中插入一个数据元素(4)从查找表中删去某个原创 2020-05-18 10:55:51 · 12096 阅读 · 2 评论 -
图的单源最短路径(Dijkstra算法)
Dijkstra算法思想带权图的最短路径从某顶点(源点)出发到另一顶点(目的点)的路径中,有一条各边(或弧)权值之和最小的路径称为最短路径。从单源点到其余各点的最短路径——迪杰斯特拉算法(Dijkstra)每一对顶点之间的最短路径——弗洛伊德算法(Floyd)Dijkstra算法基本思想:依最短路径的长度递增的次序求得各条路径。路径长度最短的最短路径的特点:在这条路径上,必定只含一条弧,并且这条弧的权值最小。(设为v0→vK)下一条路径长度次短的最短路径的特点:它只可能有两种情况:或者原创 2020-05-17 22:43:50 · 1696 阅读 · 0 评论 -
图的关键路径
图的关键路径思想AOE网是指在有向网中,如果用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,则称这样的有向网为弧表示活动的网(Acticity On Edge,AOE-网)。对仅有一个开始点和一个完成点的工程,可用AOE-网来表示,它可用来估算工程的完成时间。网中仅有一个入度为0的顶点称为源点,表示工程的开始;仅有一个出度为0的顶点称为汇点,表示工程的结束。只有在进入某一顶点的各有向边所代表的活动均已完成,该顶点所代表的事件才能发生;只有在某顶点所代表的事件发生后,从该顶点发出的所原创 2020-05-17 09:52:44 · 2902 阅读 · 0 评论 -
图的拓扑排序
算法思想按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列。显然对于有回路的有向图得不到拓扑有序序列,因为有回路的话,顶点的先后次序就不确定了。例如,下图,我们可以人为限定次序:A B C D 或 A C B D如何进行拓扑排序?从有向图中选取一个没有前驱(没有在它之前活动)的顶点,输出之;从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶原创 2020-05-17 08:18:25 · 3053 阅读 · 0 评论 -
图的最小生成树算法
生成树:一个连通图的生成树是指一个极小连通子图,含有图中的全部n个顶点,但只有足以构成一棵树的n-1条边。构造网的一棵最小生成树,即:在e条带权的边中选取n-1条边,不构成回路,使“权值之和”最小。最小生成树要解决的问题:尽可能选取权值小的边,但不能构成回路;选取n-1条恰当的边以连接网的n个顶点。Prim算法(普里姆算法)Prim算法思想取图中任意一个顶点v作为生成树的根,之后往生成树上添加新的顶点w,注意添加的这个顶点要使该边的权值在所有连通顶点v和w之间的边中取值最小。之后继续往生成原创 2020-05-17 00:54:21 · 2761 阅读 · 0 评论 -
图的基础知识(二)——深(广)度优先遍历
图的深度优先遍历深度优先搜索基本思想从图中某个顶点V0出发,首先访问V0;找出刚访问过的顶点的第一个未被访问的邻接点,然后访问该顶点。以该顶点为新顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止;返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点,然后执行步骤2。若是非连通图,则图中一定还有顶点未被访问,要从图中另选一个未被访问的顶点作为起始点,重复上述过程。例如,连通图:大致流程是这样的:先访问一个顶点,然后访问它的一个邻接点,然后原创 2020-05-12 11:16:27 · 723 阅读 · 0 评论 -
图的基本知识(一)
图的基本概念图是一种较线性表和树更为复杂的数据结构。在线性结构中,数据元素之间仅存在线性关系。在树型结构中,数据元素之间存在明显的一对多的层次关系。图的结构定义图是由顶点集V和弧集R构成的数据结构。Graph = (V,R)其中,V={ | v∈DataObject},R={V,R}VR={<v,w> | P(v,w)且(v,w∈V) }<v,w>表示从v到w的一条弧,并称v为弧尾,w为弧头。谓词P(v,w) 定义了弧<v,w>的意义或信息,表示从v到原创 2020-05-12 09:04:28 · 582 阅读 · 1 评论 -
找素数几种方法(埃式筛法/线性筛法)
一、判断素数最简单思路:所有可能的因数全部试一遍。int su(int n){ for(int i=2;i<=n;i++) if(n%i==0) return 0;//有因数就不是素数 return 1;} 进一步思考:没必要枚举所有的数,每一个小于n(1/2)的因数i,一定有一个大于n(1/2)的因数j与之对应,也就是使i*j=n,所以枚举小于等于n(1/2)的因数即可...转载 2020-04-28 09:52:31 · 918 阅读 · 1 评论 -
解空间树及其相关算法
面对许多实际问题时,需要求解满足特定条件的全部解或最优解,如著名的N皇后问题和旅行售货员问题。此类问题,一般没有特定的计算规则用于解题,通常我们采用试探性的方法,在包含问题所有可能解的解空间树中,将所有可能的结果搜索一遍,从而获得我们期望的那一个解,或者是那一些解,一般就是满足一定条件的最优解,或是全部解。那么这里用到的解空间树是什么呢?解空间树与回溯法解空间树:依据待解问题的特性,用树结...原创 2020-04-18 17:27:12 · 13264 阅读 · 0 评论 -
哈夫曼编译码
在信息传输等实际应用中,需将文本中出现的字符进行二进制编码,传输过后,又要将二进制码翻译为原先的字符,这就是典型的编码与译码问题。在编码的设计中,通常遵守两个原则:(1)编码能够唯一的被译码;(2)编码长度要尽可能的短。利用哈夫曼树可以得到平均长度最短的编码,因此,在信息传输、数据压缩等方面,哈夫曼树有着广泛的应用。相关概念等长编码:每个字符的编码长度相同。不等长编码:使用频率高的...原创 2020-04-11 15:08:08 · 3507 阅读 · 1 评论 -
哈夫曼树の小记
哈夫曼树,又称最优二叉树,它是树的带权路径长度值为最小的一棵二叉树,可用于构造最优编码,在信息传输、数据压缩等方面有着广泛的应用。0x00 相关概念1、路径树中一个结点到另一个结点之间的分值序列。2、路径长度路径上分支的条数。3、结点的权给结点赋予的数值。4、带权路径长度结点的权值与该结点5、树的带权路径长度树中所有叶子结点的带权路径长度之和,记为WPL(只计算叶子结点)...原创 2020-04-11 13:23:50 · 872 阅读 · 2 评论 -
二叉树の小记
二叉树的性质1、二叉树的第i层上至多有2i-1个结点。2、深度为k的二叉树上至多含2k-1个结点(k>1)。3、对任何一棵二叉树,若它含有n0个叶子节点,n2个度为2的结点,则必存在n0=n2+1。证明:设二叉树上结点总数n= n0 + n1 + n2,而n= b+1,二叉树上分支总数b= n1+2n2,由此,n0= n2+1特殊的二叉树(1)满二叉树深度为k且含有2k-1个结...原创 2020-04-11 10:01:05 · 623 阅读 · 0 评论 -
归并排序算法(C语言版本)
基本思想归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分成一些小的问题然后进行递归求解,而治的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。实现过程分而治之归并排序将待排序数组分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得...原创 2020-03-23 22:28:29 · 4824 阅读 · 2 评论 -
时间复杂度基础知识
算法性能分析评价算法的标准:一般来说,评价一个算法的好坏就是看它的时间和空间,因为空间现在的内存都很大,考虑的比较少,我们主要考虑算法的时间复杂度怎样进行度量。问题的规模N定义:问题规模N与该算法在运行时所占的空间S与所耗费的时间T有关。对不同的问题其含义不同:对矩阵是阶数;对多项式运算是多项式项数;对图是顶点个数;对集合运算是集合中元素个数。衡量算法效率的方法:(1)事后统...原创 2020-03-23 10:12:46 · 805 阅读 · 0 评论 -
特殊矩阵的压缩存储(节约内存空间)
边看网课边记的笔记,比较简单,以后遇到详细的再补充,也欢迎大家评论补充!特殊矩阵简介存储方案三角矩阵和带状矩阵:顺序存储;稀疏矩阵:(1)三元组顺序表(顺序存储) (2)十字链表(链式存储)1. 三角矩阵三角矩阵分为上三角矩阵和下三角矩阵,只需要存储非零元素。第i行有i个非零元素。于是我们可以得到:LOC(i,j) = LOC(1,1) + 前i-1行非零元素个数*size...原创 2020-03-20 11:44:05 · 868 阅读 · 0 评论 -
栈的基础知识
定义作为一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行。表中允许进行插入、删除操作的一端称为栈顶,表的另一端被称为栈底。栈的插入称为进栈或入栈,删除操作称为出栈或退栈。特点:后进先出存储结构(1)顺序栈顺序存储结构实现,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。C语言描述:#...原创 2020-03-12 16:02:08 · 713 阅读 · 0 评论 -
串的基础知识
定义串:是由0个或多个字符组成的有限序列,又叫字符串。S=‘a1a2…an’(n>=0)空串:长度n=0的串,不包含任何字符。空格串:是仅由一个或多个空格组成的串,长度>=1。子串:串中任意个连续的字符组成的子序列。主串:包含子串的串相应的称为主串。位置:字符在序列中的序号,子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。相等:两个串的长度相等,并且对应位置的...原创 2020-03-12 16:02:30 · 1691 阅读 · 0 评论 -
数据结构的分类
数据结构(Data Structure):是指相互之间存在一种或多种特定关系的数据元素集合,是带有结构的数据元素的集合,它指的是数据元素之间的相互关系,即数据的组织形式。从逻辑结构来分数据结构可分为线性结构和非线性结构:线性结构线性结构又可以继续细分为:顺序表、链表、栈和队列、串、数组和广义表。非线性结构非线性结构可以分为集合、树(二叉树)、图。从存储结构来分一个数据结构在计算...原创 2020-02-20 18:52:33 · 8245 阅读 · 2 评论