java / C++ B+树代码
C++ 代码
#include <>
JAVA 代码
package org.test.me.struct; /**
* author: shuly
* create: 2018-09-11 上午11:38
* Description: 和 b+tree 的区别是 没有 维护叶子结点的 链表结构
*/ @SuppressWarnings("unchecked")
public class SimpleBPTree<K extends Comparable<K>,V> { private static final class Node {
int m;
Entry[] children;
Node(int max) {
this.m = 0;
children = new Entry[max];
} Entry popHead() {
Entry ans = children[0];
for(int i = 0; i < m - 1; ++i){
children[i] = children[i+1];
}
children[--m] = null;
return ans;
} void pushHead(Entry key) {
for(int i = m ; i > 0 ; --i) {
children[i] = children[i-1];
}
children[0] = key;
++m;
} Entry popBack() {
Entry ans = children[--m];
children[m] = null;
return ans;
} void pushBack(Entry key) {
children[m++] = key;
} void pushBack(Node one) {
for(int i = 0 ; i < one.m; ++i) {
children[m++] = one.children[i];
}
} Entry pop(int i) {
Entry ans = children[i];
for(; i + 1< m; ++i) {
children[i] = children[i+1];
}
children[--m] = null;
return ans;
}
} private static class Entry {
private Comparable key;
private Object val;
private Node next; // 里面结点的值大于等于 Key
public Entry(Comparable key, Object val, Node next) {
this.key = key;
this.val = val;
this.next = next;
}
} private static int M = 6;
private static int MIN = M / 2;
private int size;
private int height;
private Node root; public SimpleBPTree() {
root = new Node(M);
size = 0;
height = 1;
} public int size() {
return size;
} public boolean isEmpty() {
return size() == 0;
} public void put(K k, V v) {
assert k != null;
Node aha = insert(root, k, v, 1);
++ size;
if (aha != null) {
Node R = new Node(M);
R.children[0] = new Entry(root.children[0].key, null, root);
R.children[1] = new Entry(aha.children[0].key, null, aha);
R.m = 2;
this.root = R;
++ height;
}
} public V get(K key) {
assert key != null;
return find(root, key, 1);
} public V remove(K key) {
assert key != null;
V ans = delete(root, key, 1);
if (root.m == 1 && height != 1) {
root = root.children[0].next;
-- height;
}
return ans;
} private V delete(Node now, K k, int h) {
if (h == height) {
for(int i = 0 ; i < now.m; ++i) {
int ret = k.compareTo((K) now.children[i].key);
if (ret == 0) {
size--;
return (V) now.pop(i).val;
}
else if (ret < 0) return null;
}
return null;
} else {
for(int i = 0; i < now.m; ++i) {
if (i + 1 == now.m || k.compareTo((K) now.children[i + 1].key) < 0) {
V ans = delete(now.children[i].next, k, h + 1);
now.children[i].key = now.children[i].next.children[0].key;
if (now.children[i].next.m < MIN) { // 想办法凑凑, 凑不够就 合并
if(i + 1 != now.m && now.children[i + 1].next.m > MIN) {
// 右侧的失主! 请把第一个给我
Entry key = now.children[i + 1].next.popHead();
now.children[i+1].key = now.children[i+1].next.children[0].key; now.children[i].next.pushBack(key);
} else if (i != 0 && now.children[i - 1].next.m > MIN) {
// 左侧的失主! 请把最后一个给我
Entry key = now.children[i - 1].next.popBack(); now.children[i].next.pushHead(key);
now.children[i].key = now.children[i].next.children[0].key;
} else {
// 找一个老实人 一起过
int start;
if (i + 1 != now.m) {
now.children[i].next.pushBack(now.children[i+1].next);
start = i + 1;
now.pop(start);
} else if (i != 0) {
now.children[i-1].next.pushBack(now.children[i].next);
start = i;
now.pop(start);
}
// 根 的缩水没有枚举
}
}
return ans;
}
}
// BKN
return null;
}
} private Node insert(Node now, K k, V v, int h) {
Entry in = new Entry(k, v, null);
int pos;
if (h == height) { // leaf
for(pos = 0; pos < now.m; ++pos) {
if (k.compareTo((K) now.children[pos].key) <= 0) break;
}
} else {
for(pos = 0 ; pos < now.m; ++pos) {
if (pos+1 == now.m || (k.compareTo((K) now.children[pos+1].key) < 0)) {
Node one = insert(now.children[pos].next, k, v, h + 1);
if (one == null) return null;
in.key = one.children[0].key;
in.next = one;
in.val = null;
++ pos;
break;
}
}
}
for(int j = now.m; j > pos; --j) {
now.children[j] = now.children[j-1];
}
now.children[pos] = in;
++ now.m;
if (now.m < M) return null;
else return split(now);
} private Node split(Node node) {
Node next = new Node(M);
next.m = node.m = MIN;
for (int j = 0; j < MIN; j++) {
next.children[j] = node.children[MIN + j];
node.children[MIN + j] = null;
}
return next;
} private V find(Node now, K key, int h){
Entry[] children = now.children;
if (h == height) {
for (int j = 0; j < now.m; j++) {
if (key.compareTo((K) children[j].key) == 0 ) {
return (V) children[j].val;
}
}
} else {
for (int j = 0; j < now.m; j++) {
if (j+1 == now.m || (key.compareTo((K) children[j+1].key) < 0)) {
return find(children[j].next, key, h + 1);
}
}
}
return null;
} public String toString() {
return toString(root, 1, "") + "\n";
} private String toString(Node h, int ht, String indent) {
StringBuilder s = new StringBuilder();
Entry[] children = h.children;
if (ht == height) {
for (int j = 0; j < h.m; j++) {
s.append(indent).append(children[j].key).append(" ").append((children[j]).val).append("\n");
}
} else {
for (int j = 0; j < h.m; j++) {
s.append(indent).append("(").append(children[j].key).append(")").append("\n");
s.append(toString((children[j]).next, ht + 1, indent + " "));
}
}
return s.toString();
} public static void main(String[] args) {
SimpleBPTree<Integer, String> map = new SimpleBPTree<>(); for(int i = 1 ; i <= 10; ++ i) {
map.put(i, i + "");
}
for(int i = 20; i >= 11; --i) {
map.put(i, i + "");
}
for(int i = 21; i <= 30 ;++i) {
map.put(i, i + "");
}
map.remove(1);
map.remove(3); map.remove(12);
map.remove(11);
map.remove(10); map.remove(2);
map.remove(4);
map.remove(5);
map.remove(6); map.remove(18);
map.remove(13);
map.remove(14);
map.remove(15);
map.remove(16);
map.remove(17);
map.remove(19);
map.remove(7);
map.remove(8);
map.remove(9);
map.remove(20); map.remove(21);
map.remove(22);
map.remove(23);
map.remove(27); map.remove(28);
map.remove(29);
map.remove(30);
map.remove(24);
map.remove(25);
map.remove(26); System.out.println(map.toString());
}
}
java / C++ B+树代码的更多相关文章
- 《阿里巴巴Java开发手册》代码格式部分应用——idea中checkstyle的使用教程
<阿里巴巴Java开发手册>代码格式部分应用--idea中checkstyle的使用教程 1.<阿里巴巴Java开发手册> 这是阿里巴巴工程师送给各位软件工程师的宝典,就像开车 ...
- 设计模式-Java版-全-附代码-超生动实例
阅读推荐:设计模式-简单篇 项目地址:https://gitee.com/zwtgit/gof23 学习网站推荐: https://refactoringguru.cn/design-patterns ...
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- 转:java怎么用一行代码初始化ArrayList
java怎么用一行代码初始化ArrayList 您可以创建一个工厂方法: public static ArrayList<String> createArrayList(String .. ...
- java中的静态代码块、构造代码块、构造方法
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
- 在Java中执行js代码
在某些特定场景下,我们需要用Java来执行Js代码(如模拟登录时,密码被JS加密了的情况),操作如下: ScriptEngineManager mgr = new ScriptEngineManage ...
- java中执行js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...
- 如何把java代码转换成smali代码
1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码.但是在学习Smali语法的过程中,有时候需要进行java代码和 ...
- JNI_最简单的Java调用C/C++代码
JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...
随机推荐
- STM32的Flash
STM32中存储区分为:随机存取存储器RAM和只读存储器ROM. 其中: RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失. ROM为常说的硬 ...
- Windows安装两个mysql数据库步骤
因为新旧项目数据库版本号差距太大.编码格式不同.引擎也不同,所以仅仅好装两个数据库. 本次安装两个mysql数据库.版本号各自是4.0.18,5.5.36.都是可运行文件直接安装. 本机上之前已经安装 ...
- GPU方法做倒排压缩和交集计算
之前一直想读这篇,今天读了一下,颇有收获: 1.对文档按相似term聚类之后,delta较小,能够提高压缩率(similarity graph) 1.GPU一般能够有几百个核,有shared memo ...
- Gonet2 游戏server框架解析之gRPC提高(5)
上一篇blog是关于gRPC框架的基本使用,假设说gRPC仅仅是远程发几个參数,那和一个普通的http请求也没多大区别了. 所以今天我就来学习一下gRPC高级一点的用法. 流! 流能够依据用法,分为单 ...
- FPGA主要应用
FPGA主要应用: 1.逻辑控制(逻辑接口领域) 传统方向,主要用于通信设备的高速接口电路设计,用FPGA处理高速接口的协议,并完成高速的数据收发和交换.FPGA最初以及到目前最广的应用就是在通信领域 ...
- centos7 zabbix3.4.6显示中文乱码问题
工具 : winscp (Linux Windows 传输文件工具) 当部署完zabbix然后显示中文会出现如下图 然后此时先去windows的文字目录如 C:\Windows\Fonts 随便托个字 ...
- linux RAC 安装失败完全卸载
1,删除软件安装目录 rm -rf /u01/app 2,删除以下目录内容 rm -rf /tmp/.oracle rm -rf /tmp/* rm -rf /tmp/ora* rm -rf ...
- python 批量下载文件
file.txt 的内容为: http://183.xxx.xxx.54:188/my/qqq.ico::qq.exe::0::http://183.xxx.xxx.54:186/my/ddnf.ic ...
- 【RHEL7/CentOS7服务控制之systemctl命令】
Systemd对于Linux来说,就是一个init程序,可以作为sysVinit和Upstat的替代. RHEL7监控和控制Systemd的主要命令是systemctl,该命令可查看系统状态和管理系统 ...
- MYSQL查询数据中通讯最多的两个人
SELECT GREATEST( sender_id, recipient_id ) , LEAST( sender_id, recipient_id ) , COUNT( * ) AS aFROM ...