我看到的一种用于最小化拼写词典中空间的结构是将每个单词编码为:
- 与最后一个共同的字符数(一个字节);和
- 新的结局。
所以单词列表
HERE would encode as THIS
sanctimonious 0,sanctimonious
sanction 6,on
sanguine 3,guine
trivial 0,trivial
您在那里直接节省了 7 个字节 (19%),我怀疑这对于 20,000 个单词的字典来说是相似的,只是由于相邻单词(公共前缀)之间的最小距离。
例如,我在已排序的字典上运行了一个测试程序,并将旧存储空间计算为单词长度加一(用于终止符),新存储空间作为常用长度加一,不常用后缀长度加一终结者。这是该测试程序的最后一部分,表明您可以超过 50%:
zwiebacks -> zygote common= old=1044662 new=469762 55.0%
zygote -> zygotes common=zygote old=1044670 new=469765 55.0%
zygotes -> zygotic common=zygot old=1044678 new=469769 55.0%
zygotic -> zymase common=zy old=1044685 new=469775 55.0%
zymase -> zymogenic common=zym old=1044695 new=469783 55.0%
zymogenic -> zymology common=zymo old=1044704 new=469789 55.0%
zymology -> zymolysis common=zymol old=1044714 new=469795 55.0%
zymolysis -> zymoplastic common=zymo old=1044726 new=469804 55.0%
zymoplastic -> zymoscope common=zymo old=1044736 new=469811 55.0%
zymoscope -> zymurgy common=zym old=1044744 new=469817 55.0%
zymurgy -> zyzzyva common=zy old=1044752 new=469824 55.0%
zyzzyva -> zyzzyvas common=zyzzyva old=1044761 new=469827 55.0%
为了加快查找速度,内存中有一个包含 26 个条目的表,用于保存以 a、b、c、...、z 开头的单词的起始偏移量。这些偏移处的单词总是以 0 作为第一个字节,因为它们与前一个单词没有相同的字母。
这似乎是一种 trie,但没有指针,如果树中的每个字符都有一个与之关联的 4 字节指针,这肯定会占用空间。
请注意,这是我 CP/M 时代的记忆比现在少得多的时候。