数据结构之散列表(新手文章,勿进)
作者:互联网
基本理解
这是一种一对一的关系,不同于之前学的,它没有多大的逻辑关系,通过关键字来索引
散列函数
可以用于加密,从数据量大的地方获取一小段数据
分离链接法
使用链表,将散列到同一个值的元素保留在同一个链表中
/**
*
*/
package little_class;
import java.util.LinkedList;
import java.util.List;
/** 1
* @author 梅肺
*/
public class SeperateChiningHashTable<E> {
public SeperateChiningHashTable() {
// TODO Auto-generated constructor stub
this(DEFAULT_TABLE_SIZE);
}
public SeperateChiningHashTable(int size){
theLists = new LinkedList[nextPrime(size)]; //???在是什么构造方法
for (int i = 0; i < theLists.length; i++) {
theLists[i] = new LinkedList<>();
}
}
public void insert(E x) {
List<E> whichList = theLists[myhash(x)];
if(!whichList.contains(x)) {//如果不存在就插入,存在就算了
whichList.add(x);
if (++currentSize > theLists.length) {
rehash();//哈希表不够大的时候,扩建
}
}
}
public void remove(E x) {
List<E> whichList = theLists[myhash(x)];
if(!whichList.contains(x)) {
whichList.remove(x);
currentSize--;//不要忘记当前大小减小
}
}
public boolean contains(E x) {
List<E> whichList = theLists[myhash(x)];//数组中寻找列表
return whichList.contains(x);//列表中寻找元素
}
public void makeEmpty() {
for (int i = 0; i < theLists.length; i++) {
theLists[i].clear();
}
currentSize =0;
}
private static final int DEFAULT_TABLE_SIZE = 101;
private List<E> [] theLists;//由许多列组成的数组
private int currentSize;
private void rehash() {
}
private int myhash(E x) {
int hashval = x.hashCode();//每一个数据类型都有哈希值
hashval %= theLists.length;
if (hashval <0) {
hashval +=theLists.length;
}
return hashval;
}
}
线性探测法
此类方法,和分离链接法最大的不同在于——前者的load factor(元素个数与该表大小的比)达到了1,每添加一个新的元素就需要分配新的地址。后者load factor只有0.5,因此它可以去为新元素寻找新的单元。
一个缺陷:即使表的load factor 比较小,也会发生一次聚集,这样会导致散列到表中的任何关键字都需要多次试验才能解决冲突
平方探测法
为了弥补上述的缺陷,但也有一些苛刻的条件。
- 表中被填充的位置一定要比一半小,或者等于一半。哪怕多一个都有可能失败
- 表的大小必须是素数,否则会浪费很多空间
标签:之散,勿进,int,List,whichList,private,theLists,数据结构,public 来源: https://www.cnblogs.com/xiaolongdejia/p/11367754.html