您的位置:首页 > 编程语言 > Java开发

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

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

        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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hash表 hash java