C语言数据结构相关知识点整理
数据结构概念
数据:现实生活中一切需要被处理的数据
结构:数据的逻辑结构、存储结构
数据结构:研究数据的逻辑结构、存储结构及其操作
逻辑结构
元素集合、线性关系(1:1)、树状关系(1:n)、网状关系(n:m)
储存结构
顺序存储
顺序存储:逻辑上连续的数据,在物理空间上也连续
优点:查询方便,利用率高
缺点:插入、删除元素不方便(要移动大量元素),对空间要求较高
链式存储
链式存储:逻辑上连续的数据,在物理空间上不一定连续
优点:插入和删除方便,对空间的要求较低
缺点:查询不方便,空间存储有效利用率小于1,对编译环境有要求
索引存储
索引存储:有索引表,索引表占有一定空间,插入和删除数据之后要跟新索引表,有时间开销,查询方便,插入和删除不方便。
哈希存储
哈希存储:根据所要查询的关键字,直接定位到记录本身,查询方便,插入和删除也方便,但如果哈希函数设置不合理,会降为索引存储。
线性关系
线性表、顺序表、链表三者之间的关系
-
线性表是一种逻辑结构,表示的是一对一的线性关系,顺序表和链表是线性表在不同的存储状态下的不同表现
-
顺序表:
1、逻辑上相邻的元素,在物理空间上也连续
2、查询方便,插入和删除不方便
3、空间存储的效率最大可达到1
4、对于静态顺序表来说,表满不能存,表空不能取
5、顺序表对空间的要求比较高
6、容易有空间碎片的产生 -
链表:
1、逻辑上相邻的元素,在物理空间上不一定相邻
2、插入和删除方便,查询不方便
3、空间的存储效率小于1
4、表的长度较为灵活
5、对空间的要求没有那么大
6、对编译环境有要求,必须要求编译环境支持指针类型的操作
如何选择顺序表还是链表:
1、基于操作分析:
如果更多的是插入和删除,优选选择链表,更多是查询操作,优选选择顺序表。
2、基于空间要求:
如果对空间存储密度有要求,优先选择顺序表,否则选择链表,因为链表对空间的包容性比较大,不容易出现碎片。
3、基于编译环境要求:
如果编译环境部支持指针类型操作,只能使用顺序表。
顺序存储
顺序表
定义
创建
插入
删除
显示
删除
查询
修改
导入
导出
销毁
扩容
链式存储
链表分类
带头结点单向不循环链表
带头结点单向循环链表
尾结点的判定发生了改变,尾结点的Next指向了头结点
操作依据一般是表尾
双向链表
头结点的pre 和 尾结点的 Next
双向循环链表
收限制的线性表
栈、队列、串
栈:只允许在一端执行插入和删除操作,被插入和删除的一端叫作栈顶,栈是先进后出的FILO
队列:只允许在一端执行插入操作,另外一端执行删除操作,允许被插入的一端叫队尾,允许出队的一端叫作队头,队列是先进先出的,FIFO
串:受限在存储上,只允许存储字符 子串的判断 --KMP
栈顺序存储
栈链式存储
共享栈
队列顺序存储
队列链式存储
双端队列
栈和队列的应用
树状关系
普通树转二叉树
顺序存储
链式存储
树结点的定义
创建树
插入元素(排序二叉树)
访问
先序遍历
中序遍历
后续遍历
图状关系:
顺序存储
链式存储
图的遍历
算法
算法:一堆指令的有序集合
算法的特征
-
唯一性:每一句话只有一种解释
-
有穷性:算法能描述完
-
可执行性
-
输入
-
输出
算法和程序的区别:
程序是用语言实现算法的代码
算法是静态的,程序是动态的
算法是有穷的,程序是无穷的 -
算法执行的代价
空间复杂度:算法在执行的时候,需要内存提供给我们多少空间才能保证算法正常工作
1、字节对齐
2、位域
3、减少额外空间
4、用完即释放
时间复杂度:算法在执行的时候,需要花费的时间
研究时间复杂度的量级O(n)
优化时间复杂度:
1、减少循环的使用
2、减少无用代码存在
常见的查找算法
线性:
- 顺序查找:从前往后按顺序查找
- 二分查找:对于有序的顺序表来说,可以使用二分查找
- 分块查找:块间有序,快内无序
树状:
- 排序二叉树:排序二叉树类似于链表的二叉分查找
哈希查找
hash表,又称散列表。哈希查找是一种基于哈希函数的查找算法,通常用于在大型数据集中快速查找目标数据的位置。在哈希查找中,首先将数据通过哈希函数映射为一个索引值,然后在该索引值对应的位置上查找目标数据。
构建哈希函数的方法
直接地址法
平方取中法
质数求余法
冲突:多个记录的关键字指向一个空间
解决冲突:开发地址法、链地址法
常见的排序算法
内部排序
交换
冒泡排序:每次运行总会将最小或最大的放到前面,如果需要交换,一直在交换
快速排序:经过一次快速排序的过程,将待排序的元素分成两部分,比较基准小的,比较基准大的,再分别对这两部分进行快速排序
插入
直接插入:重构链表
折半插入:原理同排序二叉树的插入,只是对象是一个有序的顺序表
希尔排序:曾量,逐渐减少的,直到增量为1为止
选择
简单选择:每次运行总会将最小或最大的放到最前面,如果交换,只交换一次
堆(大根堆, 小根堆)
归并
归并排序
基数
基数排序:从最低位开始排起,排到最高位位置
外部排序:
基于归并的:时间花销:数据的读和写、内部排序、选择谁最小