我想,您正在使用 DAWG 快速搜索字典中的某个单词。DAWG 具有O(LEN)
搜索复杂性。
许多年前,我开发了 J2ME 应用程序并面临同样的问题。但在那个时候,手机肯定无法提供如此多的 RAM 内存来存储 500K+ 字符串)我使用的解决方案如下:
- 阅读所有单词,对它们进行排序,逐行放入某个文件中,并为每个单词 precompute
skipBytes
。- 该字之前的字节数。计算 skipBytes 是微不足道的。伪代码是
skipBytes[0]=words[0].bytesLen;
for i=1 to n skipBytes[i]=skipBytes[i-1]+words[i].getBytesLength
- 当应用程序启动时,将 500k skipBytes 读取到某个 int 数组。比 500K 字符串小得多)
- 在字典中搜索单词 - 二进制搜索。想象一下,您正在排序数组上执行它,而不是让
array[i]
您制作类似RandomAccessFile.read(skipBytes[i])
. Google Java Random Access Files 我的伪代码当然错了,这只是方向。
复杂度 - O(LEN*LOG(N))
= 二进制搜索和比较字符串的 LOG 是线性复杂度。LOG(500000)~19, LEN ~ 最坏情况下的平均单词长度为 50(神奇的上限),所以搜索操作仍然非常快,只需约 1000 次操作即可在微秒内完成。优点 - 内存使用量小。
我应该提一下,如果 Web 应用程序在许多用户执行搜索时LOG(N)
变得很重要,但如果您的应用程序只为一个人提供服务,则 LOG(500000) 如果不在循环内执行,则不会有太大变化)