数据结构知识点总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构知识点总结相关的知识,希望对你有一定的参考价值。

参考技术A

线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。是随机存取的顺序存储结构。顺序存储指内存地址是一块的,随机存取指访问时可以按下标随机访问,存储和存取是不一样的。

用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑次序和物理次序不一定相同。

队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。先进先出。

串(String)是零个或多个字符组成的有限序列。长度为零的串称为空串(Empty String),它不包含任何字符。通常将仅由一个或多个空格组成的串称为空白串(Blank String) 注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。

串的表示和实现

数组和广义表可看成是一种特殊的线性表,其特殊在于: 表中的元素本身也是一种线性表。内存连续。根据下标在O(1)时间读/写任何元素。
二维数组,多维数组,广义表,树,图都属于非线性结构

数组
数组的顺序存储:行优先顺序;列优先顺序。数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。

关联数组(Associative Array),又称映射(Map)、字典( Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。 不是线性表。

广义表
广义表(Lists,又称列表)是线性表的推广。广义表是n(n≥0)个元素a1,a2,a3,…,an的有限序列,其中ai或者是原子项,或者是一个广义表。若广义表LS(n>=1)非空,则a1是LS的表头,其余元素组成的表(a2,…an)称为LS的表尾。广义表的元素可以是广义表,也可以是原子,广义表的元素也可以为空。表尾是指除去表头后剩下的元素组成的表,表头可以为表或单元素值。所以表尾不可以是单个元素值。

三个结论

考点

一种非线性结构。树是递归结构,在树的定义中又用到了树的概念。

基本术语
1.树结点:包含一个数据元素及若干指向子树的分支;
2.孩子结点:结点的子树的根称为该结点的孩子;
3.双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲;
4.兄弟结点:同一双亲的孩子结点;
5.堂兄结点:同一层上结点;
6.结点层次:根结点的层定义为1;根的孩子为第二层结点,依此类推;
7.树的高(深)度:树中最大的结点层
8.结点的度:结点子树的个数,就是有几个孩子
9.树的度: 树中最大的结点度。
10.叶子结点:也叫终端结点,是度为0的结点;
11.分枝结点:度不为0的结点(非终端结点);
12.森林:互不相交的树集合;
13.有序树:子树有序的树,如:家族树;
14.无序树:不考虑子树的顺序;

二叉树
二叉树可以为空。二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。这是二叉树与树的最主要的差别。
注意区分: 二叉树、二叉查找树/二叉排序树/二叉搜索树、二叉平衡(查找)树

二叉树遍历
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
层次遍历:一维数组存储二叉树,总是以层次遍历的顺序存储结点。层次遍历应该借助队列。

二叉树性质
1.在二叉树的第 i 层上至多有2的i次幂-1个结点
2.深度为 k 的二叉树上至多含 2的k次幂-1 个结点(k≥1)
3.树与转换后的二叉树的关系:转换后的二叉树的先序对应树的先序遍历;转换后的二叉树的中序对应树的后序遍历

一些概念
1.路径:从一个祖先结点到子孙结点之间的分支构成这两个结点间的路径;
2.路径长度:路径上的分支数目称为路径长度;
3.树的路径长度:从根到每个结点的路径长度之和。
4.结点的权:根据应用的需要可以给树的结点赋权值;
5.结点的带权路径长度:从根到该结点的路径长度与该结点权的乘积;
6.树的带权路径长度=树中所有叶子结点的带权路径之和;通常记作 WPL=∑wi×li
7.哈夫曼树:假设有n个权值(w1, w2, … , wn),构造有n个叶子结点的二叉树,每个叶子结点有一个 wi作为它的权值。则带权路径长度最小的二叉树称为哈夫曼树。最优二叉树。

图搜索->形成搜索树
1.穷举法
2.贪心法。多步决策,每步选择使得构成一个问题的可能解,同时满足目标函数
3.回溯法,根据题意,选取度量标准,然后将可能的选择方法按度量标准所要求顺序排好,每次处理一个量,得到该意义下的最优解的分解处理

无向图
1.回路或环:第一个顶点和最后一个顶点相同的路径。
2.简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路
3.连通:顶点v至v’ 之间有路径存在
4.连通图:无向图图 G 的任意两点之间都是连通的,则称G是连通图。
5.连通分量:极大连通子图,子图中包含的顶点个数极大
6.所有顶点度的和必须为偶数

有向图
1.回路或环:第一个顶点和最后一个顶点相同的路径。
2.简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路。
3.连通:顶点v至v’之间有路径存在
4.强连通图:有向图G的任意两点之间都是连通的,则称G是强连通图。各个顶点间均可达。
5.强连通分量:极大连通子图
6.有向图顶点的度是顶点的入度与出度之和。邻接矩阵中第V行中的1的个数是V的出度
7.生成树:极小连通子图。包含图的所有n个结点,但只含图的n-1条边。在生成树中添加一条边之后,必定会形成回路或环。
8.完全图:有 n(n-1)/2 条边的无向图。其中n是结点个数。必定是连通图。
9.有向完全图:有n(n-1)条边的有向图。其中n是结点个数。每两个顶点之间都有两条方向相反的边连接的图。
10.一个无向图 G=(V,E) 是连通的,那么边的数目大于等于顶点的数目减一:|E|>=|V|-1,而反之不成立。如果 G=(V,E) 是有向图,那么它是强连通图的必要条件是边的数目大于等于顶点的数目:|E|>=|V|,而反之不成立。没有回路的无向图是连通的当且仅当它是树,即等价于:|E|=|V|-1。

图的邻接矩阵和邻接表

1.邻接矩阵和加权邻接矩阵

深度优先搜索利用栈
深度优先遍历类似于树的先序遍历,是树的先序遍历的推广

广度优先遍历
图的广度优先遍历就类似于树的层序遍历

每次遍历一个连通图将图的边分成遍历所经过的边和没有经过的边两部分,将遍历经过的边同图的顶点构成一个子图,该子图称为生成树。因此有DFS生成树和BFS生成树。

生成树是连通图的极小子图,有n个顶点的连通图的生成树必定有n-1条边,在生成树中任意增加一条边,必定产生回路。若砍去它的一条边,就会把生成树变成非连通子图

最小生成树:生成树中边的权值(代价)之和最小的树。最小生成树问题是构造连通网的最小代价生成树。

Kruskal算法 :令最小生成树集合T初始状态为空,在有n个顶点的图中选取权值最小的边并从图中删去,若该边加到T中有回路则丢弃,否则留在T中;依次类推,知道T中有n-1条边为止

Prim算法: 它的基本思想是以顶点为主导地位,从起始顶点出发,通过选择当前可用的最小权值边把顶点加入到生成树当中来:
1.从连通网络N=V,E中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,V),将其顶点加入到生成树的顶点集合U中。
2.以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(U,V),把它的顶点加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。

Prim算法,Kruskal算法和Dijkstra算法都属于贪心算法

Dijkstra算法适用于边权值为正的情况,如果边权值为负数就才用另一种最短路算法Bellman-Ford算法。该算法是指从单个源点到各个结点的最短路,该算法适用于有向图和无向图。复杂度O(n^2)
Dijkstra算法图文详解

若从一个连通图中删去任何一个顶点及其相关联的边,它仍为一个连通图的话,则该连通图被称为 重(双)连通图。
若连通图中的某个顶点和其相关联的边被删去之后,该连通图被分割成两个或两个以上的连通分量,则称此顶点为 关节点。

没有关节点的连通图称为双连通图
1.生成树的根结点,有两个或两个以上的分支,则此顶点(生成树的根)必为关节点;
2.对生成树上的任意一个非叶“顶点”,若其某棵子树中的所有“顶点”没有和其祖先相通的回边,则该“顶点”必为关节点

拓扑排序。在用邻接表表示图时,对有n个顶点和e条弧的有向图而言时间复杂度为O(n+e)。一个有向图能被拓扑排序的充要条件就是它是一个有向无环图。

AOV网(Activity On Vertex):用顶点表示活动,边表示活动的优先关系的有向图称为AOV网。AOV网中不允许有回路,这意味着某项活动以自己为先决条件。

拓扑有序序列:把AOV网络中各顶点按照它们相互之间的优先关系排列一个线性序列的过程。若vi是vj前驱,则vi一定在vj之前;对于没有优先关系的点,顺序任意。

拓扑排序:对AOV网络中顶点构造拓扑有序序列的过程。方法:

采用 深度优先搜索 或者 拓扑排序 算法可以判断出一个有向图中是否有环(回路)。
深度优先搜索只要在其中记录下搜索的节点数n,当n大于图中节点数时退出,并可以得出有回路。若有回路,则拓扑排序访问不到图中所有的节点,所以也可以得出回路。广度优先搜索过程中如果访问到一个已经访问过的节点,可能是多个节点指向这个节点,不一定是存在环。

拓扑算法描述

AOE网:带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间。在工程上常用来表示工程进度计划。

常用哈希函数
1.直接定址法。
2.数字分析法。
3.平方取中法。
4.折叠法。
5.除留余数法。
6.随机数法。

冲突解决
1.开放定址法:当发生冲突时,形成一个探查序列,沿此序列逐个地址探查,知道找到一个空位置,将发生冲突的记录放到该地址中。即Hi=(H(key)+di) % m,i=1,2,……k(k<=m-1),H(key)哈希函数,m哈希表长,di增量序列。

2.链地址法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。

3.设有n个关键字具有相同的Hash函数值,则用线性探测法把这n个关键字映射到Hash表中需要做n (n-1)/2次线性探测。如果使用二次探测再散列法将这n个关键字存入哈希表,至少要进行n (n+1)/2次探测
4.Hash查找效率:装填因子=表中记录数/表容量
5.开哈希表——链地址法;闭哈希表——开放地址法

B树的查找
时间复杂度O(logn)

B树的插入

例:用1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15构建5阶B树

因为构建5阶的B树,所以每个节点的关键字个数范围为[2,4]

插入11时,该节点的关键字个数超出范围,进行分裂

之后直接插入4,8,13

当插入10时,节点关键字个数再次超出范围

将子节点分裂

直接插入5,17,9,16,插入20

关键字个数超出范围,进行分裂

继续插入3

关键字个数超出范围,进行分裂

继续插入15

关键个数超出范围,进行分裂

这时候根节点关键字个数也超出范围,继续分裂

B+的优点
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查询叶到叶子节点,查询更加稳定
3.所有叶子节点形成有序链表,便于范围查询。

MySQL 知识点总结(简易版)

MySQL 总结(简易版)

基本语法

0. 1基本语法

# 登录MySQL
$ mysql -u root -p12345612

# 退出MySQL数据库服务器
exit;

-- 显示所有数据库
show databases;

-- 创建数据库
CREATE DATABASE test;

-- 切换数据库
use test;

-- 显示数据库中的所有表
show tables;

-- 创建数据表
CREATE TABLE pet (
    name VARCHAR(20),
    owner VARCHAR(20),
    species VARCHAR(20),
    sex CHAR(1),
    birth DATE,
    death DATE
);

-- 查看数据表结构
-- describe pet;
desc pet;

-- 查询表
SELECT * from pet;

-- 插入数据
INSERT INTO pet VALUES (\'puffball\', \'Diane\', \'hamster\', \'f\', \'1990-03-30\', NULL);

-- 修改数据
UPDATE pet SET name = \'squirrel\' where owner = \'Diane\';

-- 删除数据
DELETE FROM pet where name = \'squirrel\';

-- 删除表
DROP TABLE myorder;

//更改表属性结构
【alter table xxx 动词 xxx】
-- 添加主键约束
-- 如果忘记设置主键,还可以通过SQL语句设置(两种方式):
ALTER TABLE user ADD PRIMARY KEY(id);
ALTER TABLE user MODIFY id INT PRIMARY KEY;

-- 删除主键
ALTER TABLE user drop PRIMARY KEY;

0. 2建表约束

约束类型:

  1. 主键primary key
  2. 唯一主键 unique(name)
  3. 非空约束 not null
  4. 默认约束 default ‘男’ or default 10
  5. 外键 foreign key (id)reference class(id)
--建表约束
1. 类型后面加约束
	id INT PRIMARY KEY
2. 单独一句
	① 单个约束
		paimary(id)
	② 多个约束
		primary(id,name)

0. 3 添加和删除约束

1、建表的时候可以添加约束
2、可以使用alter。。。add。。。
3、alter。。。modify。。。
4、删除用 alter。。。drop。。。

图表

1.查询语句结构

2.聚集函数

3.字符串中的通配符

4.where子句中的运算符

易错点

1. 数据库不分大小写

2. 数字和中文基本都用varchar(在有大量的英文以外的字符则用nvarchar)

3. 约束可以加在字段的后面,也可以换行单独描述字段的约束。

①(sno varchar(10) primary key);

②(sno varchar(10),

​ primary key(sno))

4. 数据库注释方法:--

5. 修改表名

ALTER TABLE table_name RENAME TO new_table_name

6.列的拼接 concat

CONCAT(last_name, \' \', first_name) as Name

7.列内容替换replace

SET emp_no = REPLACE(emp_no, 10001, 10005)
WHERE id = 5;
emp_no列中10001 替换成10005

5. 字段别名方法:constraint

5. 字段不重复方法:distinct department

5. 可以在查询后加 limit( start , number )

start:从哪开始查 (第一个下标为0)

number:查几个出来

8. union用法:求并集【union前不用逗号】

select sno,sname from student where xxxxx

union

select sno,sname from student where xxxxx;

9. ANY 和 ALL

  > ANY	大于子查询结果中的某个值 ,即大于最小值     
   > ALL	大于子查询结果中的所有值,即大于最大值
  < ANY	小于子查询结果中的某个值 ,即小于最大值
  < ALL	小于子查询结果中的所有值,即小于最小值
  = ANY	等于子查询结果中的某个值 ,相当于in     
  =ALL  	等于子查询结果中的所有值(通常没有实际意义)
  !=(或<>)ANY	不等于子查询结果中的某个值,相当于not in
  !=(或<>)ALL	不等于子查询结果中的任何一个值,相当于not in

10.算时间差

year(now()) - year(birthday)

11. 三大范式

1. 1NF

   字段不可拆分 (可拆分的例子:中国广东广州xx街道)

2. 2NF

   列都完全依赖于主键,否则要拆分(如果出现不完全依赖,只可能发生在联合主键的情况下,此时也要拆分为多个表)

3. 3NF

   依赖不能有传递关系,否则要拆分

12. 连接

1. 内连接 

> A inner join B on A.sno=B.sno 
>
> 相当于
>
> where A.sno=B.sno

2. 左连接 (保留A中所有并且输出A∩B,无值填null)

> A left join B on A.sno=B.sno

3. 右链接(保留B中所有并且输出A∩B,无值填null)

> A right join B on A.sno=B.sno

4. 外连接(保留A B所有,无值填null)

> A full join B on A.sno=B.sno

12. 事务

1. 设置事务(默认 autocommit=1 开启自动提交)

> set autocommit = 0 or 1; (0的时候是关闭自动提交,开启手动提交)

2. 查看事务

> select @@AUTOCOMMIT;

3. 回滚到最后一次提交(撤销)

> rollback;

4. 事务开启后,需要手动提交数据(提交后则无法回滚)

> commit;

5. 事务的开启

> ① begin;
>
> ② start transaction;

事务的两种启动方法:

1. 当autocommit=0时

   ①set autocommit=0;

   ​	......

   ​	commit;

   (每次commit前的都算一次事务)

2. 当autocommit=1时(默认)

   ①begin; (start transaction;)

   ​	......

   ​	commit;

   (begin ~~~ 到 commit;才是一次事务)

   ②.........;(每次输入都是一次事务)

13. 事务的特性

1. 原子性

   事务是最小单位,不可再分割,要么一起成功,要么一起失败。

2. 一致性

   编写的程序某个特性要一致,如:not null。

3. 隔离性(**表中下面的隔离级别高,性能低**)

   并发事务之间是隔离的,在事务未提交之前不能被其他session查看

4. 持久性

   事务一旦提交则对数据的改变是无法回滚的。

14. 事务隔离级别操作

1. 查看

   > 系统级别
   >
   > SELECT@@GLOBAL.TRANSACTION_ISOLATIO;
   >
   > 会话级别
   >
   > SELECT @@TRANSACTION_ISOLATION;

2. 修改

   > -- 设置系统隔离级别,LEVEL 后面表示要设置的隔离级别 (READ UNCOMMITTED)。
   >
   > SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

15. 事务的隔离级别

事务的隔离性可分为四种 ( 性能从低到高 ) :(系统默认是REPEATABLE READ)

  1. READ UNCOMMITTED ( 读取未提交 )

    官方:如果有多个事务,那么任意事务都可以看见其他事务的未提交数据

  2. READ COMMITTED ( 读取已提交 )

    理解:自己操作的时候别人提交会影响我的数据。

    官方:只能读取到其他事务已经提交的数据

    【事务A对表查询,事务B对表操作,事务A再查询表数据是不变的,但B提交后,A再次查询的数据就是B改变后的数据】

  3. REPEATABLE READ ( 可被重复读 ) 

    理解:事务间相互独立,只有完成了(提交)自己的部分才能看到别人的操作。

    官方:如果有多个连接都开启了事务,那么事务之间不能共享数据记录,否则只能共享已提交的记录。

    【事务A对表查询,事务B对表操作后提交,事务A在未提交前,A查到的表数据不变,一旦A提交后再次查询得到的表数据是B更改完的】

  4. SERIALIZABLE ( 串行化 )

    官方:所有的事务都会按照固定顺序执行,执行完一个事务后再继续执行下一个事务的写入操作

    (前一个事务未commit ,下一个事务将会等待)

16. 事务带来的问题

1. 脏读

   解释:一个事务读取到另外一个事务还未提交的数据

   例子:【小明赖账】小明买东西给了钱,商家发了货,小明回滚。

2. 不可重复读

   解释:在读取同一个表的数据时,可能会发生前后不一致的情况

   例子:【小明算账】小张在算A表平均值,小刘又正在改动A表,小张最后算出来的是小刘改动后的表的平均值。

3. 幻读

   解释:一个事务提交的数据,不能被其他事务读取到

   例子:【小明建q号】小明在a地创建x账号,恰好小刘在小明前几秒创建了x账号,此时小明创建不了x账号,因为已经存在了,但小明查表显示却无x账号。

以上是关于数据结构知识点总结的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 知识点总结(简易版)

DockeFIile知识点总结和发布自己的镜像

数据结构知识点总结

数据库重要知识点总结

YARN知识点总结

Netty知识点总结