【问题标题】:Java hashtables - Optimizing existing codeJava 哈希表 - 优化现有代码
【发布时间】:2012-09-02 17:01:12
【问题描述】:

我在 java 中实现了一个 hashtale,但我需要优化代码。我认为我有很多循环。如何“减少”循环次数?问题是,当我删除一个元素时,我必须重新哈希表,然后我有鬃毛跳跃 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;
} 

【问题讨论】:

  • 您的if 语句也应该是deleted == true,其中包含2 个=s。
  • @Bhesh Gurung。什么意思?
  • @Eric,是的,当然,我怎么会错过这个 :) 笨拙的我 :)
  • @Bhesh Gurung,是的,你是对的,我会修复它 :)
  • @user1285737 检查您的 IDE - 许多人会为此提供警告,可能值得打开/更改 IDE。

标签: java algorithm optimization data-structures hashtable


【解决方案1】:

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

您可能希望将哈希表设计为链接列表表。这样,冲突的条目就被放入从正确单元格开始的链表中。如果您使用适当的散列函数(在键空间上分布接近均匀的键),那么冲突的数量将会最少。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2021-09-14
    • 2013-05-31
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2012-04-27
    • 2018-10-19
    相关资源
    最近更新 更多