9-哈希-字母转数字

字母转数字的方法一

  • 单词/字符串下标值,其实就是字母/文字数字
  • 所以我们需要设计一种方案,可以将单词转成适当的下标。
  • 其实计算中有很多的编码方案就是用数字代替单词的字符,就是字符编码
  • 常见的字符编码:
    • 比如ASCII编码:a是97,b是98,依次类推122代表z。
  • 我们也可以设计一个自己的编码系统,比如a是1,b是2,c是3,依次类推,z是26
  • 当然我们可以加上空格用0代替,就是27个字符(不考虑大写问题)。
  • 但是,有了编码系统后,一个单词如何转成数字。
    • 方案一:数字相加:
      • 一种转换单词的简单方案就是把单词每个字符的编码求和。
      • 列如单词 cats 转成数字:3+1 + 20 + 19 = 43,那么43就作为cats单词的下标存在数组中。
      • 问题:按照这种方案有一个很明显的问题就是很多单词最终的下标可能都是43.
        • 比如:was/tin/give/tend/moan/tick等等。
        • 我们知道数组中一个下标值位置只能存储一个数据。
        • 如果存入后来的数据,必然会造成数据的覆盖。
        • 一个下标存储多个单词显示是不合理的。
    • 方案二:幂的连乘:
      • 现在,我们想通过一种算法,让单词 cats 转成数字后不那么普通,数字相加的方案就有些过于普通了。
      • 有一种方案就是使用幂的连乘:
      • 其实我们平时使用的大于10的数字,可以用一种幂的连乘来表示它的唯一性:比如:7654 = 7 10的3次方 + 6 10的2次方 + 5 * 10的1次方 + 4 10的0次方
      • 我们的单词也可以使用这种方案来表示:比如 cats = 3 27的3次方 + 1 27的2次方 + 20 * 27 + 17 = 60335
      • 这样得到的数字可以基本保证它的唯一性,不会和别的单词重复。
      • 问题:单词计算出的数组过大
        • 如果一个单词是 zzzzzzzzzz(一般英文单词不会超过10个字符)那么得到的数字超过 7000000000000.数组可以表示这么大的下标值么?
        • 而且就算能创建这么大的数组,事实上会有很多无效的单词。9 哈希-字母转数字 - 图1
        • 创建这么大的数组是没有意义的。

以上两种方案总结:
第一种方案(把数字相加求和)产生的数组下标太少。
第二种方案(与27的幂相乘求和)产生的数组下标太多。