java数据结构与算法-线性探测哈希表

来源:互联网 发布:eclipse打war包源码 编辑:程序博客网 时间:2024/05/16 14:22

哈希表 优点:速度快(查找和插入)       缺点:基于数组,不能有序的遍历       键值对:通过键来访问值       冲突:不同的关键字经过哈希化得到数组下标出现重复       

哈希表解决冲突的方案:

(1)开放地址法

线性探测:当指定位置以有数据,则继续往下找空位置

二次探测:第一次探测冲突后,第二次探测按固定间隔、或者1、2、3...的平方间隔去寻找空地址

再哈西法:第一次探测冲突后,第二次再次哈希寻找空地址

(2)链地址法:即数组元素是链表


一、线性探测哈希表代码如下:

package com.tool.wpn.quicksort;import android.util.Log;/** * Created by Xi on 2017/8/15. * 线性探测哈希表 */public class HashTableLin {    private final String TAG="HashTableLin";    private DataItem[] hashArray;    private int arraySize;    private DataItem nonItem;//无元素,由于底层使用的数组,在真正删除元素时,也不是真正删除该内存空间,而是将其所含值改变,代表删除该元素    public HashTableLin(int size){        arraySize=size;        hashArray=new DataItem[arraySize];        nonItem=new DataItem(-1);    }    public void displayTable(){        StringBuilder sb=new StringBuilder();        sb.append("[");        for(int i=0;i<arraySize;i++){            if(i==arraySize-1){                if(hashArray[i]!=null) {                    sb.append(hashArray[i].getKey() + "");                }else {                    sb.append("** ");                }            }            else {                if(hashArray[i]!=null) {                    sb.append(hashArray[i].getKey() + "");                }else {                    sb.append("** ");                }                sb.append(",");            }        }        sb.append("]");        Log.v("HashTableLin",sb.toString());    }    /**     * 将传入的key经过hash算法,这里使用的普通除以数组大小求余的方法,而实际不是这么简单     * @param key     * @return     */    public int hashFunc(int key){        return key%arraySize;    }    /**     * 插入元素     */    public void insert(DataItem item){        int key=item.getKey();        int hashVal=hashFunc(key);        while(hashArray[hashVal]!=null && hashArray[hashVal].getKey()!=-1){//位置被占用            //继续寻找位置            hashVal++;            hashVal=hashVal%arraySize;        }        hashArray[hashVal]=item;//找到位置    }    /**     * 删除元素     */    public DataItem delete(int key){        int hashVal=hashFunc(key);        while(hashArray[hashVal]!=null){            if(hashArray[hashVal].getKey()==key){//找到要删除的数据                DataItem temp=hashArray[hashVal];                hashArray[hashVal]=nonItem;                return temp;            }            hashVal++;            hashVal=hashVal%arraySize;        }        return null;//没有找到    }    /**     * 查找元素     */    public DataItem find(int key){        int hashVal=hashFunc(key);        while(hashArray[hashVal]!=null){            if(hashArray[hashVal].getKey()==key){                return hashArray[hashVal];//找到元素            }            hashVal++;            hashVal=hashVal%arraySize;        }        return null;//没有找到    }}

package com.tool.wpn.quicksort;/** * Created by Xi on 2017/8/15. * 线性探测哈希表所使用元素 */public class DataItem {    private int iData;    public DataItem(int key){        iData=key;    }    public int getKey(){        return iData;    }    @Override    public String toString() {        return "DataItem-key值为:"+iData;    }}


二、主函数调用如下:

 private void hashLin(){        int size=20;        HashTableLin hashTable=new HashTableLin(size);        hashTable.insert(new DataItem(10));        hashTable.insert(new DataItem(50));        hashTable.insert(new DataItem(60));        hashTable.insert(new DataItem(11));        hashTable.insert(new DataItem(21));        hashTable.insert(new DataItem(54));        hashTable.displayTable();        DataItem dataItem = hashTable.find(12);//查找12        if(dataItem==null){            Log.v(TAG,"can't find");        }else{            Log.v(TAG,"find-"+dataItem.toString());        }        DataItem dataItemEl = hashTable.find(11);//查找1        if(dataItemEl==null){            Log.v(TAG,"can't find");        }else{            Log.v(TAG,"find-"+dataItemEl.toString());        }        DataItem delete = hashTable.delete(11);//删除11        if(delete==null){            Log.v(TAG,"can't delete");        }else{            Log.v(TAG,"delete-"+delete.toString());        }        hashTable.displayTable();    }


打印日志如下:


源码下载地址:点击打开链接


再哈希法哈希表 点击打开链接

链地址法哈希表 点击打开链接



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办 小孩子特别能吃怎么办 小孩吃不下去药怎么办 小孩不肯去上学怎么办 初中没有团员证怎么办 入团申请书丢了怎么办 刚成立单位社保怎么办 老年人耳鸣怎么办小妙招 老人血压高200怎么办 老人晕车后难受怎么办 老人头晕心里慌怎么办 老人憋的慌怎么办 老人厌食没胃口怎么办 老年人心里整天疑心病怎么办 一个人疑心太重怎么办 我疑心病很重怎么办 老人疑心病太重怎么办 心理有问题该怎么办 老人得了妄想病怎么办 小学生没做作业怎么办 孩子完不成作业怎么办 敏感多疑怎么办很痛苦 老年人脾气越来越古怪怎么办 村委会不给盖章怎么办 普通发票超过3万怎么办 仔猪不吃食消瘦怎么办 猫怀孕不吃东西怎么办 兔子产子太多了怎么办 苦瓠子中毒后怎么办 吃了苦丝瓜怎么办