模拟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;

}

}

相关推荐
山岚的运维笔记19 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
geovindu1 天前
sql: Transaction & Concurrency Patterns using Oracel 21c
oracle·数据库开发·数据库架构
jnrjian1 天前
DRG-50857 ORA-30576 drixmd.PurgeKGL CTXSYS
数据库·oracle
jnrjian1 天前
Domain index 解决中英文 联合查询
oracle
jnrjian1 天前
Domain sync job SCHEDULER 空白job
oracle
TLA技术1 天前
LogMiner vs 裸日志解析(三):Oracle日志解析中的“前镜像”和“后镜像”,到底怎么用?
数据库·oracle·flink·dba·迁移学习
点纭2 天前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
oradh3 天前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)
数据库·oracle
达梦数据3 天前
DMDRS辅助表生成规则与作用
数据库·oracle
达梦数据3 天前
DMDRS空间数据类型说明:Oracle、DM8、MySQL空间数据类型映射
数据库·mysql·oracle