-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinearHashST.java
More file actions
68 lines (59 loc) · 1.75 KB
/
Copy pathLinearHashST.java
File metadata and controls
68 lines (59 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package cx.Hash;
/**
* 基于线性探测的符号表
*/
public class LinearHashST<Key, Value> {
//探测表的大小
private int M = 16;
//符号表中键值对的总数
private int N;
//健数组
private Key[] keys;
//值数组
private Value[] values;
public LinearHashST() {
keys = (Key[]) new Object[M];
values = (Value[]) new Object[M];
}
public LinearHashST(int cap){
keys=(Key[]) new Object[cap];
values=(Value[]) new Object[cap];
}
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % M;
}
//扩容
private void resize(int cap) {
LinearHashST<Key,Value> temp;
temp=new LinearHashST<Key,Value>(cap);
for (int i=0;i<M;i++){
if (keys[i]!=null) temp.put(keys[i],values[i]);
}
keys=temp.keys;
values=temp.values;
M=temp.M;
}
//插入键值对
public void put(Key key, Value value) {
//当探测表的键值对总数超过探测表长度的1/2时就进行扩容
if (N>= M/2) resize(2*M);
int i;
//如果计算出来的索引位置已经有键,且与当前的键不匹配,就不断后移
for (i = hash(key); keys[i] != null; i = (i + 1) % M)
if (keys[i].equals(key)) {
values[i] = value;
return;
}
keys[i] = key;
N++;
}
public Value get(Key key){
int i;
for (i=hash(key);keys[i]!=null;i=(i+1)%M)
if (keys[i].equals(key)){
return values[i];
}
return null;
}
//删除操作,不仅需要删除当前的键,还需要将长键簇中被删除键的右侧所有键重新插入散列表
}