我有一個數以百萬計的街道名稱列表,並希望使用壓縮算法對它們進行壓縮。我不確定哪種算法最適合。大多數街道名稱都有共同的子字符串,例如「街道」,「方式」,...想要街道名稱的壓縮算法
所有街道名稱的集合是固定的,不會動態變化。
起初我一直在想哈夫曼編碼,但是它只編碼單個字母,所以它不會給出很好的性能。所以我想到了生成一個trie並計算最常見的子串。然後,我可以通過某種代碼來遍歷這個trie,以便獲取這個單詞,並使用像huffman編碼這樣的代碼來壓縮這些代碼。我不確定這是不是比它需要更復雜。
有誰知道在我的情況下有意義的壓縮技術?
EDIT 1
我的用例是這樣的:我有有限的存儲尺寸的電話設備。這部手機需要保存特定國家所有街道的所有街道名稱。現在,每個街道對象都有一些值,其中街道的名稱爲字符串。這佔用了大部分空間,我想盡量減少它。由於名稱非常相似,即以「......街道」或「......方式」最後結尾,我認爲可能值得實施針對此場景的特定壓縮算法。
一個簡單的gzip壓縮了約50%。我認爲應該有可能從中獲得更多。
EDIT 2
Ebbe M.佩德森的解決方案實際上是給很好的表現效果。下面是一些代碼(用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 2013-03-26 19:32:51
你需要自己實現嗎?我只是測試一些壓縮庫,並使用最好的。我想[LZMA](http://en.wikipedia.org/wiki/Lempel-Ziv-Markov_chain_algorithm)會很好。 – Blorgbeard 2013-03-26 19:33:22
不確定你的用例是什麼,但gzip/bzip是否足夠? – mon4goos 2013-03-26 19:32:58