賈小強
转载请注明原创出处,谢谢!
package com.lab1.test3;
import java.util.LinkedList;
import java.util.Queue;
public class LinearProbingHashST {
private static final int INIT_CAPACITY = 4;
private int n;
private int m;
private Key[] keys;
private Value[] values;
public LinearProbingHashST() {
this(INIT_CAPACITY);
}
public LinearProbingHashST(int m) {
this.m = m;
keys = (Key[]) new Object[m];
values = (Value[]) new Object[m];
}
private void resize(int capacity) {
LinearProbingHashST temp = new LinearProbingHashST<>(capacity);
for (int i = 0; i < m; i++) {
if (keys[i] != null) {
temp.put(keys[i], values[i]);
}
}
this.m = temp.m;
this.keys = temp.keys;
this.values = temp.values;
}
private int hash(Key key) {
return (key.hashCode() & 0x7fffffff) % m;
}
private Value get(Key key) {
for (int i = hash(key); keys[i] != null; i = (i + 1) % m) {
if (key.equals(keys[i])) {
return values[i];
}
}
return null;
}
private Iterable keys() {
Queue queue = new LinkedList<>();
for (int i = 0; i < m; i++) {
if (keys[i] != null) {
queue.add(keys[i]);
}
}
return queue;
}
private void delete(Key key) {
if (!contains(key)) {
return;
}
int i = hash(key);
while (!key.equals(keys[i])) {
i = (i + 1) % m;
}
keys[i] = null;
values[i] = null;
i = (i + 1) % m;
while (keys[i] != null) {
Key keyToRehash = keys[i];
Value valueToRehash = values[i];
keys[i] = null;
values[i] = null;
n--;
put(keyToRehash, valueToRehash);
i = (i + 1) % m;
}
n--;
if (n > 0 && n <= m / 8) {
resize(m / 2);
}
}
private boolean contains(Key key) {
return get(key) != null;
}
private boolean isEmpty() {
return n == 0;
}
private int size() {
return n;
}
private void put(Key key, Value value) {
if (n >= m / 2) {
resize(m * 2);
}
int i;
for (i = hash(key); keys[i] != null; i = (i + 1) % m) {
if (key.equals(keys[i])) {
values[i] = value;
return;
}
}
keys[i] = key;
values[i] = value;
n++;
}
public static void main(String[] args) {
LinearProbingHashST st = new LinearProbingHashST<>();
String test = "S E A R C H E X A M P L E";
String[] keys = test.split(" ");
for (int i = 0; i < keys.length; i++) {
st.put(keys[i], i);
}
System.out.println("size = " + st.size());
System.out.println("isEmpty = " + st.isEmpty());
System.out.println("contains = " + st.contains("S"));
st.delete("S");
System.out.println("contains = " + st.contains("S"));
for (String key : st.keys()) {
System.out.println(key + " " + st.get(key));
}
}
}
输出
size = 10
isEmpty = false
contains = true
contains = false
A 8
C 4
E 12
H 5
L 11
M 9
P 10
R 3
X 7
Happy learning !!