摘要:
package learn.btree; /************************************************************************* * Compilation: javac BTree.java * Execution: java BTree * * B-tree. * * Limitations * ----------- * - Assumes M is even and M >= 4 * - should b be an array of children or list (it would help with * casting to make it a list) * * http://algs4.cs.princeton.edu/62btrees/BTree.java.html *************************************************************************/ public class BTree, Value> { private static final int NODE_MAX_CHILD = 4; // max children per B-tree node = M-1 private Node root; // root of the B-tree private int treeHeight; // height of the B-tree private int kvNum; // number of key-value pairs in the B-tree // helper B-tree node data type private static final class Node { private int childNum; // number of children private Entry[] children = new Entry[NODE_MAX_CHILD]; // the array of children private Node(int k) { childNum = k; } // create a node with k children } // internal nodes: only use key and next // external nodes: only use key and value private static class Entry { private Comparable key; private Object value; private Node next; // helper field to iterate over array entries public Entry(Comparable key, Object value, Node next) { this.key = key; this.value = value; this.next = next; } } // constructor public BTree() { root = new Node(0); } // return number of key-value pairs in the B-tree public int size() { return kvNum; } // return height of B-tree public int height() { return treeHeight; } // search for given key, return associated value; return null if no such key public Value get(Key key) { return search(root, key, treeHeight); } private Value search(Node x, Key key, int ht) { Entry[] children = x.children; // external node if (ht == 0) { for (int j = 0; j < x.childNum; j++) { if (eq(key, children[j].key)) return (Value) children[j].value; } } // internal node else { for (int j = 0; j < x.childNum; j++) { if (j+1 == x.childNum || less(key, children[j+1].key)) return search(children[j].next, key, ht-1); } } return null; } // insert key-value pair // add code to check for duplicate keys public void put(Key key, Value value) { Node u = insert(root, key, value, treeHeight); kvNum++; if (u == null) return; // need to split root Node t = new Node(2); t.children[0] = new Entry(root.children[0].key, null, root); t.children[1] = new Entry(u.children[0].key, null, u); root = t; treeHeight++; } private Node insert(Node h, Key key, Value value, int ht) { int j; Entry t = new Entry(key, value, null); // external node if (ht == 0) { for (j = 0; j < h.childNum; j++) { if (less(key, h.children[j].key)) break; } } // internal node else { for (j = 0; j < h.childNum; j++) { if ((j+1 == h.childNum) || less(key, h.children[j+1].key)) { Node u = insert(h.children[j++].next, key, value, ht-1); if (u == null) return null; t.key = u.children[0].key; t.next = u; break; } } } for (int i = h.childNum; i > j; i--) h.children[i] = h.children[i-1]; h.children[j] = t; h.childNum++; if (h.childNum < NODE_MAX_CHILD) return null; else return split(h); } // split node in half private Node split(Node h) { Node t = new Node(NODE_MAX_CHILD/2); h.childNum = NODE_MAX_CHILD/2; for (int j = 0; j < NODE_MAX_CHILD/2; j++) t.children[j] = h.children[NODE_MAX_CHILD/2+j]; return t; } // for debugging public String toString() { return toString(root, treeHeight, "") + " "; } private String toString(Node h, int ht, String indent) { String s = ""; Entry[] children = h.children; if (ht == 0) { for (int j = 0; j < h.childNum; j++) { s += indent + children[j].key + " " + children[j].value + " "; } } else { for (int j = 0; j < h.childNum; j++) { if (j > 0) s += indent + "(" + children[j].key + ") "; s += toString(children[j].next, ht-1, indent + " "); } } return s; } // comparison functions - make Comparable instead of Key to avoid casts private boolean less(Comparable k1, Comparable k2) { return k1.compareTo(k2) < 0; } private boolean eq(Comparable k1, Comparable k2) { return k1.compareTo(k2) == 0; } /************************************************************************* * test client *************************************************************************/ public static void main(String[] args) { BTree st = new BTree (); // st.put("www.cs.princeton.edu", "128.112.136.12"); st.put("www.cs.princeton.edu", "128.112.136.11"); st.put("www.princeton.edu", "128.112.128.15"); st.put("www.yale.edu", "130.132.143.21"); st.put("www.simpsons.com", "209.052.165.60"); st.put("www.apple.com", "17.112.152.32"); st.put("www.amazon.com", "207.171.182.16"); st.put("www.ebay.com", "66.135.192.87"); st.put("www.cnn.com", "64.236.16.20"); st.put("www.google.com", "216.239.41.99"); st.put("www.nytimes.com", "199.239.136.200"); st.put("www.microsoft.com", "207.126.99.140"); st.put("www.dell.com", "143.166.224.230"); st.put("www.slashdot.org", "66.35.250.151"); st.put("www.espn.com", "199.181.135.201"); st.put("www.weather.com", "63.111.66.11"); st.put("www.yahoo.com", "216.109.118.65"); System.out.println("cs.princeton.edu: " + st.get("www.cs.princeton.edu")); System.out.println("hardvardsucks.com: " + st.get("www.harvardsucks.com")); System.out.println("simpsons.com: " + st.get("www.simpsons.com")); System.out.println("apple.com: " + st.get("www.apple.com")); System.out.println("ebay.com: " + st.get("www.ebay.com")); System.out.println("dell.com: " + st.get("www.dell.com")); System.out.println(); System.out.println("size: " + st.size()); System.out.println("height: " + st.height()); System.out.println(st); System.out.println(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65998.html
摘要:但是這將嚴重影響程序的性能。垂直分區(qū)的優(yōu)點在于可以使得行數(shù)據(jù)變小,在查詢時減少讀取的數(shù),減少次數(shù)。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護。垂直分區(qū)的缺點在于主鍵會出現(xiàn)冗余,需要管理冗余列,并會引起操作,可以通過在應(yīng)用層進行來解決。 Java面試通關(guān)手冊(Java學(xué)習(xí)指南,歡迎Star,會一直完善下去,歡迎建議和指導(dǎo)):https://github.com/Snailclimb/Jav...
摘要:串行最高的隔離級別,完全服從的隔離級別。但是這將嚴重影響程序的性能。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護。 我自己總結(jié)的Java學(xué)習(xí)的一些知識點以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java_Guide 書籍推薦 《高性能MySQL : 第3版》 文字教程推薦 MySQL 教程(菜鳥教程...
閱讀 3925·2021-10-12 10:12
閱讀 2886·2021-09-10 11:18
閱讀 3673·2019-08-30 15:54
閱讀 2808·2019-08-30 15:53
閱讀 638·2019-08-30 13:54
閱讀 965·2019-08-30 13:21
閱讀 2260·2019-08-30 12:57
閱讀 1687·2019-08-30 11:10