java 数组实现哈希表的构建,查找,插入,删除
2016-06-07 22:23
627 查看
以下代码以数组存储方式实现了哈希表的创建,查找,插入,删除等操作,哈希函数采用除留余数法,使用开放定址法中的线性探查法处理冲突
public class HashSearch { /*使用数组实现hashtable的创建,查找,插入,删除*/ class Node{ //结点内部类表示hashtable中存储的元素 int key; //数据域 boolean delflag; //在删除时使用,作为删除标志 int times; //比较次数 public Node(int data){ key=data; delflag=false; times=0; } } public int Collision(int d,int hashsize){ /*线性探查法处理冲突,hashsize表示HashTable的大小*/ return (d+1)%hashsize; } public int HashFunc(int key,int hashsize){ /*采用除留余数法构造哈希函数*/ return key%hashsize; } /*hashtable的查找*/ public int Hashsearch(Node[]HashTable,int x){ /*HashTable为哈希表数组,x为待查找的元素*/ /*找到,则返回哈希地址;没找到返回负的哈希地址*/ int addr; int hashsize=HashTable.length; addr=HashFunc(x,hashsize); //获得哈希地址 while(HashTable[addr]!=null && HashTable[addr].key!=x){ addr=Collision(addr,hashsize); //没找到,处理冲突 } if(HashTable[addr]!=null && HashTable[addr].key==x) //查找成功 return addr; else return -addr; //查找失败 } /*哈希表的插入*/ public int HashInsert(Node[]HashTable,int x){ int addr; addr=Hashsearch(HashTable,x); //在哈希表中查找 if(addr>0) return 0; //找到则不必插入 HashTable[-addr]=new Node(x); //没找到,则插入 HashTable[-addr].times=1; //设置比较次数 return 1; //插入成功 } /*哈希表的创建*/ public void CreateHash(Node[]HashTable,int items[]){ /*利用所给关键字的序列items,创建哈希表,n为关键字的个数*/ int hashsize=HashTable.length; int n=items.length; int i; for(i=0;i<hashsize;i++){ //初始化哈希表 HashTable[i]=null; } for(i=0;i<n;i++){ HashInsert(HashTable,items[i]); //依次向哈希表中插入元素 } } /*哈希表的删除*/ public int HashDelete(Node[]HashTable,int x){ int addr; addr=Hashsearch(HashTable, x); //查找数据元素 if(addr>0){ HashTable[addr].delflag=true; //找到,则设置删除标记为true return 1; } return 0; } /*哈希表的显示*/ public void Displayhash(Node[]HashTable){ int i,hashsize=HashTable.length; System.out.print("哈希表\n哈希地址:"); for(i=0;i<hashsize;i++){ System.out.print(i+" "); } System.out.print("\n关键字: "); for(i=0;i<hashsize;i++){ if(HashTable[i]!=null && HashTable[i].delflag==false){ if(HashTable[i].key<10) System.out.print(HashTable[i].key+" "); else System.out.print(HashTable[i].key+" "); } else System.out.print(","+" "); } } public static void main(String[] args) { int []items=new int[]{15,59,22,34,7,78}; Node[] HashTable=new Node[7]; HashSearch hs=new HashSearch(); hs.CreateHash(HashTable, items); hs.Displayhash(HashTable); int addr; addr=hs.Hashsearch(HashTable, 59); System.out.println("\n"+addr); hs.HashDelete(HashTable, 34); hs.Displayhash(HashTable); } }
相关文章推荐
- 中文javadoc
- 中文javadoc
- spring的事物配置
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
- Eclipse提升开发效率的快捷键
- java生成word的完美解决方案
- java异常错误
- 输出日历
- 分布式锁1 Java常用技术方案
- java.util.ResourceBundle使用详解
- \r 在InterlliJ IDEA 和 Eclipse 中输出的结果不一样
- Java中的闭包(Closure)和回调
- java FileReader/FileWriter读写文件
- SpringMVC-国际化
- SpringMVC学习--功能完善
- 10043---java动态代理(cglib)
- Spring 事务传播机制 实例讲解
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
- Java Instrument (三) 钩子函数
- 01-java中“接口”的概念