哈希桶的实现(代码版)

简介: 哈希桶的实现(代码版)

要避免哈希冲突,使用哈希桶

代码如下


// 哈希桶的简单实现
// key-value 模型
public class HashBucket {
    private static class Node {
        private int key;
        private int value;
        Node next;
        public Node(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }
    private Node[] array;
    private int size;   // 当前的数据个数
    private static final double LOAD_FACTOR = 0.75;
    private static final int DEFAULT_SIZE = 8;//默认桶的大小
    public int put(int key, int value) {
        int index = key % array.length;
        Node cur = array[index];
        while (cur != null) {
            if (cur.key == key) {
                return key;
            }
            cur = cur.next;
        }
        Node node = new Node(key, value);
        node.next = array[index];
        array[index] = node;
        size++;
       double loadFactor=loadFactor();
        if(loadFactor>LOAD_FACTOR){
            resize();
        }
        return -1;
}
    private void resize() {
        //扩容意味着重新哈希
        Node[] newArray=new Node[2*array.length];
        for(int i=0;i<array.length;i++){
            Node cur=array[i];
            while(cur!=null){
                Node curNext=cur.next;//记录一下,因为是在重新哈希,所以下一个结点会出现找不到的情况
                int index=cur.key%newArray.length;
                cur.next=newArray[i];
                newArray[i]=cur;
                cur=curNext;
            }
        }
    }
        // write code here
    //
    //
    private double loadFactor() {
              return size * 1.0 / array.length;
          }
          public int get(int key){
        int index=key%array.length;
        Node cur=array[index];
        while(cur!=null){
            if(cur.key==key){
                return cur.key;
            }
            cur=cur.next;
        }
        return -1;
          }
    }


当对象为引用类型的话,就用泛型实现。代码如下


//泛型哈希桶的实现
public class HashBuck2<K,V> {
    private static class Node<K, V> {
        private K key;
        private V value;
        Node<K, V> next;
        public Node(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }
    public Node<K,V>[] array=(Node<K,V>[])new Node[10];
    public int size;
    public void put(K key, V value) {
        int hash = key.hashCode();
        int index = hash % array.length;//自己写引用类型的时候记得equals和hashcode方法
        Node cur = array[index];
        while (cur != null) {
            if (cur.key.equals(key)) {
                return;
            }
            cur = cur.next;
        }
        Node<K, V> node = new Node<>(key, value);
        node.next = array[index];
        array[index] = node;
        size++;
    }
        public V get(K key){
            int hash=key.hashCode();
            int index=hash%array.length;
          Node<K,V> cur =array[index];
            while(cur!=null){
                if(cur.key.equals(key)){
                    return cur.value;
                }
                cur=cur.next;
            }
            return null;
        }
}


泛型实现的话,要记得写hashcode和equals方法,因为使用哈希的时候要比较key的值,然后确定index的时候必须是整数,所以要用hashcode转换

相关文章
|
5月前
|
存储 索引
哈希表刷题总结
哈希表刷题总结
25 1
|
5月前
|
存储
开散列哈希桶
开散列哈希桶
|
5月前
|
存储 C++ 容器
c++实现哈希桶
这篇文章回顾了闭散列的概念,指出在数据冲突时,闭散列会自动寻找后续未占用的位置插入数据。然而,这种方法可能导致某些元素状态变为删除,从而在查找时产生问题。为了解决这个问题,文章介绍了拉链法(哈希桶)作为改进策略。拉链法在每个哈希表位置上维护一个链表,冲突的数据挂载在相应位置的链表上。文章详细描述了拉链法的插入、查找和删除操作,并提供了相关代码示例。在插入过程中,当负载因子达到1时,哈希表会进行扩容,同时避免了频繁创建和销毁节点,提高了效率。最后,文章通过测试代码展示了拉链法的正确性。
|
6月前
|
存储 Serverless C++
【C++高阶(五)】哈希思想--哈希表&哈希桶
【C++高阶(五)】哈希思想--哈希表&哈希桶
|
存储 算法 Shell
哈希表、哈希桶(C++实现)【STL】
哈希表、哈希桶(C++实现)【STL】
155 0
|
存储 Serverless C++
哈希(C++)上
哈希(C++)
80 0
多阶哈希
多阶哈希
139 0
|
6月前
|
存储 缓存 Java
哈希表超详解
哈希表超详解
|
6月前
|
存储 算法 测试技术
C++ 哈希 开放定址法
C++ 哈希 开放定址法
|
6月前
|
存储 Serverless 测试技术
C++【初识哈希】
C++【初识哈希】
62 0