数据结构

算法之旅(四)常用数据结构

2024-10-26  本文已影响0人  阿海Blog

常用数据结构介绍

常用的数据结构,包括顺序表、链表、队列、栈、哈希表和二叉树。

一、线性结构

首先我们要了解一个很重要的概念什么是线性结构。

线性结构

线性结构是指数据元素之间存在一对一的线性关系的数据结构。

2. 属于线性结构的数据结构

在我介绍的几个简单数据类型里

线性结构

非线性结构


数组(又称顺序表)

数组(Array)是一种线性数据结构,用于存储相同类型的数据元素。

数组的特点

1. 固定大小

这是他的限制之一,但也有解决方案。但他的限制也有可能成为他的优势。

2. 相同类型的元素

3. 连续内存分配

4. 支持随机访问


链表的

链表(Linked List)是一种线性数据结构


一、链表的特点

1. 动态大小

链表的长度不固定,可以根据需要动态地增加或减少节点。内存是在运行时动态分配的,不需要预先指定大小。

2. 非连续内存存储

链表的节点在内存中可以不连续存储,通过指针(引用)连接起来。这与数组的连续存储不同。

3. 高效的插入和删除操作

在链表中插入或删除节点,只需修改相关节点的指针,时间复杂度为 O(1),不需要移动其他元素。

4. 不支持随机访问

链表不支持通过索引直接访问任意节点,需要从头节点开始逐一遍历,查找特定元素的时间复杂度为 O(n)。

简答来说:增删效率极高,查询相对较慢

5. 多种类型


应用场景

链表的优势

  1. 动态大小:链表可以在运行时动态增长或收缩,不需要预先定义大小,适用于数据规模不确定的场景。

  2. 高效的插入和删除操作:在链表中插入或删除元素时,只需修改相关节点的指针,时间复杂度为 O(1),无需像数组那样移动大量元素。

  3. 内存利用率高:链表节点在内存中非连续存储,内存分配灵活,可以有效利用碎片内存。

链表的应用

单向链表与双向链表的区别

一、结构区别

1. 单向链表

示意图

head --> [data | next] --> [data | next] --> [data | next] --> null

2. 双向链表

示意图

null <-- [prev | data | next] <--> [prev | data | next] <--> [prev | data | next] --> null

二、增删改查操作的区别

1. 插入操作

单向链表

双向链表

2. 删除操作

单向链表

双向链表

3. 查找操作

4. 修改操作

三、应用场景的区别

单向链表的应用场景

双向链表的应用场景


队列的数据结构特点、应用场景和 Java 示例代码


一、队列的定义

队列(Queue)是一种线性数据结构,遵循先进先出(FIFO, First In First Out)的原则。这意味着最早进入队列的元素将最先被移除。队列只允许在一端进行插入操作(称为队尾),在另一端进行删除操作(称为队头)。


二、队列的特点

  1. 线性结构:队列是一种有序的线性数据结构,元素按顺序排列。

  2. 先进先出(FIFO):第一个加入队列的元素最先被移除。

  3. 受限操作

    • 入队(Enqueue):在队尾添加元素。
    • 出队(Dequeue):从队头移除元素。
    • 查看队头元素(Peek):获取队头元素但不移除。
    • 判空(isEmpty):判断队列是否为空。
    • 获取队列长度(size):获取队列中元素的数量。
  4. 单向性:元素只能从队尾进入,从队头移出,不能直接访问队列中间的元素。

  5. 多种实现方式

    • 顺序队列:使用数组实现,容量固定。
    • 链式队列:使用链表实现,容量可动态变化。
    • 循环队列:为了解决顺序队列的假溢出问题,将队列逻辑上连接成一个环。

三、队列的应用场景

1. 任务调度和处理

2. 广度优先搜索(BFS)

3. 异步数据传输

4. 缓存和数据缓冲

5. 订单和请求排队

6. 模拟现实世界的排队场景

消息队列

消息队列是实现异步通信和系统解耦的重要技术。在消息中间件领域,RabbitMQ、RocketMQ 和 Kafka 是三大主流的消息系统。它们都涉及到了队列的概念,但在具体实现和使用上有所不同。

RabbitMQ、RocketMQ 和 Kafka 是否使用了队列结构?

1. RabbitMQ

RabbitMQ 使用了队列结构。

2. RocketMQ

RocketMQ 使用了队列的概念。

3. Kafka

部分是,Kafka 也涉及队列的概念,但其核心数据结构是日志(Log)

虽然 Kafka 不直接使用传统意义上的队列结构,但它实现了类似队列的消费模型,消费者按照顺序读取消息。


RabbitMQ、RocketMQ 和 Kafka 使用队列的原因

1. RabbitMQ

2. RocketMQ

3. Kafka


不同消息中间件对队列的实现和应用:


总结

队列的特点:

队列的优势:

应用场景:


通过理解队列的特点和应用场景,可以在合适的场景中使用队列来简化问题的解决方案,提高系统的效率和可维护性。
如果是我业务mq会选择rabbitmq,虽然rocketmq性能更高,但是rabbitmq具有跟其他语言的交互能力,天然优势。
数据mq选择kakfa,也是结构优势。但是kafka本身可靠性投递并不难,一旦接上其他数据类框架,它的综合方案需要非常可靠。


Java 技术栈中链表的使用

1. LinkedList

2. ConcurrentLinkedQueue

3. LinkedBlockingQueue

4. LRU 缓存机制


一、什么是栈

栈(Stack)是一种线性数据结构,遵循后进先出(LIFO, Last In First Out)的原则。

二、栈的数据结构特点

  1. 线性结构:栈是一种特殊的线性表,只允许在一端进行操作。

  2. 后进先出(LIFO):新元素总是放在栈顶,取元素也是从栈顶开始,最后插入的元素最先被取出。

  3. 操作受限:主要支持以下两种基本操作:

    • 入栈(Push):将元素添加到栈顶。
    • 出栈(Pop):从栈顶移除元素。
  4. 访问受限:只能访问栈顶元素,无法直接访问栈中其他位置的元素。

  5. 动态或静态实现

    • 顺序栈:使用数组实现的栈,容量固定,需要管理栈的容量和栈顶指针。
    • 链式栈:使用链表实现的栈,容量不受限制,插入和删除操作更灵活。

栈的应用

Java 语言本身中的栈应用

1. 方法调用栈

2. 异常处理机制中的栈

开发常见场景中的栈应用

1. 递归调用

2. 深度优先搜索(DFS)

3. 表达式求值和括号匹配

4. 浏览器的前进和后退功能

5. 撤销(Undo)和重做(Redo)操作

6. 数制转换


哈希表

哈希表的基本概念

1. 什么是哈希表

哈希表(Hash Table),也称为散列表

2. 哈希函数

3. 哈希冲突

哈希表的数据结构特点

1. 快速的查找和插入

2. 无序性

3. 键的唯一性

4. 动态扩容

5. 内存占用

三、哈希表在 Java 技术栈中的应用

1. Java 集合框架中的哈希表

1.1 HashMap

1.2 Hashtable

1.3 ConcurrentHashMap

2. Java 中哈希表的实现细节

2.1 HashMap 的实现原理

2.2 ConcurrentHashMap 的实现

四、哈希表在 Spring 框架中的应用

1. Spring 容器中的 BeanDefinition 存储

2. Spring MVC 中的 HandlerMapping

3. 缓存机制

五、哈希表在架构层面的应用场景

1. 缓存系统

1.1 分布式缓存

1.2 本地缓存

2. 负载均衡与路由

3. 去重和统计

4. 数据索引

5. 配置和参数管理

六、哈希表的小总结

1. 哈希表的特点

2. 应用

3. 注意事项


二叉树

二叉树的定义

二叉树(Binary Tree)是一种树形数据结构。

二叉树的基本性质

二叉树的类型

根据二叉树的形态和性质,可以将其划分为多种类型,每种类型都有特定的特点和应用场景。

1. 满二叉树(Full Binary Tree)

2. 完全二叉树(Complete Binary Tree)

3. 平衡二叉树(AVL 树)

4. 红黑树(Red-Black Tree)

5. 二叉搜索树(BST, Binary Search Tree)

6. 堆(Heap)

7. 霍夫曼树(Huffman Tree)

三、二叉树的应用场景

1. 数据库

B树 和 B+树**

(很重要)

2. Java 技术栈

2.1 Java 集合框架

PriorityQueue--》任务调度和处理

在任务管理和调度系统中,经常需要根据任务的优先级来处理任务。
优先级可以基于任务的紧急程度、到期时间或其他业务规则。
应用场景:

操作系统的进程调度:根据进程的优先级,决定哪个进程先执行。
线程池中的任务队列:高优先级的任务可以先被线程池执行。

2.2 并发包(java.util.concurrent

2.3 二叉树算法的应用

3. Spring系列的应用

3.1 Spring Core

3.2 Spring Security

3.3 Spring Data

4. 架构层面

4.1 缓存系统

4.2 文件系统

4.3 前端路由

4.4 编译器和解释器

4.5 人工智能

二叉树的小总结

1. 二叉树的定义和性质

2. 二叉树的类型

3. 应用场景

4. 重要性

上一篇 下一篇

猜你喜欢

热点阅读