У меня есть список миллионов имен улиц и вы хотите сжать их с помощью алгоритма сжатия. Я не уверен, какой алгоритм подходит лучше всего. Большинство названий улиц имеют в них общие подстроки, такие как, например, «улица», «путь», ...алгоритм сжатия для названий улиц
Набор всех названий улиц фиксирован и не изменяется динамически.
Сначала я думал о кодировке хаффмана, но это только коды для одиночных букв, поэтому он не даст большой производительности. Поэтому я подумал о создании trie и подсчете наиболее распространенных подстрок. Тогда у меня мог бы быть какой-то код для прохождения этого три, чтобы вернуть слово и сжать эти коды, используя что-то вроде кодирования хаффмана. Я не уверен, что это не делает его более сложным, чем нужно.
Кто-нибудь знает технику сжатия, которая имеет смысл в моем случае?
EDIT 1
Мой UseCase таким образом: у меня есть телефон устройства с ограниченным размером памяти. Этот телефон должен содержать все названия улиц всех улиц в конкретной стране. Теперь каждый уличный объект имеет некоторые значения, а среди них - название улицы в виде строки. Это занимает больше места, и я хотел бы свести его к минимуму. Поскольку имена очень похожи, т. Е. Большинство заканчивается на «... street» или «... way», я подумал, что стоит реализовать конкретный алгоритм сжатия, ориентированный на этот сценарий.
Простой gzip принес сжатие около 50%. Я думаю, что можно было бы получить больше от этого.
РЕДАКТИРОВАТЬ 2
Решение Ebbe М. Педерсен на самом деле дает очень хорошие результаты производительности. Вот код (написанный на C#):
private IndexedItem[] _items;
public void CompressStrings(string[] strings)
{
Array.Sort(strings);
_items = new IndexedItem[strings.Length];
string lastString = string.Empty;
for (int i = 0; i < strings.Length; i++)
{
byte j = 0;
while (lastString.Length > j && lastString[j] == strings[i][j])
{
j++;
}
_items[i] = new IndexedItem() { Prefix = j, Suffix = strings[i].Substring(j) };
lastString = strings[i];
}
}
private struct IndexedItem
{
public byte Prefix;
public string Suffix;
}
После сжатия Я также посылаю его через DeflateStream, что приводит к общей компрессии около 30%
Большое спасибо за ответы
Как вы собираетесь использовать сжатые данные? – Serg
Вам нужно реализовать его самостоятельно? Я бы просто протестировал некоторые библиотеки сжатия и использовал все, что работает лучше всего. Я предполагаю, что [LZMA] (http://en.wikipedia.org/wiki/Lempel-Ziv-Markov_chain_algorithm) будет хорошим. – Blorgbeard
Не уверен, что такое ваш вариант использования, но будет ли gzip/bzip достаточным? – mon4goos