算法之B树

  1. package com.eshore.sweetop.exdataframe;
  2. public class BTree {
  3.     private BNode root;
  4.     private int min;
  5.     public BTree() {
  6.         BNode node = new BNode();
  7.         node.setLeaf(true);
  8.         node.setCount(0);
  9.         diskWrite(node);
  10.         root = node;
  11.     }
  12.     public void insert(int k) {
  13.         BNode r = root;
  14.         if (r.getCount() == (2 * min - 1)) {
  15.             BNode node = new BNode();
  16.             root = node;
  17.             node.setLeaf(false);
  18.             node.setCount(0);
  19.             node.getChildren().add(0, root);
  20.             split(node, 0, r);
  21.             insertNonFull(node, k);
  22.         } else {
  23.             insertNonFull(r, k);
  24.         }
  25.     }
  26.     public void split(BNode nodex, int i, BNode nodey) {
  27.         BNode nodez = new BNode();
  28.         nodez.setLeaf(nodey.getLeaf());
  29.         nodez.setCount(min - 1);
  30.         for (int j = 0; j < min - 1; j++) {
  31.             nodez.getKeys().add(j, nodey.getKeys().get(min + j));
  32.         }
  33.         if (!nodey.getLeaf()) {
  34.             for (int j = 0; j < min; j++) {
  35.                 nodez.getChildren().add(j, nodey.getChildren().get(min + j));
  36.             }
  37.         }
  38.         nodey.setCount(min - 1);
  39.         for (int j = nodex.getCount(); j > i; j--) {
  40.             if (j == nodex.getCount()) {
  41.                 nodex.getChildren().add(j + 1, nodex.getChildren().get(j));
  42.             } else {
  43.                 nodex.getChildren().set(j + 1, nodex.getChildren().get(j));
  44.             }
  45.         }
  46.         nodex.getChildren().set(i + 1, nodez);
  47.         for (int j = nodex.getCount() - 1; j > i; j++) {
  48.             if (j == nodex.getCount() - 1) {
  49.                 nodex.getKeys().add(j + 1, nodex.getKeys().get(j));
  50.             } else {
  51.                 nodex.getKeys().set(j + 1, nodex.getKeys().get(j));
  52.             }
  53.         }
  54.         nodex.getKeys().set(i, nodey.getKeys().get(min - 1));
  55.         nodex.setCount(nodex.getCount() + 1);
  56.         diskWrite(nodey);
  57.         diskWrite(nodez);
  58.         diskWrite(nodex);
  59.     }
  60.     public void insertNonFull(BNode node, int k) {
  61.         int i = node.getCount() - 1;
  62.         if (node.getLeaf()) {
  63.             while (i >= 0 && k <= node.getKeys().get(i)) {
  64.                 if (i == node.getCount()) {
  65.                     node.getKeys().add(i + 1, node.getKeys().get(i));
  66.                 } else {
  67.                     node.getKeys().add(i + 1, node.getKeys().get(i));
  68.                 }
  69.                 i--;
  70.             }
  71.             if (i == node.getCount()-1) {
  72.                 node.getKeys().add(i + 1, Integer.valueOf(i));
  73.             }else{
  74.                 node.getKeys().set(i + 1, Integer.valueOf(i));
  75.             }
  76.             node.setCount(node.getCount() + 1);
  77.             diskWrite(node);
  78.         } else {
  79.             while (i >= 0 && k <= node.getKeys().get(i)) {
  80.                 i--;
  81.             }
  82.             i++;
  83.             diskRead(node.getChildren().get(i));
  84.             if (node.getChildren().get(i).getCount() == (2 * min - 1)) {
  85.                 split(node, i, node.getChildren().get(i));
  86.                 if (Integer.valueOf(k) > node.getKeys().get(i)) {
  87.                     i++;
  88.                 }
  89.             }
  90.             insertNonFull(node.getChildren().get(i), k);
  91.         }
  92.     }
  93.     public void diskWrite(BNode node) {
  94.     }
  95.     public BNode diskRead(BNode bt) {
  96.         return null;
  97.     }
  98.     public static void main(String[] args) {
  99.         BTree bt = new BTree();
  100.         bt.insert(3);
  101.     }
  102. }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值