哈希表进化史:
问题的引出:
Binary Search Tree,2-3 tree,Red-Black Tree存在的问题
-
要求存储的元素必须comparable,如果存储String,Integer没问题,但对有些Object来说,bigger或者smaller的问题可能无法回答或者没有意义
-
复杂度是 Θ ( l o g N ) \Theta(log N) Θ(logN)
如何解决这些问题?
尝试1:
我们首先尝试解决上述问题二,即复杂度较高
DataIndexedIntegerSet:
public class DataIndexedIntegerSet {
private boolean[] present;
public DataIndexedIntegerSet() {
present = new boolean[2000000000];
}
public void add(int x) {
present[x] = true;
}
public boolean contains(int x) {
return present[x];
}
想法很简单,构造一个足够大的数组,如果插入x
,就把该数组的x
位置赋值true
。询问数据库中是否有x
时,也只需直接查询数组的x
位置是否为true
上述的插入(add)和查询(contains)操作的复杂度都是 Θ ( 1 ) \Theta(1) Θ(1)
缺点:
浪费空间,假设我只存储了x=1999999999一个整数,却需要大小为2000000000的数组
如果我们想插入的变量是String
怎么办?
尝试2:
任何整数通过10的幂唯一表示(为什么是10的幂可以自行证明):
e.g., 5149 = 5 ⋅ 1 0 3 + 1 ⋅ 1 0 2 + 4 ⋅ 1 0 1 + 9 ⋅ 1 0 1 5149 = 5\cdot 10^3+1\cdot 10^2+4\cdot 10^1+9\cdot 10^1 5149=5⋅103+