数据结构第一弹-高级数据结构

ops/2024/12/14 3:16:53/

大家好,今天和大家一起学习一下数据结构中的高级数据结构,比如Trie树,并查集等~

除了常见的数组、链表、栈、队列等基本数据结构外,还有许多高级数据结构能够解决特定问题,提供更高效或更优雅的解决方案。今天一起分享两种非常有用的高级数据结构——Trie树(字典树)和并查集(Union-Find)。

1. Trie树

1.1 概念

Trie树,也称为前缀树或字典树,是一种用于存储字符串集合的数据结构。它特别适用于快速查找和插入操作,尤其是在处理大量字符串时表现优异。Trie树中的每个节点代表一个字符,并且从根节点到某一节点的路径上所有字符连接起来即为该节点所代表的字符串。Trie树通常用于自动补全、拼写检查等功能。

1.2 工作原理

  • 插入:从根节点开始遍历,根据当前字符创建新节点或移动到已存在的子节点。如果到达了单词末尾,则标记该节点表示一个完整的单词。
  • 搜索:同样从根节点开始,按照目标字符串的字符顺序向下遍历。如果中途遇到不存在的字符,则返回未找到;如果成功遍历到字符串末尾并且最后一个节点被标记为单词结束,则表示找到了该单词。
  • 删除:删除操作较为复杂,需要递归地从叶子节点向上回溯,只有当某个节点的所有子节点都为空且该节点不是其他单词的一部分时才能真正删除。

1.3 代码示例 

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;}
}

2. 并查集

2.1 概念

并查集是一种用来管理不相交集合的数据结构,支持合并两个集合以及查询两个元素是否属于同一个集合的操作。它广泛应用于图论算法、网络分析等领域,如判断连通分量、检测环路等。

2.2 工作原理

  • 初始化:每个元素最初都是自己集合的代表元。
  • 查找:查找给定元素所属集合的代表元。为了优化效率,可以使用路径压缩技术,即将路径上的每个节点直接指向根节点。
  • 合并:将两个集合合并成一个新的集合。这可以通过将一个集合的根节点指向另一个集合的根节点来完成。为了保持树的平衡,还可以采用按秩合并策略,即总是让较小的树成为较大的树的子树。

2.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);}
}

3. 应用实例

3.1 Trie树的应用

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

3.2 并查集的应用

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

Trie树以其高效的字符串操作能力在文本处理领域有着广泛的应用,而并查集则因其简洁的接口和强大的集合管理能力成为了许多算法的基础组件之一。掌握这些数据结构有助于我们在面对特定问题时选择最合适的技术方案,欢迎大家一起讨论~


http://www.ppmy.cn/ops/141701.html

相关文章

力扣打卡11:合并区间(比较器内联,引用传参的优化)

链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 这道题可以用贪心。 首先将intervals的left&#xff08;intervals[i][0]&#xff09;排序。 然后拿出第一个区间&#xff0c;比较后面相邻的区间&#xff1a; 当前right<后left&#xff0c;表示下一…

kubeadm安装K8s集群之基础环境配置

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群基础环境配置 1.首先确保所有机器可以通信&#xff0c;然后配置主机host…

在Ubuntu 22.04上搭建Kubernetes集群

Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes&#xff08;常简称为 K8s&#xff09;是一个强大的开源平台&#xff0c;用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation&#xff08;CNCF&#xff0…

基于Dockerfile的博客管理系统的容器化部署

目录 任务描述 3 1.1课题的基本内容 3 1.2 项目整体技术架构 3 1.3主要技术栈&#xff1a; 3 1.4 模块划分 4 1.5 容器集群化部署的任务内容 5 1.6 项目容器化部署的目的 6总体结构 7 2.1 容器角色和功能 7 2.2 容器之间的关联关系 8 2.3 数据流动示例 8 3.详细设计 9 3.1 设计…

CLIP论文提炼与代码实战

今天和大家分享一篇多模态的经典论文&#xff0c;大名鼎鼎的CLIP&#xff1a;Learning Transferable Visual Models From Natural Language Supervision[pdf] 文章目录 一、论文提炼二、论文疑问三、代码演示CodeDemo 一、论文提炼 Source&#xff08;来源&#xff09;: ICML2…

VS2019 + Linux 跨平台开发中的 sqlite3 数据库环境配置

Visual Studio 2019 + Linux 跨平台开发中的 sqlite3 数据库环境配置 参考文章链接:Sqlite3环境配置(Windows和Linux) 源码资源下载:SQLite Download Page把源码.tar.gz包复制到Ubuntu下(/opt/Sqlite3/),并新建一个文件夹(/root/sqlite3_build)作为等会配置输出的文件…

力扣题目 - 2931.购买物品的最大开销

题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …

JAVA数据结构

1.数组 (Array): 固定大小的容器,用于存储相同类型的元素,数组在内存中是连续存储的,支持通过索引快 速访问元素。 int[] numbers = new int[10]; numbers[0] = 1;2.Java Collections Framework (JCF) JCF提供了一组接口和类用于管理和操作集合(如列表,集合,…