gpt4 book ai didi

java - 迭代自定义哈希表

转载 作者:行者123 更新时间:2023-12-02 11:31:23 25 4
gpt4 key购买 nike

我有一个用 java 实现的自定义哈希表。

public class HashSet<T> implements HashTableInterface<T> {

private static int DEFAULT_ARRAY_SIZE = 10;

private T[] items;

public HashSet() {
final T[] items = (T[]) new Object[DEFAULT_ARRAY_SIZE];
this.items = items;
}

@Override
public boolean add(T item) {
int index = getIndex(item);
do {
if (items[index] != null) {
index = (index + 1) % DEFAULT_ARRAY_SIZE;
} else {
items[index] = item;
break;
}
} while (index != getIndex(item));

return true;
}

@Override
public boolean remove(T item) {
if (contains(item)) {
items[getIndex(item)] = null;
return true;
} else {
return false;
}
}

@Override
public boolean contains(T item) {
T itemArray = items[getIndex(item)];
if (item.equals(itemArray)) {
return true;
} else {
int index = (getIndex(item) + 1) % DEFAULT_ARRAY_SIZE;
do {
if (items[index] != null) {
if (items[index].equals(item)) {
return true;
} else {
index = (index + 1) % DEFAULT_ARRAY_SIZE;
}
} else {
break;
}
} while (index != getIndex(item));
}
return items[getIndex(item)] != null;
}

@Override
public int getIndex(T item) {
return item.hashCode() % DEFAULT_ARRAY_SIZE;
}

@Override
public int size() {
int count = 0;
for (T item : items) {
if (item != null) {
count++;
}
}
return count;
}

@Override
public String toString() {
return items.toString();
}}

在我的添加方法中,我想检查存储项目的位置是否空闲,如果不是,它应该转到下一个索引。直到找到一个空的地方。

我的代码可以工作,但我认为,可能有更好的方法来做到这一点。

public boolean add(T item) {
int index = getIndex(item);
do {
if (items[index] != null) {
index = (index + 1) % DEFAULT_ARRAY_SIZE;
} else {
items[index] = item;
break;
}
} while (index != getIndex(item));

return true;
}

我在 contains 方法中遇到同样的问题

public boolean contains(T item) {
T itemArray = items[getIndex(item)];
if (item.equals(itemArray)) {
return true;
} else {
int index = (getIndex(item) + 1) % DEFAULT_ARRAY_SIZE;
do {
if (items[index] != null) {
if (items[index].equals(item)) {
return true;
} else {
index = (index + 1) % DEFAULT_ARRAY_SIZE;
}
} else {
break;
}
} while (index != getIndex(item));
}
return items[getIndex(item)] != null;
}

最佳答案

有很多不同的方法可以避免碰撞,您所做的称为“线性探测”。

还有(引用here)

二次探测

H+1^{2},H+2^{2},H+3^{2},H+4^{2},...,H+k^{2}

双重哈希

h(i,k) = ( h_1(k) + i \cdot h_2(k) ) mod|T|.

以及使用链接列表来实现冲突值的方案。

所有这些都有不同的权衡,您应该了解这些权衡以做出明智的决定。

关于java - 迭代自定义哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49280640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com