hash表海量查找字符串(java版)

来源:互联网 发布:淘宝上的服装利润多少 编辑:程序博客网 时间:2024/06/05 07:17

 哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的方法。

        Hash表是使用 O(1)时间进行数据的插入、删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是 O(N) 。

当然首先得建立hash表存储字符串。

// 测试hash表的简单应用public class testhash {private String[] name;//关键字private int sum;//当前容量public static void main(String[] args) {// TODO 自动生成的方法存根testhash t=new testhash();t.add("java");t.add("C#");t.add("C++");t.add("C");t.add("pathyn");t.add("VB");t.add("PHP");t.add("shell");t.print();String teststr="C++";if(t.contains(teststr)){System.out.println("YES");}else{System.out.println("NO");}}public testhash(){name=new String[10];sum=0;}//添加字符串到hash表public void add(String s){if(sum>=this.name.length/2){this.refresh();}int start=hash1(s);int i=start;while(name[i]!=null){if(name[i].equals(s)){return ;}i=(i+hash2(s))%name.length;if(i==start){return ;}}name[i]=s;sum++;}//因为长度不够,扩充hash表public void refresh(){testhash t=new testhash();t.name=new String[this.name.length*2];int i=0;for(i=0;i<name.length;i++){if(this.name[i]!=null){t.add(this.name[i]);}}this.name=t.name;this.sum=t.sum;}//正常的hash函数public int hash1(String s){return Math.abs(s.hashCode()%name.length);}//处理冲突的hash函数public int hash2(String s){int result=Math.abs(s.hashCode()%(name.length-1));if(result%2==0){return result+1;}return result;}public boolean contains(String s){int start=hash1(s);int i=start;while(name[i]!=null){if(name[i].equals(s)){return true;}i=(i+hash2(s)%name.length);if(i==start){return false;}}return false;}//打印所有的hash键值对 public void print(){                       //输出哈希表中所有元素     for(int i = 0; i < name.length; i ++){        System.out.println(i+":"+name[i]);    }  }}


0 0
原创粉丝点击