SeparateChainingHashST

简书 賈小強
转载请注明原创出处,谢谢!

package com.lab1.test3;

import java.util.LinkedList;
import java.util.Queue;

public class SeparateChainingHashST<Key, Value> {
    private static final int INIT_CAPACITY = 4;
    private int n;
    private int m;
    private SequentailSearchST<Key, Value>[] st;

    public SeparateChainingHashST() {
        this(INIT_CAPACITY);
    }

    public SeparateChainingHashST(int m) {
        this.m = m;
        st = new SequentailSearchST[m];
        for (int i = 0; i < m; i++) {
            st[i] = new SequentailSearchST<>();
        }
    }

    private void resize(int capacity) {
        SeparateChainingHashST<Key, Value> temp = new SeparateChainingHashST<>(capacity);
        for (int i = 0; i < m; i++) {
            for (Key key : st[i].keys()) {
                temp.put(key, st[i].get(key));
            }
        }
        this.m = temp.m;
        this.st = temp.st;
    }

    private int hash(Key key) {
        return (key.hashCode() & 0x7fffffff) % m;
    }

    private void delete(Key key) {
        int i = hash(key);
        if (st[i].contains(key)) {
            n--;
        }
        st[i].delete(key);
        if (n <= m * 2) {
            resize(m / 2);
        }
    }

    private Iterable<Key> keys() {
        Queue<Key> queue = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (Key key : st[i].keys()) {
                queue.add(key);
            }
        }
        return queue;
    }

    private Value get(Key key) {
        int i = hash(key);
        return st[i].get(key);
    }

    private boolean contains(Key key) {
        return get(key) != null;
    }

    private boolean isEmpty() {
        return n == 0;
    }

    private int size() {
        return n;
    }

    private void put(Key key, Value value) {
        if (n >= m * 10) {
            resize(m * 2);
        }
        int i = hash(key);
        if (!st[i].contains(key)) {
            n++;
        }
        st[i].put(key, value);
    }

    public static void main(String[] args) {
        SeparateChainingHashST<String, Integer> st = new SeparateChainingHashST<>();
        String test = "S E A R C H E X A M P L E";
        String[] keys = test.split(" ");
        for (int i = 0; i < keys.length; i++) {
            st.put(keys[i], i);
        }
        System.out.println("size         = " + st.size());
        System.out.println("isEmpty      = " + st.isEmpty());
        System.out.println("contains     = " + st.contains("S"));
        st.delete("S");
        System.out.println("contains     = " + st.contains("S"));
        for (String key : st.keys()) {
            System.out.println(key + " " + st.get(key));
        }
    }
}

输出

size         = 10
isEmpty      = false
contains     = true
contains     = false
L 11
P 10
X 7
H 5
M 9
A 8
E 12
R 3
C 4

Happy learning !!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,835评论 25 709
  • 简书 賈小強转载请注明原创出处,谢谢! Servlet是一种允许响应请求的Java类。虽然Servlet可以响应任...
    賈小強阅读 10,650评论 1 44
  • 现在早上9点整,来幼儿园开家长会,人生第一次开家长会。宝宝和爸爸一起在家里看佩奇,吃早饭,我还没吃呢,等着开...
    拉菲圆圈阅读 164评论 0 0
  • 今天是丁酉年二月十四。这是第二十七篇简书。 昨天收到了妈妈的二十岁生日信,从中明白了一件事。很多人都说母爱最伟大,...
    尘___世_美阅读 225评论 0 0
  • 由于生活水平的大大提高,拍水下婚纱照获得更多新人的热捧。小编认为之所以水下婚纱照获得年轻人的喜爱,我想原因有二:1...
    sunbaoku7阅读 1,320评论 2 0