似乎所有的案例都指向了一个目标:将字符串转成下标值
但是,怎样才能将一个字符串转成数组的下标值呢?
- 单词/字符串转下标值,其实就是字母/文字转数字
怎么转?
现在我们需要设计一种方案,可以将单词转成适当的下标:
其实计算机中有很多的编码方案就是用数字代替单词的字符。就是字符编码。
比如ASCII编码:a是97,b是98,依次类推122代表z
我们也可以设计一个自己的编码系统,比如a是1,b是2,依次类推,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 + 4
我们的单词也可以使用这种方案来表示:比如cats = 3 * 27 ^3 + 1 * 27 ^2 + 20 * 27 + 19 = 60337;
这样得到的数字可以基本保障它的唯一性,不会和别的单词重复
问题:如果一个单词是zzzzzzzzzz(一般英文单词不会超过10个字符)。那么得到的数字超过70000000000000.数组可以表示这么大的下标值吗?
而且就算能创建这么大的数组,事实上由很多是无效的单词
创建这么大的数组是没有意义的
两种方案总结:
- 第一种方案(把数字相加求和)产生的数组下标太少
- 第二章方案(与27的幂相乘求和)产生的数组下标又太多—>优化这种方案