我在看https://www.youtube.com/watch?v=UPo-M8bzRrc&index=21&list=PL4BBB74C7D2A1049C,(CS 61B第21讲:哈希表)和教授给出的例子是
你有两个字母的单词,每个字母都在a-z之间
public class Word{
public static final int LETTERS = 26, WORDS = LETTERS * LETTERS;
private String word;
public int hashCode(){
return LETTERS * (word.charAt(0)-'a') + word.charAt(1) - 'a';
}
}
有没有办法证明(数学?)每个可能的单词将映射到0到675之间的不同值? 我已经证明范围在0到675之间(给#34; aa"" zz",但不确定如何证明唯一性。
答案 0 :(得分:3)
获取哈希码的公式是:
hash = 26 * (A - 'a') + (B - 'a')
= 26 * (A - 97) + (B - 97) // 'a' == 97 in ASCII
= 26A + B - 27*97
所以我们需要证明的是26A + B
对范围<97; 122>
中的任何A和B都有不同的值(<'a'; 'z'>
的十进制值)。我们忽略常数`27 * 97部分,因为它不会改变推理。
让我们看一下相反的陈述 - 当哈希码不明显时?如果A
中的更改可以通过B
的更改进行补偿,则不会有明显区别。所以以下内容必须如此:
26 * A1 + B1 = 26 * A2 + B2
我们假设A2 = A1 + 1
:
26 * A1 + B1 = 26 * (A1 + 1) + B2
= 26 * A1 + B2 + 26
这意味着:
B1 = B2 + 26
B1 - B2 = 26
这是不可能的,因为B是范围内字母&lt;'a'的字符代码; “Z”取代。此范围(十进制ASCII值)为25(122-97)。对于每隔一个A1 - A2的差异,B所需的补偿会增加。
因此,通过证明相反的情况是不可能的,我们已经证明哈希码对于那些字符是唯一的。