我在java中实现了一个hashtale但我需要优化代码。我认为我有很多循环。如何“减少”循环次数?问题是当我删除一个元素然后我必须重新表格然后我有mane hops beetwen delete()和put()。我不想要任何代码示例,只需要指导,因为这是一个学校的例外:)
谢谢
这是我的职能:
public void put(String key, Character val) {
int hashValue = hash(key);
if(val == '\r'){
delete(key);
}
else {
while(keys[hashValue] != null) {
if(keys[hashValue].equals(key)) {
break;
}
hashValue = (hashValue + 1) % M ;
}
keys[hashValue] = key ;
vals[hashValue] = val;
N++;
}
}
public Character get(String key) {
int hashValue = hash(key);
while(keys[hashValue] != null) {
if(keys[hashValue].equals(key)){
return vals[hashValue];
}
hashValue = (hashValue+1) % M;
}
return null;
}
public void delete(String key) {
int hashValue = hash(key) ;
String tempkey;
Character tempval;
boolean deleted = false;
while(keys[hashValue] != null){
if(keys[hashValue].equals(key)){
keys[hashValue] = null;
vals[hashValue] = null;
deleted = true;
N--;
if(keys[(hashValue + 1) % M] == null){
break;
}
}
else if(deleted = true){
tempkey = keys[hashValue];
tempval = vals[hashValue];
keys[hashValue] = null;
vals[hashValue] = null;
N--;
put(tempkey, tempval);
}
hashValue = (hashValue +1) % M;
}
return;
}
答案 0 :(得分:0)
好吧,我会说你需要重新考虑你想要做的设计。特别是碰撞。看起来您正试图通过将值移动到下一个存储桶来解决冲突(具有相同哈希码的两个值)。当您反复添加和删除时,无法确定您的密钥不在表中的其他位置。
您可能希望将哈希表设计为链表的表。这样,碰撞条目被放入一个从正确的单元格开始的链表中。如果使用适当的散列函数(在键空间上分配接近统一的键),则碰撞次数将会很少。
祝你好运!