前言
- 基础数据结构
- 本文所有代码点击跳转gitee查看,此处是基于c语言实现的!
数据结构介绍
- 程序=算法+数据结构
- 程序设计=程序+编程范式
- 数据结构=结构定义+结构操作
- 数据结构就是定义了一种性质并且维护了这种性质
课程综述
- 顺序表与链表
- 栈与队列
- 树与二叉树
- 图的存储与遍历
- 排序与查找
- 平衡二叉查找树
- 堆与优先队列
- 森i林和并查集
- 图论算法导论
- 字符串匹配算法
如果不是BAT这种公司的底层开发人员,一般使用到的数据结构是有限的。
- 线性结构:一对一
- 非线性结构:一对多、多对一
1. 顺序表【整块内存,顺序存储】
被称为更高级的数组,是因为支持所谓的扩容;
需要一块连续的存储空间
去存取任意的数据类型
逻辑结构
typedef struct Vector {
int *data;
int len, size;
} Vector;
基本操作
- 元素查询
- 插入操作:(尾部、任意位置)
- 判断是否为满
- 判断位置是否合法
- 插入操作 - 删除操作:(尾部、任意位置)
- 判断是否为空
- 判断位置是否合法
- 删除操作 - 判满和扩容
2. 链表【按图索骥,离散存储】
火车就是一种链表,链条,避免内存泄漏!
包含两部分:指针域、数据值
逻辑结构
typedef struct Node {
int val;
struct Node *next;
} Node;
typedef struct LinkedList {
Node *head;
int len;
} LinkedList;
基本操作
- 链表的查询
- 链表的插入操作:
- 尾部插入
- 头部插入
- 任意位置插入 - 链表的删除操作:
- 尾部删除
- 头部删除
- 任意位置删除
哨兵和虚头
:就是虚拟的节点,做了一个简单的规范,这个虚拟节点一直在存在,不会被删除;
简单分类
- 普通单向列表
- 单向循环链表
- 双向循环链表
- 海贼oj 272邻值查找
- 推荐题目:leetcode 19/24/83/141/160/202/203/206/234/237
- NC78 反转链表
NC40 两个链表生成相加链表
876. 链表的中间结点:快慢指针法
141. 环形链表
面试题 02.02. 返回倒数第 k 个节点
3. 队列
- FIFO先进先出
- LILO
- 假溢出 -> 循环队列
基本操作
- 顺序表实现队列:初始化、释放、压入、弹出、扩容
- 链表实现队列:初始化、释放、压入、弹出、扩容
4. 栈
栈是一个线性数据结构
- FILO先进后出
- LIFO
基本操作
- 顺序表实现栈:初始化、释放、压入、弹出、扩容(执行弹出的时候要判空)
- 链表实现栈:初始化、释放、压入、弹出
844. 比较含退格的字符串
682. 棒球比赛
#265. 括号画家
leetcode:20/42/84/221/239/232/225
5. 树与二叉树
-
线性结构:逻辑结构简单,存放有序的元素
-
树形结构:逻辑结构复杂,存放具有层次嵌套关系的元素,适合使用递归
-
二叉树的三种深度优先遍历:前序遍历、中序遍历、后序遍历
-
满二又树:二叉树中,若所有叶子节点均在同一层且
所有非叶子节点度数为2
-
完全二叉树:二叉树中,若除掉最大阶层后为满二叉树,且最大阶层节点均向左靠齐。
性质
- 在二叉树的第i层最多有2i-1 个节点
- 在深度为k的二叉树最多有2k-1个节点
- 二叉树终端节点个数为n0,度为2的节点个数为n2,则 n0 = n2+1
n = n0 + n2 + n1
n0 * 0 + n1 * 1 + n2 * 2 = n -1
其他
- DepthFirst(深度优先)
- 在题解中,递归算法这种说法有点诡异,应该解释成:这个算法可以借用递归来实现!
144. 二叉树的前序遍历
94. 二叉树的中序遍历
105. 从前序与中序遍历序列构造二叉树
101. 对称二叉树
leetcode:100/101/102/104/107/110/112/111/226/235/257/297
6. 广义表转二叉树
7. 排序算法讲解
#284. 超市卖货
23. 合并K个升序链表:多路合并
8. 查找算法与哈希表
8.1 查找算法
- 二分查找法、三分查找法
8.2 哈希表
- 常见的数字哈希有:直接法、减去法、取余法、平方法、随机数法
哈希表的实现逻辑是:空间换时间,每次查找都很快,时间复杂度O(1)
哈希表包括两部分:哈希函数、冲突处理方法
其中,冲突处理方法有四种:开放地址法、再哈希法、拉链法、建立公共溢出区
线性开放寻址,二次方探索法,差值探索,链表解决法
海贼oj #274
leetcode:01/03/04/21/35/38/88/217/219/278/349/350/374/378
9. 堆与优先队列
- 优先队列就是通过堆来实现的!
- 堆的本质又是完全二叉树,形成了:大顶堆和小顶堆!
数组实现完全二叉树
- 可以用连续空间存储完全二叉树
- 编号为i的子节点:左孩子为
2*i+1
,右孩子为2*i+2
- 第i个节点的父节点是
(i- 1)/ 2
堆
- 堆插入,先上调整,是
logn
级别的 - 堆删除,向下调整,
堆排序
海贼oj #287 #284
leetcode:703/295/313/23/264
10. 森林与并查集
森林并查集:主要解决连通性问题!
推荐两篇文章:
并查集(Union-Find)算法介绍:http://blog.csdn.net/dm_vincent/article/details/7655764
并查集(Union-Find) 应用举例 — 基础篇:http://blog.csdn.net/dm_vincent/article/details/7769159
快速查找
快速合并
- 快速查找与快速合并
后记
- 后续可能会基于systemverilog实现数据结构。