为拼字游戏骗子制作一个好的哈希算法

时间:2016-07-03 18:15:41

标签: function hash hashtable chaining collision

我想构建一个Scrabble Cheater,它将Strings存储在一系列链表中。在一个完美的场景中,每个链表只有具有相同字母排列的单词(例如POOL和LOOP)。用户会像在OLOP中那样放置一个String,并打印出链接列表。

我希望使用散列显式解决任务。

我为它构建了一个stringHashFunction()(Java代码):

public int stringHashFunction(String wordToHash) {

    int hashKeyValue = 7;

    //toLowerCase and sort letters in alphabetical order
    wordToHash = normalize(wordToHash);

    for(int i = 0; i < wordToHash.length(); i++) {

        int charCode = wordToHash.charAt(i) - 96;

        //calculate the hash key using the 26 letters
        hashKeyValue = (hashKeyValue * 26 + charCode) % hashTable.length;
    }

    return hashKeyValue;
}

它看起来像OK-hash函数吗?我意识到它远非一个完美的哈希,但我怎么能改进呢?

我的代码整体有效,但我现在有以下统计信息:

  • 水桶数量:24043
  • 所有项目:24043
  • 最大的桶数:11项。
  • 有:10264个空桶
  • 平均每桶有1.7449016619493432。

是否可以避免冲突,以便我只有具有相同排列的存储桶(链表)?我想如果你有一个完整的字典,那么拥有它可能是有用的,这样你每次想要在你的字符串上获得一些可能的排列时,就不必在每个存储桶上运行isPermutation()方法。 / p>

0 个答案:

没有答案