【问题标题】:How to reduce time-complexity in "put" function如何降低“put”函数的时间复杂度
【发布时间】:2018-09-11 16:38:28
【问题描述】:

我正在尝试找到一种方法来让我的算法执行得更快。这个函数目前正在做的是将值(字符)和键(字符串)插入到我的带有 7 个插槽的哈希表中。它还在运行检查 A. 是否有东西占用它的最佳位置,然后将其放置在最佳可用位置。和 B. 如果插入 2 个相同的密钥,则新密钥只是将其值转移到旧密钥,而不是自己占用一个新插槽。有什么方法可以在不迭代我的“keys”数组的情况下做到这一点?

public void put(String key, Character val) {
                            int z = hash(key);
                            while(keys[z] != null){
                                if(key.equals(keys[z])){
                                    vals[z]= val;
                                    break;
                                }

                                z ++;
                                if (z>6){
                                    z=0;
                                    if(key.equals(keys[z])){  
                                        vals[z]= val;
                                        break;
                                    }
                                    if(keys[0]==null){
                                    break;
                                    }
                                    else{
                                        z++;
                                    }
                                }
                            }
                            keys[z] = key;
                            vals[z] = val;
                            N += 1;

                        } 

更新:这是我的 hash() 函数

public int hash(String key) {
                            int i;
                            int v = 0;

                            for (i = 0; i < key.length(); i++) {
                                v += key.charAt(i);
                            }
                            return v % M;
                        }

【问题讨论】:

  • hash() 在这里做什么?在我看来,您将生成一个散列,然后在函数的后面增加它。如果它通过获取键的索引来完成我认为的操作,那么hash 函数可能应该被重命名(仅从可读性/理解的角度来看)
  • @Alerra 我现在已将其包含在问题中。感谢您指出了这一点。它返回给定键的“最佳”位置。如果该插槽被占用,它将占用之后的插槽,依此类推..

标签: java algorithm time-complexity hashtable


【解决方案1】:

如果我正确理解您的代码,那么您有一个 开放寻址 散列表,其中包含 线性探测

线性探测的替代方案(您正在寻找空点的循环)是:

但无论如何,最坏情况下的时间将是线性的。对于一个只有 7 个元素的非常小的表格,您以 1 为增量的线性方法看起来很好。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 2011-06-15
    • 1970-01-01
    • 2020-02-13
    • 2021-03-30
    • 2016-01-08
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多