![](https://img-blog.csdnimg.cn/20200405184118442.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 98
此专栏为自己日常所记录的学习笔记,用来加深印象,便于日后复习。其内容图片多来源于网络。
diviner_s
数据科学与大数据技术专业,大三本科在读
展开
-
图——多对多
文章目录图的定义和术语图的类型定义图的存储结构图的定义和术语无向图:每条边都是无方向的有向图:每条边都是有方向的完全图:任意两个点都有一条边相连无向完全图:任意两点都有一条边,有n个顶点,n(n-1)/2条边有向完全图:任意两点都有两条边,有n个顶点,n(n-1)条边稀疏图:有很少边或弧的图(e < n logn)。稠密图:有较多边或弧的图。网:边/弧带权的图。邻接:有边/弧相连的两个顶点之间的关系。存在(vi,vj...原创 2020-06-27 09:49:56 · 1489 阅读 · 1 评论 -
一对多的美——数据结构之树和二叉树
数和二叉树树的定义树:是n(n≥0)个结点的有限集。若 n = 0,称为空树:;若 n > 0,则它满足如下两个条件;(1)有且仅有一个特定的称为根(Root)的结点;(2)其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3,···,Tm,其中每一个集合本身又是一棵树,并称为根的子树(SubTree)。树是n个结点的有限集树还有其他的表示方式:嵌套集合、广义表、凹入...原创 2020-04-14 14:07:57 · 781 阅读 · 0 评论 -
C++实现超全的基础排序算法都在这里啦|十大基础排序
插入排序基本思想:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入位置。基本操作:有序插入在有序序列中插入一个元素,保持序列有序,有序长度不断增加。起初,a[0]是长度为1的子序列。然后,逐一将a[1]至a[n-1]插入到有序子序列中。在插入a[1]前,数组a的前半段(a[0] ~ a[i-1])是有序段,后半段是a[i] ~ a[...原创 2020-02-25 13:57:18 · 2030 阅读 · 6 评论 -
邻接矩阵
文章目录邻接矩阵1. 数组(邻接矩阵)表示法无向图的邻接矩阵表示法有向图的邻接矩阵表示法有权图(网)的邻接矩阵表示法邻接矩阵的存储表示2.采用邻接矩阵表示法创建无向网邻接矩阵1111 1. 数组(邻接矩阵)表示法建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。设图A=(V,E)有n个顶点,则图的邻接矩阵是一个二位数组A.arcs[n][n],定义为:无向图的邻接矩阵表示法分析1:无向图的邻接矩阵是原创 2020-09-08 19:26:45 · 115029 阅读 · 19 评论 -
查找算法之二叉排序树
文章目录二叉排序树定义及性质二叉排序树的存储结构二叉排序树的递归查找查找分析二叉排序树平均查找长度二叉排序树定义及性质二叉排序树(Binary Sort Tree)又称为二叉搜索树、二叉查找树。定义:二叉排序树或是空树,或是满足如下性质的二叉树:(1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;(3)其左右子树本身又各是一棵二叉排序树二叉排序树的性质:中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字原创 2020-05-14 22:51:04 · 3029 阅读 · 0 评论 -
二叉树之线索二叉树基本操作(C++实现)
#include<iostream>using namespace std;typedef char TElemType; //TElemType 相当于 chartypedef struct BiThrNode{ TElemType data; struct BiThrNode *lchild,*rchild; //左右孩子指针 int LTag,RTag; //左右标志} BiThrNode,*BiThrTree;原创 2020-05-10 13:26:03 · 539 阅读 · 0 评论 -
二叉树之二叉排序树基本操作(C++实现)
#include<iostream>using namespace std;#define N 10000typedef int Status; // Status 相当于 int typedef int TElemType; //TElemType 相当于 int typedef struct BiTNode{ TElemType data; //结点数据域 stru原创 2020-05-10 13:21:18 · 1630 阅读 · 0 评论 -
二叉树应用之哈夫曼树、哈夫曼编码(C++实现)
哈夫曼相关定义及解释代码如下:#include<iostream>#include<cstring>using namespace std;typedef struct{ int weight; int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;//动态分配数组存储哈夫曼编码void select(HuffmanTree &a,int n, int &am原创 2020-05-09 11:21:47 · 1517 阅读 · 0 评论 -
最优二叉树——哈夫曼树|最佳编码——哈夫曼编码
哈夫曼树(最优二叉树)定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。路径:从树中一个结点到另一个结点之间得分支构成这两个结点间的路径。结点的路径长度:两结点间路径上的分支数。树的路径长度:从树根到每一个结点的路径长度之和。记作:TL...原创 2020-05-09 11:16:26 · 8488 阅读 · 0 评论 -
众树成森——森林与二叉树的转换、树与二叉树的转换、树和森林的遍历
树与二叉树的转换将树转化为二叉树进行处理,利用二叉树的算法来实现对树的操作。由于树和二叉树都可以用二叉链表作存储结构,则 以二叉链表作媒介可以导出树与二叉树之间的一个对应关系。由下图我们可以发现树和二叉树都可以相同的存储结构表示树????二叉树①加线:在兄弟之间加一连线②抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系③旋转:以树的根结点为轴心,将整树顺时针转45° 树...原创 2020-04-25 21:47:24 · 558 阅读 · 0 评论 -
树——组成层次结构的集合|双亲表示法、孩子表示法、孩子兄弟法
文章目录树1.双亲表示法孩子表示法孩子兄弟法(二叉树表示法,二叉链表表示法)树树(Tree)是n(n≧0)个结点的有限集。若n = 0,称为空树;若n > 0:(1)有且仅有一个特定的称为根(Root)的结点;(2)其余结点可分为m(m≧0)个互不相交的有限集T1,T2,T3,···,Tm;1.双亲表示法实现:定义数据结构存放树的结点,每个结点含两个域:数据域:存放节点本...原创 2020-04-24 21:27:15 · 959 阅读 · 0 评论 -
线索二叉树——解决无法找到特定结点的前去和后继的问题
线索二叉树在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。概念了解概念之前我们需要知道为什么需要线索二叉树;在一些日常问题中我们如果寻找特定遍历序列中二叉树结点的前驱和后继??解决方法:1.通过遍历寻找——费时间2.再增设前驱、后继指针域——增加了存储负担3.利用二叉...原创 2020-04-24 16:50:58 · 1501 阅读 · 0 评论 -
C++实现遍历二叉树的各种遍历操作| 函数模板拿走不送(带解释)!
C++代码如下:#include<iostream> using namespace std;typedef int Status; // Status 相当于 int typedef char TElemType; //TElemType 相当于 chartypedef struct BiTNode{...原创 2020-04-24 11:18:11 · 678 阅读 · 1 评论 -
遍历二叉树的具体算法实现与剖析
二叉树的建立按先序遍历序列建立二叉树的二叉链表1.从键盘输入二叉树的结点信息,建立二叉树的存储结构。2.在建立二叉树的过程中按照二叉树先序方式建立;【算法步骤】①扫描字符序列,读入字符ch②如果ch是一个“#”字符,则表明该二叉树为空树,即 T 为NULL;否则执行以下操作:申请一个结点空间 T将 ch 赋给T->data递归创建T的左子树递归创建T的右子树【算法描...原创 2020-04-22 14:24:38 · 580 阅读 · 0 评论 -
递归法和非递归法遍历二叉树
遍历二叉树遍历定义:顺着某一条搜索路径巡防二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)。 遍历目的:得到树中所有结点得一个线性排列。 遍历用途:它是树结构插入、删除、修改、查找和排序运算得前提,是二叉树一切运算得基础和核心。遍历方法:依次遍历二叉树中的三个组成部分,便是遍历了整个二叉树假设:L:遍历左子树 D:访问根结点 R:遍历右子树则遍历整个二...原创 2020-04-20 20:38:15 · 781 阅读 · 0 评论 -
一看就懂的知识点|数据结构之广义表
广义表广义表:(又称列表Lists)是n≥0个元素a₀ ,a₁,…,an-1的有限序列,其中每一个ai或者是原子,或者是一个广义表。广义表通常记作: LS = (a1,a2,…,an)其中,LS为表名,n为表的长度,每一个ai为表的元素。习惯上,一般用大写字母表示广义表,小写字母表示原子。表头:若LS非空(n≥1),则其第一个元素a1就是表头。记作head(LS)= a1。注:表头可...原创 2020-04-08 22:41:06 · 3070 阅读 · 0 评论 -
数据结构之数组|特殊矩阵压缩
数组数组:按一定格式排列起来的,具有相同类型的数据结构的集合。一维数组一维数组:若线性表中的数据元素为非结构的简单元素,则称为一位数字。一维数组的逻辑结构:线性结构。定长的线性表。声明格式:数据类型 变量名称[长度];例:int num[5] = {0,1, 2, 3, 4};二维数组二维数组:若一维数组中的数据元素中的又是一维数组结构,则称为二维数组。二维数组的逻辑结构:1...原创 2020-04-07 16:10:27 · 798 阅读 · 0 评论 -
数据结构概念_时间复杂度_空间复杂度概念
数据结构基础概念(C语言)程序=算法+数据结构数据结构数据结构(data structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。这里只进行对基础概念和知识点的表述定义数据(Data):所有能输入到计算机中并被计算机处理的符号的总称。数据元素(Data Element):数据的基本单位,在计算机中通常作为一个整体进行考...原创 2020-01-09 13:10:14 · 5158 阅读 · 4 评论 -
线性表概念_线性表的顺序表表示和实现_线性表的顺序存储
线性表基础概念,线性表的顺序表表示和实现线性表线性表(linear list)是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。特征线性表是具有相同特征的数据元素的一个有限序列。线性表(linear list)由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列线性表中元素的个数n(n...原创 2020-01-15 09:13:13 · 4920 阅读 · 1 评论 -
C++实现顺序表基本操作
此代码按照上篇博客线线性表基础概念,顺序表实现将概念用代码实现#include<stdio.h>#include<iostream>using namespace std;//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBL...原创 2020-01-15 17:00:26 · 3408 阅读 · 1 评论 -
单链表基础概念,线性表的链式表示和实现,单链表基本操作的实现
单链表基础概念单链表单链表(Singly Linked List)是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。特点用一组...原创 2020-01-17 16:39:34 · 4203 阅读 · 2 评论 -
C++实现单链表基本操作
C++实现单链表基本操作本博客按照上篇博客线性表单链表的基本操作而写出的完整代码,详情请看单链表基础概念#include<iostream>using namespace std;//函数结果状态代码#define OK 1#define ERROR 0typedef int Status; // Status 相当于 int typedef ...原创 2020-01-18 09:51:40 · 5586 阅读 · 1 评论 -
双向链表,顺序表和链表的比较,线性表的应用,链表的合并,多项式的运算
线性表的应用双向链表在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表双向链表结点结构:双向链表的结构可定义如下:typedef struct DuLNode{ ElemType data; struct DuLnode *prior , *next;}DuLNode,*DuLinkList; 图示:...原创 2020-01-21 17:07:22 · 1063 阅读 · 0 评论 -
栈,顺序栈,链栈的基础概念
栈——后进先出栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈的定义栈(stack):是限定仅在表尾进行插入或删...原创 2020-02-02 23:50:32 · 3754 阅读 · 1 评论 -
队列,循环队列,链队列的基础操作
队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的抽象数据类型定义:ADT Queue{数据对象:D={ai | ai∈ElemSet,i=1,2,…,n,n≥0}数据关系:R={< a(i-1) , ai ...原创 2020-02-03 14:34:18 · 4036 阅读 · 1 评论 -
串的类型定义、存储结构及其运算
串的类型定义、存储结构及其运算串的定义——内容受限的线性表串(string)——零个或多个任意字符组成的有限序列子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串。例如,“abcd”的子串有:""、“a”、“ab”、“abc”、“abcd”、“bc”等真子串:是指不包含自身的所有子串。主串:包含子串的串相应地称为主串。字串位置:字符在序列中的序号为该字符在串中的位置...原创 2020-02-04 13:14:23 · 1727 阅读 · 1 评论 -
BF算法暴力破解法——串模式匹配算法
BF算法BF算法,即暴风(Brute-Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。Brute-Force简称为BF算法,亦称为简单匹配法。采用穷举的思路。算法...原创 2020-02-04 12:28:55 · 2282 阅读 · 2 评论 -
KMP算法及其优化——串模式匹配算法
KMP(Knuth Morris Pratt)算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算...原创 2020-02-05 16:00:24 · 2478 阅读 · 2 评论