马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
B 树详解及其 Java 实现
1. 弁言
B 树是一种平衡树数据结构,广泛应用于数据库和文件体系中。它是一种多路搜索树,此中每个节点可以有多个子节点和多个键。本文将具体先容 B 树的结构、性子、操纵及其 Java 实现。
2. B 树的结构与性子
2.1 B 树的界说
B 树是一种自平衡的树数据结构,具有以下性子:
- 每个节点最多有 m 个子节点(m 为 B 树的阶)。
- 除根节点和叶子节点外,每个节点至少有 ⌈m/2⌉ 个子节点。
- 全部叶子节点都在同一层。
- 每个节点包罗 n 个键(⌈m/2⌉ - 1 <= n <= m - 1)。
- 节点的键按升序分列,节点的子节点按键值巨细分区。
2.2 B 树的应用
B 树广泛应用于数据库和文件体系中,其长处包罗:
- 平衡性:全部叶子节点都在同一层,包管查找、插入和删除操纵的时间复杂度为 O(log n)。
- 高效性:实用于磁盘存储,镌汰磁盘 I/O 操纵。
- 扩展性:支持动态增删数据,得当处理惩罚大规模数据。
3. B 树的操纵
3.1 插入操纵
插入操纵包罗以下步调:
- 查找插入位置。
- 将键插入到相应的节点。
- 假如节点键数高出最大值,则举行分裂操纵。
3.2 删除操纵
删除操纵包罗以下步调:
- 查找要删除的键。
- 从节点中删除键。
- 假如节点键数低于最小值,则举行归并或借用操纵。
4. B 树的 Java 实现
以下是 B 树的完备 Java 实现,包罗插入和删除操纵。
4.1 B 树节点类
- import java.util.ArrayList;
- import java.util.List;
- class BTreeNode<T extends Comparable<T>> {
- int t; // 最小度数
- List<T> keys; // 存储键
- List<BTreeNode<T>> children; // 存储子节点
- boolean leaf; // 是否为叶子节点
- BTreeNode(int t, boolean leaf) {
- this.t = t;
- this.leaf = leaf;
- this.keys = new ArrayList<>();
- this.children = new ArrayList<>();
- }
- // 查找键
- int findKey(T k) {
- int idx = 0;
- while (idx < keys.size() && keys.get(idx).compareTo(k) < 0) {
- idx++;
- }
- return idx;
- }
- // 插入非满节点
- void insertNonFull(T k) {
- int i = keys.size() - 1;
- if (leaf) {
- keys.add(null);
- while (i >= 0 && keys.get(i).compareTo(k) > 0) {
- keys.set(i + 1, keys.get(i));
- i--;
- }
- keys.set(i + 1, k);
- } else {
- while (i >= 0 && keys.get(i).compareTo(k) > 0) {
- i--;
- }
- if (children.get(i + 1).keys.size() == 2 * t - 1) {
- splitChild(i + 1, children.get(i + 1));
- if (keys.get(i + 1).compareTo(k) < 0) {
- i++;
- }
- }
- children.get(i + 1).insertNonFull(k);
- }
- }
- // 分裂子节点
- void splitChild(int i, BTreeNode<T> y) {
- BTreeNode<T> z = new BTreeNode<>(y.t, y.leaf);
- for (int j = 0; j < t - 1; j++) {
- z.keys.add(y.keys.remove(t));
- }
- if (!y.leaf) {
- for (int j = 0; j < t; j++) {
- z.children.add(y.children.remove(t));
- }
- }
- children.add(i + 1, z);
- keys.add(i, y.keys.remove(t - 1));
- }
- }
复制代码 4.2 B 树类
- public class BTree<T extends Comparable<T>> {
- private BTreeNode<T> root;
- private int t; // 最小度数
- public BTree(int t) {
- this.root = new BTreeNode<>(t, true);
- this.t = t;
- }
- // 插入键
- public void insert(T k) {
- BTreeNode<T> r = root;
- if (r.keys.size() == 2 * t - 1) {
- BTreeNode<T> s = new BTreeNode<>(t, false);
- s.children.add(r);
- s.splitChild(0, r);
- root = s;
- s.insertNonFull(k);
- } else {
- r.insertNonFull(k);
- }
- }
- // 删除键
- public void delete(T k) {
- if (root == null) {
- return;
- }
- root.delete(k);
- if (root.keys.isEmpty()) {
- root = root.leaf ? null : root.children.get(0);
- }
- }
- // 查找键
- public boolean search(T k) {
- return root == null ? false : root.search(k) != null;
- }
- }
复制代码 4.3 B 树节点删除方法
5. 示例测试
- public class Main {
- public static void main(String[] args) {
- BTree<Integer> bTree = new BTree<>(3);
- bTree.insert(10);
- bTree.insert(20);
- bTree.insert(5);
- bTree.insert(6);
- bTree.insert(12);
- bTree.insert(30);
- bTree.insert(7);
- bTree.insert(17);
- System.out.println("B树创建成功。");
- if (bTree.search(6)) {
- System.out.println("找到键 6");
- } else {
- System.out.println("未找到键 6");
- }
- bTree.delete(6);
- if (bTree.search(6)) {
- System.out.println("找到键 6");
- } else {
- System.out.println("未找到键 6");
- }
- }
- }
复制代码 6. 运行结果
运行上述代码将演示 B 树的插入和删除操纵。B 树将按次序插入键,然后删除键 6 并举行查找验证。
7. 总结
本文具体先容了 B 树的数据结构及其在 Java 中的实现,包罗插入、删除和查找操纵。通过明白和实践这些内容,可以资助你更好地把握 B 树的实现和应用。盼望本文对你有所资助,如有任何疑问或发起,接待留言讨论。
|