基本数据结构

1.数据结构与算法常见概念:

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构、树形结构、图形结构以及集合结构

线性结构 数据元素之间一对一的关系
树形结构 数据元素之间一对多的关系
图状结构或网状结构 结构中的数据元素之间存在多对多的关系
集合结构中的数据元素除了同属于一种类型外,别无其它关系。

数据结构的物理结构:数据的逻辑结构在计算机中的存储形式,分为顺序存储和链式存储(不连续存储)。

算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法五个基本特性:输入、输出、有穷性、确定性和可行性。
算法时间复杂度O(n):常数阶、线性阶、平方阶、对数阶、立方阶、nlogn阶、指数阶。
耗时排序:O(1)<O(logn)<O(n)<O(nlgn)<O(x2)<O(x3 )<O(2n)<O(n!)<O(nn )

2.数据结构:

2.1线性结构:

2.1.1 基本概念

线性结构:数据元素之间是一对一的关系。
线性表:零个或多个数据元素的有限序列。

区分数组长度线性表的长度
数组长度是指存放线性表的存储空间的长度,存储分配后这个值是不变的。
线性表的长度是线性表中数据元素的个数,随着线性表的插入与删除,这个值是在变换的。

2.1.2 两种存储结构–顺序和链式

线性表的顺序存储:用一段连续的存储单元依次存储线性表的数据元素。(通常使用一维数组实现顺序存储结构)

线性表的链式存储:除了存储本身的信息之外,还需存储一个指示后继的信息。

顺序存储和链式存储使用场景:如果频繁使用查找,很少进行插入和删除,易采用顺序存储。如果需要频繁插入和删除,易采用链式存储

2.1.3 顺序存储

把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。
用这种方法存储的线性表简称顺序表。是一种随机存取的存储结构。
顺序存储指内存地址是一块的,随机存取指访问时可以按下标随机访问,存储和存取是不一样的。
如果是存储,则是指按顺序的,如果是存取,则是可以随机的,可以利用元素下标进行。

数组比线性表速度更快的是:原地逆序、返回中间节点、选择随机节点。

插入:插入新结点,之后结点后移。平均时间复杂度:O(n)
删除:删除节点,之后结点前移。平均时间复杂度:O(n)

顺序存储的插入步骤
a.线性表长度大于等于数组长度,抛出异常
b.插入位置不合适,抛出异常(判断插入位置与0和最大值的大小)
c.从最后一个元素开始向前变量,将它们都向后移动一位
d.将要插入的元素填入指定位置
e.表长加一
顺序存储的删除步骤
a.线性表是否为空
b.删除位置不合适,抛出异常(判断插入位置与0和最大值的大小)
c.取出删除元素
d.从删除元素的位置遍历到最后一个元素位置,将它们前移一位
e.表长减一

2.1.3 链式存储–单链表,静态链表,循环链表,双向链表

用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
因此,链表中结点的逻辑次序和物理次序不一定相同。
为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址。data域是数据域,用来存放结点的值。next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。不需要事先估计存储空间大小。

单链表,含有data和next域。
头结点head指向开始节点。最后一个节点next=NULL
头插法建表(逆序)、尾插法建表(顺序)。
增加头结点的目的是算法实现上的方便,但增大了内存开销。
查找:只能从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。
判断一个单向链表中是否存在环的最佳方法是快慢指针。

静态链表:用一维数组来实现线性链表,这种用一维数组表示的线性链表,称为静态链表。
静态:体现在表的容量是一定的。(数组的大小);
链表:插入与删除同前面所述的动态链表方法相同。
静态链表中指针表示的是下一元素在数组中的位置。
静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。
动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。
静态链表在插入、删除时也是通过修改指针域来实现的,与动态链表没有什么分别

循环链表:是一种头尾相接的链表。其特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。
在单链表中,将终端结点的指针域NULL改为指向表头结点的或开始结点,就得到了单链形式的循环链表,并简单称为单循环链表。
由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p—>next是否为空,而是判断它们是否等于某一指定指针,如头指针或尾指针等。

双向链表:data,prior,next三个数据
这样就形成的链表中有两个方向不同的链。
双链表一般由头指针唯一确定的,将头结点和尾结点链接起来构成循环链表,并称之为双向链表。
在有序双向链表中定位删除一个元素的平均时间复杂度为O(n)
可以直接删除当前指针所指向的节点。而不需要像单向链表中,删除一个元素必须找到其前驱。
因此在插入数据时,单向链表和双向链表操作复杂度相同,而删除数据时,双向链表的性能优于单向链表

常见数据结构
数组:数组及基本操作
字符串:字符串及基本操作
链表:

串(String)是零个或多个字符组成的有限序列。
长度为零的串称为空串(Empty String),它不包含任何字符。
通常将仅由一个或多个空格组成的串称为空白串(Blank String)
注意:空串和空白串的不同,
例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。
串的表示和实现:
定长顺序存储表示。静态存储分配的顺序表。
堆分配存储表示。存储空间是在程序执行过程中动态分配而得。所以也称为动态存储分配的顺序表
串的链式存储结构。
串匹配:将主串称为目标串,子串称之为模式串。蛮力法匹配。KMP算法匹配。Boyer-Moore算法匹配。

高级结构:
队列:队列及基本操作
栈:栈及基本操作

2.2 树形结构

基本概念

树形结构:数据元素之间存在一对多的层次关系

度:结点拥有的子树数
叶结点/终端结点:度为0的结点
分枝结点:度不为0的结点(非终端结点);
结点层次:根结点的层定义为1;根的孩子为第二层结点,依此类推;
结点的度:结点子树的个数
孩子结点:结点的子树的根称为该结点的孩子;
双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;
兄弟结点:同一双亲的孩子结点;
堂兄结点:同一层上结点;

树的度:树内各结点的度的最大值
树的深度/高度:树中结点的最大层次
树结点:包含一个数据元素及若干指向子树的分支;

有序树:子树有序的树,如:家族树;
无序树:不考虑子树的顺序;

二叉树
满二叉树:每层都是满的
完全二叉树:最后一层,从左到右,可以不满
二叉查找树
平衡二叉树,AVL树,红黑树
B树(2-3树, B-树),B+树,B*树

Trie树
13、后缀树
14、区间树与线段树
15、败者树与胜者树

森林:互不相交的树集合;

二叉树的递归遍历
二叉树的遍历(递归)
二叉树的非递归遍历

2.3图形结构

图形结构:数据元素的多对多的关系

2.4集合结构

集合结构:数据元素除了同属于一个集合外,它们之间没有其他关系。

参考:
https://blog.csdn.net/weixin_43930512/article/details/90812460
https://blog.csdn.net/qq_31196849/article/details/78529724

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值