Полагаю, вы используете DAWG для быстрого поиска слова в словаре. DAWG имеет O(LEN)
сложность поиска.
Много лет назад я разработал приложение J2ME и столкнулся с той же проблемой. Но в то время телефоны определенно не могли предоставить такой объем оперативной памяти, чтобы хранить строки размером 500K +). Я использовал следующее решение:
- Читать все слова, сортировать их, вставлять в какой-то файл построчно и для
каждое слово предварительно вычисляется
skipBytes
. - количество байтов до этого
слово. Вычисление skipBytes тривиально. псевдокод
skipBytes[0]=words[0].bytesLen;
for i=1 to n skipBytes[i]=skipBytes[i-1]+words[i].getBytesLength
- Когда приложение запускается, прочитайте 500k skipBytes в некоторый массив int. Это
намного меньше, чем строки 500K)
- Поиск слова в dict - двоичный поиск. Представьте, что вы выполняете его в отсортированном массиве, но вместо
array[i]
вы делаете что-то вроде RandomAccessFile.read(skipBytes[i])
. Google Java Random Access Files мой псевдокод, конечно, неправильный, это просто направление.
Сложность - O(LEN*LOG(N))
= Журнал двоичного поиска и сравнения строк имеет линейную сложность. LOG (500000) ~ 19, LEN ~ средняя длина слова в худшем случае равна 50 (фантастическая верхняя граница), поэтому операция поиска все еще очень быстрая, всего ~ 1000 операций она будет выполнена за микросекунды. Преимущество - небольшое использование памяти.
Следует отметить, что в случае веб-приложения, когда многие пользователи выполняют поиск, LOG(N)
становится важным, но если ваше приложение предоставляет сервис только для одного человека, LOG (500000) не сильно меняется, если оно выполняется не внутри петля) * * 1 022