【java入门到放弃】数据结构

1、线性数据结构

1.1、数组(Array)

1.2、链表(Linked List)

单链表
双向链表
循环链表

1.3、栈

1.4、队列

普通队列
循环队列
双端队列

2、非线性数据结构

2.1、树

2.1.1、普通树

特点:一个节点可以有任意多个子节点

算法重点:

DFS:Depth First Search(深度优先搜索)。树的先序遍历,是DFS的一种实现。

BFS:Breadth First Search(广度优先搜索)。就是 层序遍历。

2.1.1.1、B+ 树

数据库使用这个B+树。一种多路平衡搜索树(多个子节点,树的高度始终保持很低 不会退化成链表,节点里的 key 有序)。优点是磁盘IO少,有 双向链表 范围查询快

B+ 树的定义:

  • 一个节点可以有多个子节点
  • 子节点个数 = 阶(order)
    • 比如:3 阶、4 阶、100 阶......
  • 所有数据都存放在 叶子节点
  • 叶子节点之间 用链表相连(双向链表)

mysql中,一般只有2到4层。

数据存储:B 树,内部 + 叶子。B+ 树,只在叶子

类型 叶子节点存储 数据顺序 查询效率特点
聚簇索引 整行数据 与索引顺序一致 范围查询快,唯一聚簇
二级索引 索引列 + 主键 与索引顺序不一致 单点查找快,但回表有开销

聚簇索引一般是主键。物理顺序只能有一个 ,所以 只能一个聚簇索引

2.1.2、二叉树
2.1.2.1、平衡二叉树

定义:

  • 任意节点左右子树的高度差 ≤ 1
2.1.2.2、二叉搜索树

定义:

  • 左子树所有节点值 < 根节点
  • 右子树所有节点值 > 根节点
2.1.2.3、完全二叉树

定义:

  • 除最后一层外,其余层都是满的
  • 最后一层节点 从左到右连续排列
2.1.2.4、红黑树

红黑树是一种自平衡二叉搜索树,但它不是"高度严格平衡"的

1、每个节点非红即黑

2、根节点是黑色

3 、叶子节点(NIL,空节点)是黑色

4、 红色节点不能连续(红节点的子节点必须是黑)

5、 从任意节点到其所有后代 NIL 节点的黑节点数相同(黑高一致)

2.1.2.5、堆

1、结构性(Structure Property)

  • 必须是 完全二叉树
  • 最后一层从左到右依次填充

2、 堆序性(Heap Property)

  • 每个节点都满足:
    • 大顶堆:parent ≥ children
    • 小顶堆:parent ≤ children

2.2、图

图 = 顶点(Vertex) + 边(Edge)

  • 顶点(V):点、节点
  • 边(E):连接顶点的关系

表示为顶点集边集。顶点集不能为空,边集可以为空。

分类:

无向图,有向图

无权图,带权图

3、散列结构

3.1、哈希表

哈希表是一种通过哈希函数将 Key 映射到数组下标,从而实现快速存取的数据结构。

key → hashCode → index。再把value和key,一起绑定到index。

在 Java JDK 8+ 的 HashMap 中:

参数 默认值
初始容量 16
负载因子 0.75,大于12时,才扩容
链表 → 树 8,大于8时,才变红黑树,还要容量不小于64
树 → 链表 6,小于6时,才变链表
树化最小容量 64,容量不小于64,链表才会开始变树

扩容规则就是:容量 × 2(翻倍)

HashMap 扩容时会根据新容量重新确定每个元素的存放位置;

相关推荐
啊西:2 小时前
SuperMap iObjects Java地图生成栅格瓦片并保存到mongodb
java·开发语言·mongodb
老歌老听老掉牙2 小时前
PyQt5中RadioButton互斥选择的实现方法
开发语言·python·qt
一路往蓝-Anbo2 小时前
C语言从句柄到对象 (四) —— 接口抽象:从 Switch-Case 到通用接口
c语言·开发语言·stm32·嵌入式硬件
csbysj20202 小时前
WebPages 数据库:构建现代网页管理的基石
开发语言
教练、我想打篮球2 小时前
125 如何运行时实时切换数据库(实时切换影子库)
java·spring·shadow·datasource
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 “实惠”药房管理系统为例,包含答辩的问题和答案
java
lzhdim2 小时前
C#性能优化:从入门到入土!这10个隐藏技巧让你的代码快如闪电
开发语言·性能优化·c#
共享家95272 小时前
测试常用函数(一)
java·前端·javascript
沐知全栈开发2 小时前
C 标准库 - `<stdarg.h>`
开发语言