国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

BTree的Java簡單實現(xiàn)

winterdawn / 2626人閱讀

摘要:

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

相關(guān)文章

  • 關(guān)于MySQL知識點與面試常見問題都在這里

    摘要:但是這將嚴重影響程序的性能。垂直分區(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...

    LeoHsiun 評論0 收藏0
  • 關(guān)于MySQL知識點與面試常見問題都在這里

    摘要:串行最高的隔離級別,完全服從的隔離級別。但是這將嚴重影響程序的性能。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護。 我自己總結(jié)的Java學(xué)習(xí)的一些知識點以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java_Guide 書籍推薦 《高性能MySQL : 第3版》 文字教程推薦 MySQL 教程(菜鳥教程...

    hss01248 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<