Даю все наработки по архивированию словаря (см.файл-архив).
Сейчас алгоритм такой:
Слова сортируются по количеству букв и по алфавиту.
Слова разбиваются по блокам words_2 ... words_8, в каждом блоке только слова с указанным количеством букв (от 2 до 8).
Каждый блок содержит:
- заголовок с количеством слов в блоке (2 байта);
- последовательность битов архивированных слов.
Формирование последовательности битов:
1.
- если текущее слово не имеет одинаковую первую букву с предыдущим словом, то вставляется последовательность битов 000;
- если текущее слово имеет 1 одинаковую первую букву с предыдущим словом, то вставляется последовательность битов 001;
- если текущее слово имеет 2 одинаковых первых букв с предыдущим словом, то вставляется последовательность битов 10;
- если текущее слово имеет 3 одинаковых первых букв с предыдущим словом, то вставляется последовательность битов 11;
- если текущее слово имеет 4 одинаковых первых букв с предыдущим словом, то вставляется последовательность битов 010;
- если текущее слово имеет 5 одинаковых первых букв с предыдущим словом, то вставляется последовательность битов 011.
(Для первого слова блока записывается последовательность битов 000).
2. Оставшиеся неодинаковые буквы текущего слова записываются последовательно своими 5-битными кодами.
3. Переход к следующему слову и п.1.
---
Исходный словарь еще не до конца подчищен от лишних слов.
Нужно всё уместить в 34500 байт.
Сейчас пока получается около 38000 байт. Подсчитал, получается с текущим алгоритмом, чтобы уместиться в 34500 байт, нужно около 13500 слов в словаре.
Последовательный просмотр, произвольный не нужен. Но обязательно разбиение на блоки с одинаковым количеством букв в словах (т.е., сначала блок 2х-буквенных слов, потом блок 3х-буквенных и т.д.)
---------- Post added at 13:28 ---------- Previous post was at 13:25 ----------
Хотя, можно и убрать требование разбиения на блоки. Но тогда нужно знать длину каждого читаемого слова.
К сожалению, мои методы дали худший результат: 55146 и ~85000 для dizpack и токенизации соответственно.
Дело в том, что словарь - это не просто текст с повторяющимися словами или комбинациями символов, так что методы архивирования текста тут не подходят.
---------- Post added at 11:38 ---------- Previous post was at 11:19 ----------
У меня есть мысль, что если не разбивать на блоки по числу букв в слове, то будет еще большее сжатие по моему алгоритму, т.к. больше будет одинаковых букв между соседними словами. Но как эффективно при этом распознавать длину каждого слова, не знаю.
а база Пастухова не поможет? на укроторренте валяется 10гигов.
или как вариант ElcomSoft DreamPack 2010+словари.
Проблема в том, что в русском языке средняя длина слова больше 6 букв, в английском 4-5. Пока удается уместить 13500 слов на 48к, что неплохо. На 128к значительно больше можно. В английском Эрудите для Спектрума - Scrabble http://www.worldofspectrum.org/infos...cgi?id=0004375 - около 12000 слов, это притом, что можно использовать любые падежи, формы и прочее, чем и пользуется их алгоритм (я заглядывал в код). Не оптимально у них. В русском языке можно использовать только нарицательные существительные в именительном падеже.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)