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

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

http://www.dtcms.com/a/495025.html

相关文章:

  • Android 内存优化
  • Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)
  • Python快速落地的临床知识问答与检索项目(2025年9月教学实现部分)
  • 从0到1掌握Spring Boot自动配置:自定义配置实战指南
  • 索引设计速查:哪些字段该建索引?哪些不能建?
  • 自己的主机做网站服务器小树建站平台
  • 英集芯-IP5385开发调试总结
  • ProfiNet转EtherNet/IP工业PLC网关:打通仓储PLC与机器人通讯链路
  • Linux C/C++ 学习日记(27):KCP协议(三):代码结构分析与使用示例
  • 系统移植篇之uboot-5:DDR内存
  • 新开传奇网站刚开上海软件开发公司排名
  • C语言之可变参函数
  • Centos 7 环境下mysql的安装及配置
  • CentOS修改MySQL数据目录后重启失败的问题及解决方案
  • 南宁市优化网站宜昌网站建设
  • 医药网站 备案做哪个网站的直播好
  • 永磁同步电机电流环低“采样与基频比率”(S2F)性能影响与改进
  • Vue3 - defineExpose的使用
  • Go Web 编程快速入门 01 - 环境准备与第一个 Web 应用
  • 图像处理之腐蚀算法-收缩去噪
  • 基于单片机的智能鱼塘饵料投喂系统设计
  • 串扰16-保护地线
  • LED氛围灯方案开发MCU控制芯片
  • 博客网站素材做网络推广一个月多少钱
  • txt怎么做网站wordpress the7 theme
  • 国产OCR模型荣登HF榜首——PaddleOCR-VL技术详解与多场景实测
  • seo网站排名优化快速排ppt背景模板免费下载
  • 保山市住房和城乡建设厅网站长春火车站人工电话
  • 网站开发内容和方法无锡市建设培训中心网站
  • 【Win32 多线程程序设计基础第七章笔记】