当前位置: 首页 > news >正文

数据结构第一弹-数据结构在不同领域的应用

大家好,今天和大家一起总结一下数据结构在不同领域和场景的应用~

不同的数据结构适用于解决不同类型的问题,从简单的数组到复杂的图结构,每种数据结构都有其独特的应用场景。

1. 数组与链表

1.1 概念

  • 数组:一种线性数据结构,其中元素按照顺序排列,每个元素可以通过索引快速访问。
  • 链表:另一种线性数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的引用(指针)。

1.2 应用领域

  • 数据库系统:使用数组来存储固定大小的记录集,利用链表来管理动态增长的数据集合。
  • 操作系统:进程调度中的队列通常采用链表形式,以支持高效的插入和删除操作。

1.3 代码

链表实现

class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}
}public class LinkedList {private ListNode head;public void add(int data) {if (head == null) {head = new ListNode(data);} else {ListNode current = head;while (current.next != null) {current = current.next;}current.next = new ListNode(data);}}public void printList() {ListNode temp = head;while (temp != null) {System.out.print(temp.val + " ");temp = temp.next;}System.out.println();}
}

2. 栈与队列

2.1 概念

  • :遵循后进先出(LIFO)原则的数据结构。
  • 队列:遵循先进先出(FIFO)原则的数据结构。

2.2 应用领域

  • 编译器设计:表达式求值、函数调用等常用栈来实现。
  • 操作系统:任务调度、消息传递等场景中广泛使用队列。

2.3 代码

栈实现

import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(10);stack.push(20);stack.push(30);System.out.println("Stack: " + stack);System.out.println("Popped: " + stack.pop());System.out.println("After popping: " + stack);}
}

队列实现

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.add(10);queue.add(20);queue.add(30);System.out.println("Queue: " + queue);System.out.println("Removed: " + queue.remove());System.out.println("After removing: " + queue);}
}

3. 堆

3.1 概念

堆是一种特殊的完全二叉树,分为最大堆和最小堆两种类型。最大堆要求父节点的值大于或等于其子节点的值;最小堆则相反。

3.2 应用领域

  • 优先级队列:用于任务调度、事件处理等需要按优先级排序的应用。
  • 堆排序:基于堆的高效排序算法。

3.3 代码

最小堆实现

import java.util.PriorityQueue;public class MinHeapExample {public static void main(String[] args) {PriorityQueue<Integer> minHeap = new PriorityQueue<>();// 添加元素minHeap.add(10);minHeap.add(20);minHeap.add(15);minHeap.add(5);// 打印堆System.out.println("Min Heap: " + minHeap);// 删除最小元素System.out.println("Removed: " + minHeap.poll());System.out.println("After removing: " + minHeap);}
}

4. 图

4.1 概念

图是由顶点(节点)和边组成的非线性数据结构。边可以是有向的也可以是无向的,还可以有权重。

4.2 应用领域

  • 社交网络分析:用户之间的关系可以用图来表示。
  • 路由算法:如Dijkstra算法和A*算法,用于寻找最短路径。
  • 推荐系统:基于用户行为构建图模型,进行个性化推荐。

4.3 代码

无向图的邻接矩阵表示

public class Graph {private final int V; // 顶点数量private int[][] adjMatrix; // 邻接矩阵public Graph(int v) {V = v;adjMatrix = new int[V][V];}public void addEdge(int v, int w) {adjMatrix[v][w] = 1;adjMatrix[w][v] = 1; // 无向图}public void printGraph() {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {System.out.print(adjMatrix[i][j] + " ");}System.out.println();}}
}

Dijkstra算法

import java.util.Arrays;import java.util.PriorityQueue;public class DijkstraAlgorithm {private static final int INF = Integer.MAX_VALUE;public static int[] dijkstra(int[][] graph, int src) {int V = graph.length;int[] dist = new int[V];Arrays.fill(dist, INF);dist[src] = 0;PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);pq.offer(new int[]{src, 0});while (!pq.isEmpty()) {int[] u = pq.poll();int uNode = u[0], uDist = u[1];if (uDist > dist[uNode]) continue;for (int v = 0; v < V; v++) {if (graph[uNode][v] != 0) { // 有边int newDist = uDist + graph[uNode][v];if (newDist < dist[v]) {dist[v] = newDist;pq.offer(new int[]{v, newDist});}}}}return dist;}public static void main(String[] args) {int[][] graph = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};int[] distances = dijkstra(graph, 0);System.out.println("Shortest distances from source 0: " + Arrays.toString(distances));}
}

5. Trie树

5.1 概念

Trie树,也称为前缀树或字典树,是一种用于存储字符串集合的数据结构。它特别适用于快速查找和插入操作,尤其是在处理大量字符串时表现优异。

5.2 应用领域

  • 搜索引擎:利用Trie树进行关键词索引,加速搜索过程。
  • 词频统计:在文本处理中快速统计单词出现频率。
  • 自动补全:输入法中的候选词推荐功能。

5.3 代码

Trie树实现

class TrieNode {private final int ALPHABET_SIZE = 26;TrieNode[] children = new TrieNode[ALPHABET_SIZE];boolean isEndOfWord;public TrieNode() {isEndOfWord = false;for (int i = 0; i < ALPHABET_SIZE; i++) {children[i] = null;}}
}public class Trie {private TrieNode root;public Trie() {root = new TrieNode();}// 插入单词public void insert(String key) {TrieNode pCrawl = root;for (int level = 0; level < key.length(); level++) {int index = key.charAt(level) - 'a';if (pCrawl.children[index] == null)pCrawl.children[index] = new TrieNode();pCrawl = pCrawl.children[index];}pCrawl.isEndOfWord = true;}// 搜索单词public boolean search(String key) {TrieNode pCrawl = root;for (int level = 0; level < key.length(); level++) {int index = key.charAt(level) - 'a';if (pCrawl.children[index] == null)return false;pCrawl = pCrawl.children[index];}return (pCrawl != null && pCrawl.isEndOfWord);}// 删除单词public void delete(TrieNode root, String key, int depth) {if (root == null)return;if (depth == key.length()) {if (root.isEndOfWord)root.isEndOfWord = false;if (isEmpty(root))root = null;return;}int index = key.charAt(depth) - 'a';delete(root.children[index], key, depth + 1);if (isEmpty(root) && !root.isEndOfWord) {root = null;}}private boolean isEmpty(TrieNode node) {for (int i = 0; i < 26; i++) {if (node.children[i] != null)return false;}return true;}
}

6. 并查集

6.1 概念

并查集是一种用来管理不相交集合的数据结构,支持合并两个集合以及查询两个元素是否属于同一个集合的操作。

6.2 应用领域

  • 社交网络:确定用户之间的关系网。
  • 图像分割:基于像素相似性对图像进行区域划分。
  • 最小生成树算法:如Kruskal算法,在构建过程中使用并查集避免形成环。

6.3 代码

并查集实现

public class UnionFind {private int[] parent;private int[] rank;public UnionFind(int size) {parent = new int[size];rank = new int[size];for (int i = 0; i < size; i++) {parent[i] = i;rank[i] = 0;}}// 查找public int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);  // 路径压缩}return parent[x];}// 合并public void union(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {if (rank[rootX] > rank[rootY]) {parent[rootY] = rootX;} else if (rank[rootX] < rank[rootY]) {parent[rootX] = rootY;} else {parent[rootY] = rootX;rank[rootX]++;}}}// 判断是否属于同一集合public boolean isConnected(int x, int y) {return find(x) == find(y);}
}

数组与链表为基本的数据存储提供了基础支持,而栈与队列为特定的操作模式提供了高效的解决方案。堆则在优先级队列和排序算法中发挥着重要作用,图结构则广泛应用于复杂的关系建模。Trie树和并查集作为高级数据结构,在处理特定问题时提供了更优的性能。

相关文章:

数据结构第一弹-数据结构在不同领域的应用

大家好&#xff0c;今天和大家一起总结一下数据结构在不同领域和场景的应用~ 不同的数据结构适用于解决不同类型的问题&#xff0c;从简单的数组到复杂的图结构&#xff0c;每种数据结构都有其独特的应用场景。 1. 数组与链表 1.1 概念 数组&#xff1a;一种线性数据结构&a…...

如何创建基于udp的客户端和服务端

1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…...

ThinkPHP框架审计--基础

基础入门 搭建好thinkphp 查看版本方法&#xff0c;全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…...

Java8 CompletableFuture异步编程

文章目录 CompletableFuturede介绍CompletableFuturede使用场景常用异步编程实现方案- Thread- ExecutorService- CountDownLatch- CyclicBarrier- ForkJoinPool- CompletableFuture各种实现方案总结 CompletableFuturede结构结构梳理- Future接口- CompletionStage接口常用方法…...

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…...

分阶段构建在复杂系统中的应用:以推荐系统为例

引言 在信息技术飞速发展的今天&#xff0c;复杂系统的构建已经成为许多企业和组织面临的重要挑战。复杂系统通常由多个相互依赖、相互作用的组件构成&#xff0c;这些组件在功能上相互关联&#xff0c;形成了一个高度耦合的整体。对于这样的系统&#xff0c;采用分阶段构建的…...

2024年12月9日历史上的今天大事件早读

1447年12月9日 中国明朝皇帝明宪宗出生 1824年12月9日 西属美洲独立战争的阿亚库乔之战爆发 1882年12月9日 中国清代数学家李善兰逝世 1917年12月9日 葡萄牙共和政府垮台 1935年12月9日 红军表示与东北抗联军一致抗日 1935年12月9日 “一二九”运动爆发 1941年12月9日 中…...

快捷构建AI大模型,源码自取可直接运行

Node.js 和 WebSocket 实现一个基于kimi&#xff08;Moonshot 月之暗大模型&#xff09;的AI工具 前端&#xff1a;前端界面比较容易&#xff0c;只需要简单的额css js即可&#xff0c;本文使用vue作为作为demo。 后端&#xff1a;我java很垃圾&#xff0c;写不出好的代码&am…...

怎么为开源项目做贡献提PR?

GitHub 慢的话&#xff0c;https://ask.csdn.net/questions/8166374 复刻项目 以 https://github.com/open-frame/uniapp-init 项目为例 复刻完就会在你的仓库里有个同样的项目 拉取复刻下来的项目 然后常规的改动项目、git推送。比如我改了一个忽略文件&#xff1a; 提交…...

如何在 JavaScript 中设置定时器?

在 JavaScript 中&#xff0c;设置定时器通常使用两个内置的函数&#xff1a;setTimeout() 和 setInterval()。它们允许你在指定的时间延迟后执行某个函数或者以某个间隔反复执行某个函数。下面&#xff0c;我将结合实际项目代码示例讲解如何使用它们。 1. setTimeout() — 延…...

【学习路线】Java

Java基础 基础 基础语法 面向对象 集合框架 JCF 进阶 并发编程 JVM 企业级开发 框架 Spring Boot Spring Cloud 分布式 高性能 高可用 安全 基建 Docker 实战 数据库 MySQL Redis 计算机基础 计算机组成原理 操作系统 计算机网络 数据结构与算法 设计模式 参考&#xff1a;…...

[GYCTF2020]Easyphp

[GYCTF2020]Easyphp 知识点 反序列化 、字符逃逸 解题 审代码 <?php error_reporting(0); session_start(); function safe($parm){$array array(union,regexp,load,into,flag,file,insert,"",\\,"*","alter");return str_replace($arr…...

JavaScript 数组的高级用法与最佳实践

在前端开发中&#xff0c;JavaScript 数组是不可或缺的工具。它们不仅用于存储数据&#xff0c;还提供了丰富的方法来操作和处理这些数据。掌握 JavaScript 数组的高级用法和最佳实践对于编写高效、可维护的代码至关重要。本文将深入探讨 JavaScript 数组的高级用法&#xff0c…...

通信协议 http、tcp、udp

目录 1. 五层网络协议 2. http 3. tcp、udp 4. tcp 3次握手、4次挥手 5. socket 6. httpclient 遇到的问题 1. Q: 使用 EntityUtils.toString(responseEntity, "UTF-8") 中文乱码 2. Q: org.apache.http.NoHttpResponseException: 221.6.16.203:8890 failed …...

Scala的隐式对象和隐式类

1.隐式对象 object Test1 {case class DatabaseConfig(drive:String,url:String)//隐式对象//格式:就是在对象前面加一个 implicit//作用:给函数当默认值implicit object MySqlConfig extends DatabaseConfig("sqlserver.jdbc","localhost:3306")//定义一…...

【AIGC】2016-ACCV-即时追捕:自然环境下的自动唇音同步

2016-ACCV-Out of time: automated lip sync in the wild 摘要1. 引言1.1 相关作品 2. 表示和架构2.1 音频流2.2 视觉流2.3 损失函数2.4 训练 3. 数据集3.1 编制训练数据 4. 实验4.1 确定口型同步误差4.2 应用&#xff1a;主动说话人检测4.3 应用&#xff1a;唇读 5. 结论参考文…...

启智畅想集装箱箱号识别算法,2台相机即可实现较高识别率

启智畅想集装箱箱号识别算法&#xff0c;在货车通道中使用时&#xff0c;一般配备2台相机即可。启智畅想集装箱箱号识别算法&#xff0c;在货车通道中使用时&#xff0c;一般配备2台相机即可实现对集装箱箱号的精准捕捉与识别。这两台相机分别安装在货车通道的后侧和随意侧面&a…...

让IIS支持PUT请求解决IIS里不支持PUT请求的问题405 Method Not Allowed

文章目录 一、问题描述二、解决方案1.删除WebDav模块2.修改Web.config&#xff08;可选&#xff09; 一、问题描述 好不容易系统开发好了&#xff0c;兴高采烈地上线&#xff0c;部署好了网站&#xff0c;访问正常&#xff0c;打开方式正确&#xff01; 但当我修改某些数据时&…...

入门级捡垃圾工作站记录

入门级捡垃圾工作站记录 想法 一直想着拥有有一台自己的多功能机子&#xff0c;一个笔记本很难事事包办&#xff0c;本来打算配一个台式机&#xff0c;后来研究了一下&#xff0c;索性捡垃圾拼装的工作站&#xff0c;性价比更高&#xff0c;稳定性也更强&#xff0c;而且还可…...

2024.12.9——攻防世界ics-06

知识点&#xff1a;index文件 ics 文件&#xff08;iCalendar 格式文件&#xff09; bp抓包 密码爆破 题目&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 一、解题思路 step 1 打开靶机审题…...

Krita插件组件缺失故障排除实战指南

Krita插件组件缺失故障排除实战指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-ai-…...

行波管(TWT)核心参数权衡:填充比、流通率与电子注效率的物理本质及工程设计

在行波管&#xff08;TWT&#xff09;设计中&#xff0c;填充比&#xff08;F&#xff09;、流通率&#xff08;ηₜᵣₐₙₛ&#xff09;与电子注效率&#xff08;ηₑ&#xff09;是决定器件性能的三大核心参数&#xff0c;三者并非独立存在&#xff0c;而是形成了紧密的物理…...

3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题

3步实现视频硬字幕精准提取&#xff1a;本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区…...

Qwen2.5-0.5B-Instruct新手入门:从零到一的AI助手搭建全流程

Qwen2.5-0.5B-Instruct新手入门&#xff1a;从零到一的AI助手搭建全流程 1. 认识Qwen2.5-0.5B-Instruct 1.1 模型特点与优势 Qwen2.5-0.5B-Instruct是阿里开源的通义千问系列中最轻量级的指令微调版本&#xff0c;专为资源有限环境优化设计。这个5.08亿参数的模型虽然体积小…...

保姆级避坑指南:在CentOS 7上手动部署MySQL 8.0二进制包(附systemd服务配置)

CentOS 7手动部署MySQL 8.0二进制包的深度避坑指南 在Linux服务器上手动部署MySQL数据库是每个运维工程师的必修课。不同于常见的yum或apt安装方式&#xff0c;二进制包部署能让你更深入地理解MySQL的运行机制&#xff0c;同时获得更灵活的控制权。但这条路并不平坦&#xff0c…...

STM32CubeIDE用DAP下载器?这份OpenOCD配置文件修改与复位难题解决指南请收好

STM32CubeIDE深度调优&#xff1a;DAP下载器OpenOCD配置与自动复位难题实战解析 当你在STM32CubeIDE中切换ST-LINK与DAP调试器时&#xff0c;是否注意到两者在用户体验上的显著差异&#xff1f;特别是当使用DAP调试器时&#xff0c;每次下载后都需要手动复位开发板才能运行程序…...

忍者像素绘卷部署案例:高校数字媒体实验室低成本构建像素艺术教学平台

忍者像素绘卷部署案例&#xff1a;高校数字媒体实验室低成本构建像素艺术教学平台 1. 项目背景与需求分析 数字媒体艺术教育正面临新的挑战与机遇。某高校数字媒体实验室在2023年教学评估中发现&#xff1a; 传统像素艺术教学依赖商业软件&#xff0c;授权费用高昂学生创作受…...

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断方法探索

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断 首先&#xff0c;利用格拉姆角场差(GADF)时频分辨率高、可以深度反映时间序列内在结构和关系的特点&#xff0c;对采集到的一维故障数据信号转为二维图像&#xff0c;得到图像后并将图像进行降维处理&#xff1b;然后&#xff0c;将第…...

国行iPhone Siri功能意外上线又撤回,背后暗藏玄机

iPhone“Siri”变身“Apple智能与Siri”&#xff0c;意外功能短暂亮相3月31日凌晨&#xff0c;部分国行iPhone用户惊喜发现&#xff0c;手机设置中的“Siri”入口悄然变更为“Apple智能与Siri”&#xff0c;同时还短暂解锁了端侧模型下载及AI功能。不过&#xff0c;这一新鲜体验…...

从服务暴露到语义裁剪:全面理解 SAP ABAP CDS projection view 的设计价值与实战用法

在很多 ABAP 开发者的直觉里,CDS view entity 已经足够强大:既能定义数据模型,也能承载丰富的语义注解,还能为 RAP、OData、分析场景提供统一的数据基础。可一旦进入真正的业务服务设计阶段,你很快就会发现,底层模型的完整能力,并不等于某个具体服务应该暴露给外部的能力…...