Java哈希表 - 优化现有代码

时间:2012-09-09 17:38:56

标签: java algorithm optimization data-structures hashtable

我在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;
} 

1 个答案:

答案 0 :(得分:0)

好吧,我会说你需要重新考虑你想要做的设计。特别是碰撞。看起来您正试图通过将值移动到下一个存储桶来解决冲突(具有相同哈希码的两个值)。当您反复添加和删除时,无法确定您的密钥不在表中的其他位置。

您可能希望将哈希表设计为链表的表。这样,碰撞条目被放入一个从正确的单元格开始的链表中。如果使用适当的散列函数(在键空间上分配接近统一的键),则碰撞次数将会很少。

祝你好运!