基础数据结构

前言

数据结构介绍

  • 程序=算法+数据结构
  • 程序设计=程序+编程范式
  • 数据结构=结构定义+结构操作
  • 数据结构就是定义了一种性质并且维护了这种性质

课程综述

  1. 顺序表与链表
  2. 栈与队列
  3. 树与二叉树
  4. 图的存储与遍历
  5. 排序与查找
  6. 平衡二叉查找树
  7. 堆与优先队列
  8. 森i林和并查集
  9. 图论算法导论
  10. 字符串匹配算法
    在这里插入图片描述

如果不是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;

基本操作

  • 链表的查询
  • 链表的插入操作:
    - 尾部插入
    - 头部插入
    - 任意位置插入
  • 链表的删除操作:
    - 尾部删除
    - 头部删除
    - 任意位置删除

哨兵和虚头:就是虚拟的节点,做了一个简单的规范,这个虚拟节点一直在存在,不会被删除;

简单分类

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

其他

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. 堆与优先队列

  • 优先队列就是通过堆来实现的!
  • 堆的本质又是完全二叉树,形成了:大顶堆和小顶堆!

数组实现完全二叉树

  1. 可以用连续空间存储完全二叉树
  2. 编号为i的子节点:左孩子为2*i+1,右孩子为2*i+2
  3. 第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实现数据结构。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰之行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值