前言
上班之前总觉得在学校学的东西用处不是很大,数据结构和算法也是为了考试,直到考研的时候才发现这个原来很重要,上了班之后更是发现,原来这个真的体现了你的基础性,所以当初没好好学的东西,又都狠狠的补了一遍,这个文章会很长,如果字数太多可能会分开写成好几篇
目录
基本概念
线性表
线性表的基本操作
线性表的顺序表示
线性表的链式表示
栈和队列
栈
队列
栈和队列的基本应用
特殊矩阵的压缩储存
树和二叉树
树和二叉树的基本概念
二叉树的遍历和线索二叉树
树和森林
树和二叉树的基本应用
图
图的基本概念
图的基本操作
图的遍历及应用
查找的基本算法
顺序查找和折半查找
B树和B+树
B+树
散列表
串
排序的基本算法
排序的定义
插入排序
交换排序
选择排序
归并排序
基数排序
内部排序
外部排序
正文
基本概念
- 数据:所有能被计算机识别和处理的集合
- 数据元素:数据的基本单位,由若干数据项组成
- 数据对象:具有相同性质数据元素的集合,归属数据的子集
- 数据类型:分为原子类型,结构类型,书香数据类型
- 抽象数据类型:定义取决于逻辑特性
- 数据结构:数据元素的集合,包括逻辑结构、存储结构、数据运算
数据结构的基本要素
- 逻辑结构:分为线性结构和非线性结构,细分为:集合,线性结构,树形结构,图状结构或网状结构
- 存储结构(物理结构):数据在计算机中的的表示(元素表示和关系表示)
- 存储结构常用的几种: 顺序存储、链式存储、索引存储、散列存储(Hash存储)
- 顺序存储:算法逻辑和存储的物理地址都相邻。优点:随机存取。缺点:只能用相邻的存储单元,会产生较多的外部碎片
- 链式存储:算法逻辑上相邻,存储的物理地址不需要相邻,借用指针来表示元素的逻辑关系。优点:不会出现碎片现象。缺点:存储指针占用额外的存储空间,只能顺序存取
- 索引存储:要建立个索引表。优点:检索速度快。缺点:索引表会占用较多的存储空间,增加和删除数据的时候还要修改索引表,时间较长。
- 散列存储(Hash存储):根据关键字直接计算出存储地址。优点:检索、增加、删除的速度都很快;缺点:散列函数写的不好,会产生存储单元的冲突,进而影响时间空间。
- 存储结构常用的几种: 顺序存储、链式存储、索引存储、散列存储(Hash存储)
算法的基本概念
-
算法的基本条件
- 有穷性:没有一直执行的算法(如果一直执行可能是死循环),要在完成一定条件后结束
- 确定性:算法目的要明确,输入对应输出
- 可行性:算法是可行的
- 输入:没有输入算法执行什么?
- 输出:不输出算法的意义在哪?
- 一些基本要求比如:正确、可读、健壮、时间、空间
-
时间和空间复杂度
- 时间复杂度:T(n) = O(f(n))
- 主要分析的是T(n)的数量级,f(n)是频度,O是T(n)的数量级,n是问题的规模,同时也受限输入的数据的性质
- 分析时间复杂性的规则
- 加法:T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))
- 乘法:T(n) = T1(n)*T2(n) = O(f(n))*O(g(n)) = O(max(f(n)*g(n)))
- 时间复杂度的顺序: O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
- 空间复杂度:S(n) = O(g(n)) S(n)是使用的储存空间,n是问题规模。算法还有一个原地工作,就是需要辅助空间O(1)
- 时间复杂度:T(n) = O(f(n))
线性表
- 线性表的定义:具有相同数据类型的数据元素的 有限序列。L = (a1,a2,...,ai,ai+1,...,an),L是线性表,a1是表头元素且唯一,an是表尾元素且唯一,除去表头元素表尾元素,中间的元素都有并且只有一个前继后继元素。
- 线性表的特点:
- 个数有限
- 具有顺序性
- 都是单个的数据元素
- 逻辑关系具有抽象性
- 线性表是逻辑结构,顺序表和链表是存储结构,它们不一样。