散列表

它是用一个散列函数把关键字 映射到散列表中的特定位置。
在理想情况下,如果元素e 的关键字为k,散列函 数为f,那么e 在散列表中的位置为f (k)。要搜索关键字为k
的元素,首先要计算出f (k),然后看 表中f (k)处是否有元素。如果有,便找到了该元素。如果没有,说明该字典中不包含该元素。
在前一种情况中,如果要删除该元素,只需把表中f (k)位置置为空即可。在后一种情况中,可 以通过把元素放在f (k)位置以实现插入。
此例是一个理想情况下的散列表,不考虑关键字重复的情况

复制代码
public class HashList {    
    
    private String[] table;

    private int size;

    private int threshold;

    private static final int INITIAL_CAPACITY = 10;

    private static final int SIZE_INCREASE = 10;

    private static final float DEFAULT_LOAD_FACTOR = 0.75f;
    
    
    
    public HashList(){
        threshold = (int)(INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR);
        table = new String[INITIAL_CAPACITY];
    }
    
    
    
    public HashList(String[] table){
        this.table = table;
    }
    
    
    
    
    /**
     * Get the actual size of the list
     * @return
     */
    public int size(){
        return size;
    }
    
    /**
     * for test
     * @return
     */
    public String[] getElements(){
        return table;
    }
    
    public boolean contains(String element) {
        if (element == null) {
            return false;
        }
        if (element.equals(table[getIndex(element)])) {
            return true;
        }
        return false;
    }
    
    public void add(String element){
        int index = getIndex(element);
        if(size>threshold){
            resize();
        }
        table[index] = element;
        size++;
    }
    
    
    
    //private methods
    /**
     * resize the array
     */
    private void resize(){
        String[] newArray = new String[table.length+SIZE_INCREASE];
        for(int i=0;i<table.length;i++){
            newArray[i] = table[i];
        }
        table = newArray;
        threshold = (int)(table.length*DEFAULT_LOAD_FACTOR);
    }
    
    /**
     * get the index of the element
     * @param element
     * @return
     */
    public int getIndex(String element) {
        return (element.hashCode() & 0x7FFFFFFF) % table.length;
    }    
}
复制代码
posted @   风过无痕的博客  阅读(219)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示