数据结构辨析

目录

一、线性表

1、顺序存储

(1)定义

(2)原理

(3)线性表基本操作

(4)Java实现

2、链式存储

(1)定义

(2)原理

(4)Java实现

顺序存储和链式存储区别

二、栈和队列

1、栈

(1)定义

(2)原理

(3)操作

(4)Java实现

2、队列

(1)定义

(2)原理

(3)操作

(4)Java实现

三、二叉树

1、定义

2、性质

3、基本操作

4、存储方式

(1)顺序存储

(2)链表存储

5、二叉树种类

(1)满二叉树

(2)完全二叉树

(3)二叉搜索树BST

(4)平衡二叉树AVL

(5)哈夫曼树

(6)红黑树

(7)B树

(8)B+树

(9)B*树

6、遍历

(1)深度优先遍历

 (2)广度优先遍历

四、哈希表

1、定义

2、Hash原理

(1)常见的哈希函数

(2)hash冲突的减少办法

3、原理

(1)底层原理

(2)数组扩容的过程

(3)拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?

4、基本操作

5、优缺点

6、Java实现


数据结构是工具,算法是通过合适的工具解决特定问题的方法。

一、线性表

数据结构底层存储方式只有两种:数组(顺序存储)和链表(链式存储)。

1、顺序存储

(1)定义

         用一组地址连续的存储单元依次存放线性表的元素。

(2)原理

        数组

(3)线性表基本操作

  1. 初始化
  2. 返回线性表长度
  3. 判断线性表是否为空
  4. 清空线性表
  5. 获取指定索引处的元素(查)
  6. 按值查找数据元素的位置(查)
  7. 直接插入数据元素(增)
  8. 向指定位置插入数据元素(增)
  9. 直接删除数据元素(删)
  10. 删除线性表中指定位置的数据元素(删)

(4)Java实现

  • ArrayList

2、链式存储

(1)定义

        采用一组地址任意的存储单元存放线性表中的数据元素。

(2)原理

节点 = 数据元素 + 引用下一个节点的引用 + 引用上一个节点的引用

(4)Java实现

  • LinkedList

顺序存储和链式存储区别

空间性能 时间性能
顺粗存储 顺序存储的空间是静态分布的,需要一个长度固定的数组,因此总有部分数组元素被浪费。 顺序存储中的元素的逻辑顺序与物理存储顺序保持一致,而且支持随机存储,因此查找读取时性能好。
链式存储 链表的存储空间是动态分布的,因此空间不会被浪费。但由于链表需要额外空间来为每个节点保存指针,因此也需要牺牲一部分空间。 链表采取链式结构来保存表内元素,因此插入、删除元素时性能较好。

二、栈和队列

1、栈

(1)定义

        栈是一种特殊的线性表,只能在固定一端进行插入或删除操作。

(2)原理

(3)操作

  1. 初始化
  2. 返回栈的长度
  3. 入栈
  4. 出栈
  5. 访问栈顶元素
  6. 判断栈是否为空
  7. 清空栈

(4)Java实现

  • Stack:数组实现,线程安全
  • LinkedList:双端链表,线程不安全
  • ArrayDeque:顺序存储结构双端队列,线性不安全,Java推荐并使用Collections包装成线程安全

2、队列

(1)定义

        队列是一种被限制过的线性表,它使用固定的一端来插入元素,另一端只用于删除元素。

(2)原理

(3)操作

  1. 初始化
  2. 返回队列长度
  3. 入队
  4. 出队
  5. 访问队列的前端元素
  6. 判断队列是否为空
  7. 清空队列

(4)Java实现

  • ArrayDeque:顺序存储结构双端队列
  • LinkedList:链式存储结构双端队列

三、二叉树

1、定义

        二叉树指的是每个节点最多只能有两个子树的有序树。

2、性质

  1. 二叉树第 i 层上的节点数目至多为2^{i-1}( i ≥ 1 );
  2. 深度为 k 的二叉树至多有2^{k}-1个节点;
  3. 在任何一颗二叉树中,如果其叶子节点的数量为n_{0},度为2的子节点数量为n_{2},则n_{0}=n_{2}+1
  4. 具有 n 个节点的完全二叉树的深度为\log_{2}(n+1)

【完全二叉树性质】

  1. 当 i == 1 时,节点i是二叉树的根;若 i > 1 ,则节点的父节点是 i / 2;
  2. 若 2i ≤ n ,则节点 i 有左子节点,左子节点的编号是 2i;否则,节点无左子节点,并且是叶子节点;
  3. 若 2i + 1 ≤ n,则节点 i 有右子节点,右子节点编号是 2i + 1;否则,节点无右子节点;
  4. 1 ~ n/2 范围的节点都是有子节点的非叶子节点,其余的节点全部都是叶子节点。

3、基本操作

  1. 初始化
  2. 为指定节点添加指定节点
  3. 判断二叉树是否为空
  4. 返回根节点
  5. 返回指定节点的父节点
  6. 返回指定节点的左子节点
  7. 返回指定节点的右子节点
  8. 返回该二叉树的深度
  9. 返回指定节点的位置

4、存储方式

(1)顺序存储

顺序存储二叉树的思想就是,将树中不同的节点存入数组的不同位置。

(2)链表存储

        【二叉树】

二叉链表存储的思想是,让每个节点都能记住它的左、右子节点。

        【三叉树】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱强拆的鲁班七号

码字不易,梦想路上与君共勉

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

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

打赏作者

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

抵扣说明:

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

余额充值