数据结构:
1. 线性结构:数组、链表、栈、队列
(特点原理等了解清楚)
-
数组(基本数据结构)
特点:支持随机访问,访问速度快,连续存储对CPU缓存机制友好,插入删除速度慢,不支持扩展
-
链表(基本数据结构)
特点:不支持随机访问,访问速度慢,插入删除较快,支持长度扩展
分类:单链表,循环链表,双向链表,双向循环链表。
-
栈
特点:先进后出,只能在栈顶删除和插入元素
分类:顺序栈(数组实现),链式栈(链表)
应用:括号匹配、浏览器回退前进(两个栈实现)、反转字符串、维护函数调用(最后调用的先执行完)
-
队列
特点:先进先出,在队尾(rear)入队,在队头(front)出队,维护两个指针
分类【顺序队列(数组)、链式队列(链表)】:单队列,循环队列(解决假溢出问题)
2. 非线性结构:树、图、堆
-
树
- 特点:树形结构的元素之间有着明显的层次关系
- 扩展结构:二叉树、B树、B+树、红黑树
- 存储:使用数组或链表
- 树形结构应用较多,且每一种都有点复杂,后面单独补充这部分内容
-
图
-
特点:关系复杂,无序
-
分类:无向图和有向图、无权图和带权图
-
存储方式:
邻接矩阵:底层是一个二维数组,访问高效速度快,但浪费空间
邻接表:底层是数组+链表,节省空间
-
搜索方式:
-
广度优先搜索:访问的顶点放入队列,先访问到的先出队。每次访问时取出队首结点,再访问该结点的所有后继结点,将未访问过的结点入队,继续访问下一个队首结点,重复上述过程,直到队列为空且没有需要入队的结点。
-
深度优先搜索:访问的顶点放入栈中,先访问到的后出栈。每次访问时取出栈顶结点,再访问该节点所有后继结点,将未访问过的结点入栈,继续访问下一个栈顶结点,重复上述过程,直到栈为空且没有需要入栈的结点。
-
-
-
堆(一般用数组实现)
- 特点:任意一个节点的值都大于等于或小于等于它所有子节点的值;堆是一棵完全二叉树
- 分类:大顶堆、小顶堆
- 堆操作:
- 堆化:为了保持堆的性质,对结构进行调整。分为自底向上,和自顶向下。
- 插入元素:将插入元素放到数组末尾,再自底向上堆化,将该元素放在该放的位置上
- 删除堆顶元素:
- ①使用自顶向下(也叫石沉大海):将末尾元素填充到堆顶的位置,不停和左右子节点比较,与较大的结点交换位置,重复此操作,直到无法交换位置。不会产生”气泡“。
- ②使用自底向上:将堆顶元素的左右子节点进行比较,较大者元素填充到堆顶位置,重复此操作,直到移不了位置(堆底部)。此方法可能会产生”气泡“。
- 堆排序:
- 建堆(数组时无序的,要堆化成小顶堆或大顶堆的性质)
- 排序
- 先取出堆顶元素;
- 将末尾元素放在堆顶,将取出的堆顶元素放在数组末尾;
- 采用自顶向下的堆化,继续取出堆顶元素放在末尾,直到所有非叶节点都堆化完成(所有非叶节点的索引是1~n/2)。