模拟oracle 索引平衡树叶子节点

import java.util.ArrayList;

import java.util.List;

// 模拟Oracle中的ROWID,唯一标识表中的一行数据

class RowId {

private String dataFile; // 数据文件号

private int blockNumber; // 块号

private int rowNumber; // 行号

public RowId(String dataFile, int blockNumber, int rowNumber) {

this.dataFile = dataFile;

this.blockNumber = blockNumber;

this.rowNumber = rowNumber;

}

@Override

public String toString() {

return dataFile + ":" + blockNumber + ":" + rowNumber;

}

}

// B树索引的叶子节点

class LeafNode {

private int key; // 索引键值

private RowId rowId; // 对应的行ID

private LeafNode prev; // 左指针,指向前一个叶子节点

private LeafNode next; // 右指针,指向后一个叶子节点

public LeafNode(int key, RowId rowId) {

this.key = key;

this.rowId = rowId;

}

// getter和setter方法

public int getKey() {

return key;

}

public RowId getRowId() {

return rowId;

}

public LeafNode getPrev() {

return prev;

}

public void setPrev(LeafNode prev) {

this.prev = prev;

}

public LeafNode getNext() {

return next;

}

public void setNext(LeafNode next) {

this.next = next;

}

@Override

public String toString() {

return "Key: " + key + ", ROWID: " + rowId;

}

}

// 模拟B树索引的叶子节点双向链表

public class BTreeLeafNodes {

public static void main(String\[\] args) {

// 创建几个叶子节点

LeafNode node1 = new LeafNode(10, new RowId("f1", 100, 5));

LeafNode node2 = new LeafNode(20, new RowId("f1", 102, 3));

LeafNode node3 = new LeafNode(30, new RowId("f2", 50, 8));

LeafNode node4 = new LeafNode(40, new RowId("f2", 55, 2));

// 构建双向链表

connectNodes(node1, node2);

connectNodes(node2, node3);

connectNodes(node3, node4);

// 从头部遍历链表

System.out.println("从头部遍历叶子节点:");

LeafNode current = node1;

while (current != null) {

System.out.println(current);

current = current.getNext();

}

// 从尾部遍历链表

System.out.println("\n从尾部遍历叶子节点:");

current = node4;

while (current != null) {

System.out.println(current);

current = current.getPrev();

}

// 模拟范围查询 (key between 20 and 30)

System.out.println("\n范围查询结果 (key between 20 and 30):");

List<LeafNode> result = rangeQuery(node1, 20, 30);

for (LeafNode node : result) {

System.out.println(node);

}

}

// 连接两个叶子节点,建立双向关系

private static void connectNodes(LeafNode prevNode, LeafNode nextNode) {

prevNode.setNext(nextNode);

nextNode.setPrev(prevNode);

}

// 模拟范围查询,利用双向链表特性

private static List<LeafNode> rangeQuery(LeafNode head, int minKey, int maxKey) {

List<LeafNode> result = new ArrayList<>();

LeafNode current = head;

// 找到起始节点

while (current != null && current.getKey() < minKey) {

current = current.getNext();

}

// 收集范围内的节点

while (current != null && current.getKey() <= maxKey) {

result.add(current);

current = current.getNext();

}

return result;

}

}

相关推荐
jnrjian4 小时前
CDB 中某个PDB的datafile 丢失 没有备份过也可恢复 需要来回切换CDB PDB
oracle
zandy10115 小时前
衡石科技 NL2Metrics 技术深度解析(2026):ChatBI 准确度破局的关键路径
数据库·科技·oracle
Java小白笔记5 小时前
Linux 手动部署 Oracle JDK 17 完全指南
java·linux·oracle
anew___6 小时前
《数据库原理》精要解读(三)—— SQL:与数据库对话的艺术
数据库·sql·oracle
六月雨滴9 小时前
Oracle RMAN 安全与加密
安全·oracle·dba
曹牧9 小时前
Oracle:UNIX时间戳
数据库·oracle·unix
DarkAthena11 小时前
【ORACLE】添加短信以外的双因素认证方式
oracle
Irene199111 小时前
Oracle(字符集分为服务端和客户端) 和 Hive(依赖 MySQL(或 PostgreSQL)存储元数据)字符集编码格式查询,中文乱码处理
hive·sql·oracle
网管NO.111 小时前
SQL 企业实战全流程|全覆盖前置基础 + 核心语法(MySQL8.0 可直接运行)
数据库·oracle
大尚来也11 小时前
主键、外键、索引,一篇讲透
java·数据库·oracle