为了账号安全,请及时绑定邮箱和手机立即绑定

散列表的分离连接法

标签:
Java

解决散列表冲突的第一种方法通常叫做分离连接法,其做法是将散列到同一个值得所有元素保留到一个表中。我们可以使用标准库的实现方法。如果空间很紧,则更可取的方法是避免使用它们(因为这些表是双向链接的并且浪费空间)
下面给出一个例子:
package hash;

import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;
import java.util.Random;

public class SeprateChainingHashTable<AnyType> {
private static final int DEFAULT_TABLE_SIZE=10;//默认容量
private List<AnyType>[] theLists;//散列表的数组
private int currentSize;//当前数据个数
public SeprateChainingHashTable(){
this(DEFAULT_TABLE_SIZE);
}
public SeprateChainingHashTable(int size) {
// TODO Auto-generated constructor stub
theLists = new LinkedList[nextPrime(size)];
for (int i = 0; i < theLists.length; i++) {
theLists[i] = new LinkedList<AnyType>();
}
}
public void makeEmpty() {
for(List<AnyType>list:theLists){
list.clear();
}
currentSize=0;
}
public boolean contains(AnyType x){
List<AnyType> whichList =theLists[myhash(x)];
return whichList.contains(x);
}
public void insert(AnyType x) {
List<AnyType> whichList = theLists[myhash(x)];
if (!whichList.contains(x)) {
whichList.add(x);
if (++currentSize > theLists.length) {
rehash();
}
} else {
}
}
public void remove(AnyType x){
List<AnyType> whichList = theLists[myhash(x)];
if(whichList.contains(x)){
whichList.remove(x);
currentSize--;
}else{

    }}private int myhash(AnyType x) {    // TODO Auto-generated method stub    int  hashVal=x.hashCode();    hashVal%=theLists.length;    if(hashVal<0){        hashVal+=theLists.length;    }    return hashVal;}private void rehash() {    // TODO Auto-generated method stub    List<AnyType>[] oldLists=theLists;    theLists=new List[nextPrime(2*theLists.length)];    for(int j=0;j<theLists.length;j++){        theLists[j]=new LinkedList<AnyType>();    }    currentSize =0;    for(int i=0;i<oldLists.length;i++){        for(AnyType item:oldLists[i]){            insert(item);        }    }}private static boolean isPrime(int num){    if(num==2||num==3){        return true;    }    if(num==1||num%2==0){        return false;    }    for(int i=3;i*i<=num;i+=2){        if(num%i==0){            return false;        }    }    return true;}private int nextPrime(int num) {    // TODO Auto-generated method stub    if(num==0||num==1||num==2){        return 2;    }    if(num%2==0){        num++;    }    while (!isPrime(num)) {        num+=2;    }    return num;}public void printTable(){    for(int i=0;i<theLists.length;i++){        System.out.println("---------");        Iterator iterator=theLists[i].iterator();        while(iterator.hasNext()){            System.out.print(iterator.next()+"");        }        System.out.println();    }}public static void main(String[] args){    Random random=new Random();    SeprateChainingHashTable<Integer> hashTable=new SeprateChainingHashTable<Integer>();    for(int i=0;i<30;i++){        hashTable.insert(random.nextInt(30));    }    hashTable.printTable();}

}

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消