java / C++ B+树代码
C++ 代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
struct _ILinkNode;
struct _ILink;
struct _BPTreeNode;
struct _BPTree;
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
typedef struct _ILinkNode {
int key;
struct _BPTreeNode * value;
struct _ILinkNode * pre;
struct _ILinkNode * next;
} ILinkNode ;
void ILinkNode_insertNext(ILinkNode * node, int key) {
ILinkNode node =
}
void ILinkNode_insertPrepare(ILinkNode * node, int key) {
}
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
typedef struct _ILink {
struct _ILinkNode * head;
struct _ILinkNode * mid;
struct _ILinkNode * tail;
} ILink ;
void ILink_pushHead(struct _ILink * this, const int key) {
ILinkNode* node = (ILinkNode*)malloc(sizeof(ILinkNode));
node -> key = key;
if (this -> head == NULL) {
this -> head = this -> mid = this -> tail = node;
return;
}
node -> pre = NULL;
node -> next = this -> head;
this -> head -> pre = node;
this -> head = node;
}
void ILink_pushTail(struct _ILink * this, const int key) {
ILinkNode* node = (ILinkNode*)malloc(sizeof(ILinkNode));
node -> key = key;
if (this -> head == NULL) {
this -> head = this -> mid = this -> tail = node;
return;
}
node -> next = NULL;
node -> pre = this -> tail;
this -> tail -> next = node;
this -> tail = node;
}
ILink * initLink() {
ILink * ans = (ILink *)malloc(sizeof(ILink));
ans -> head = ans -> mid = ans -> tail = NULL;
return ans;
}
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
typedef struct _BPTreeNode {
struct _ILink * link;
} BPTreeNode ;
BPTreeNode * initTreeNode(const int key) {
BPTreeNode * ans = (BPTreeNode *)malloc(sizeof(BPTreeNode));
ans -> link = initLink();
ILink_pushTail(ans -> link, key);
return ans;
}
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
typedef struct _BPTree {
int count;
int m;
int hight;
BPTreeNode* root;
int (*size)(struct _BPTree *this);
void (*add)(struct _BPTree *this, const int key);
void (*delete)(struct _BPTree *this, const int key);
int (*contains)(struct _BPTree *this, const int key);
void (*destroy)(struct _BPTree *this);
} BPTree ;
int BPTree_size(BPTree *this) {
return this -> count;
}
void BPTree_add(BPTree *this, const int key) {
if (this -> root == NULL) {
this -> root = initTreeNode(key);
this -> hight = 1;
this -> count ++;
return;
}
}
void BPTree_delete(BPTree *this, const int key) {
}
int BPTree_contains(BPTree *this, const int key) {
return 0;
}
void BPTree_destroy(BPTree *this) {
}
BPTree * initBPTree(int nodeMaxCnt) {
assert(nodeMaxCnt > 4);
BPTree * ans = (BPTree*)malloc(sizeof(BPTree));
ans -> add = BPTree_add;
ans -> size = BPTree_size;
ans -> destroy = BPTree_destroy;
ans -> delete = BPTree_delete;
ans -> contains = BPTree_contains;
ans -> count = 0;
ans -> root = NULL;
ans -> m = nodeMaxCnt;
ans -> hight = 0;
return ans;
}
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
int main () {
return 0;
}
#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()); } }

浙公网安备 33010602011771号