数据结构之散列表(新手文章,勿进)

基本理解

​ 这是一种一对一的关系,不同于之前学的,它没有多大的逻辑关系,通过关键字来索引

散列函数

​ 可以用于加密,从数据量大的地方获取一小段数据

分离链接法

​ 使用链表,将散列到同一个值的元素保留在同一个链表中

/**
 * 
 */
package little_class;

import java.util.LinkedList;
import java.util.List;

/**     1
 * @author 梅肺 
 */
public class SeperateChiningHashTable<E> {
    public SeperateChiningHashTable() {
        // TODO Auto-generated constructor stub
        this(DEFAULT_TABLE_SIZE);
    }
    public SeperateChiningHashTable(int size){
        theLists = new LinkedList[nextPrime(size)]; //???在是什么构造方法   
        for (int i = 0; i < theLists.length; i++) {
            theLists[i] = new LinkedList<>();       
        }
    }
    public void insert(E x) {
        List<E> whichList = theLists[myhash(x)];
        if(!whichList.contains(x)) {//如果不存在就插入,存在就算了

            whichList.add(x);
            
            if (++currentSize > theLists.length) {
                rehash();//哈希表不够大的时候,扩建

            }
        }
    }
    
    public void remove(E x) {
        List<E> whichList = theLists[myhash(x)];
        if(!whichList.contains(x)) {
            whichList.remove(x);
        currentSize--;//不要忘记当前大小减小
        }
        
    }
    
    public boolean contains(E x) {
        List<E> whichList = theLists[myhash(x)];//数组中寻找列表
        return whichList.contains(x);//列表中寻找元素
        
    }
    
    public void makeEmpty() {
        for (int i = 0; i < theLists.length; i++) {
            theLists[i].clear();
        }
        currentSize =0;
    }
    
    private static final int DEFAULT_TABLE_SIZE = 101;
    
    private List<E> [] theLists;//由许多列组成的数组
    private int currentSize;
    
    private void rehash() {
        
    }
    
    private int myhash(E x) {
        int hashval  = x.hashCode();//每一个数据类型都有哈希值
        hashval %= theLists.length;
        if (hashval <0) {
            hashval +=theLists.length;          
        }
        return hashval;
    }
    
}

线性探测法

​ 此类方法,和分离链接法最大的不同在于——前者的load factor(元素个数与该表大小的比)达到了1,每添加一个新的元素就需要分配新的地址。后者load factor只有0.5,因此它可以去为新元素寻找新的单元。

一个缺陷:即使表的load factor 比较小,也会发生一次聚集,这样会导致散列到表中的任何关键字都需要多次试验才能解决冲突

平方探测法

​ 为了弥补上述的缺陷,但也有一些苛刻的条件。

  1. 表中被填充的位置一定要比一半小,或者等于一半。哪怕多一个都有可能失败
  2. 表的大小必须是素数,否则会浪费很多空间

猜你喜欢

转载自www.cnblogs.com/xiaolongdejia/p/11367754.html
今日推荐