2010-10-20 79 views
2

最近我遇到這讓我很困惑的一個問題, 問題是: 我要壓縮一個序列,以便不丟失任何信息,例如:序列壓縮?

A,A,A,B - > a,b,b,b,a,a,c(它不能被壓縮爲a,b,a,c,因爲這樣我們就失去了a,b,a,c) ,a)

有沒有任何算法來做這樣的事情?這個問題的名稱是什麼?它是壓縮嗎?還是其他什麼? 我真的很感激任何幫助 在此先感謝

+0

你能解釋這些轉變 「A,A,A,B - > A,B,A,B,A,A,C - > A,B,A,A,C」?他們完全不清楚 – Andrey 2010-10-20 11:38:49

+0

有人弄清楚,那是怎麼編碼的? – st0le 2010-10-20 11:40:15

+0

@Andrey:這是RLE的長度下降。實際上有2個轉換。 – 2010-10-20 11:46:51

回答

0

除非你必須自己編寫一些解決方案,你可以使用一些ZIP壓縮庫爲您正在使用的編程語言。

是的,這是數據壓縮。

1

是的,壓縮。一個簡單的算法就是runlength編碼。還有信息論,這是壓縮算法的基礎。

信息理論:更常見的輸入應該更短,從而縮短句子長度。

所以,如果你是二進制編碼,其中順序0101是非常commmon(輸入的約25%),那麼一個簡單的壓縮將是:

0101 = 0 
anything else = 1[original 4 bits] 

所以輸入:0101 1100 0101 0101 1010 0101 1111 0101
將被壓縮爲:0 11100 0 0 11010 0 11111 0

這就是32位的壓縮 - > 20位。

一個重要的教訓:壓縮算法的選擇完全取決於輸入。錯誤的算法,你可能會使數據更長。

+0

因爲我發現遊程長度編碼算法如在此示例中(維基百科):WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW - > 12W1B12W3B24W1B14W僅壓縮隨後的項目,這個問題是我想要得到的結果是這樣的:WBW – 2010-10-20 16:19:56

+2

WBW?那麼你將如何獲取原始信息? – 2010-10-20 20:46:01

2

每種能夠以佔用較少內存的方式轉換數據的算法稱爲壓縮。它可能是無損或有損的。

例如(壓縮的形式爲「例如給定的」 :-)

以下是IMHO的simples形式,稱爲遊程長度編碼,短RLE:

a,a,a,b,c -> 3a,1b,1c 

正如你可以看到所有後續字符,而它們相同的被壓縮成一個。

您也可以搜索爲後續的圖案是困難得多:

a,b,a,b,a,c --> 2(a,b),1(a),1(c) 

有許多關於壓縮算法文獻和網絡資源,你應該使用它們來獲得更深的看法。

+0

感謝您的回覆,我搜索了很多,但沒有發現任何真正有用的解決問題的方法,您確定這個特殊問題存在任何解決方案嗎? – 2010-10-20 16:26:08

+0

在你的第一個例子中,你將一個5個字符的列表壓縮成一個6個字符的列表,這不是壓縮,那就是編碼,並且編碼爲一個擴展! – 2010-10-20 16:26:28

+0

這表明,並非每種壓縮算法對每個輸入都是最好的。 – codymanix 2010-10-20 16:36:26

1

另一個很好的算法是Lempel–Ziv–Welch

我發現奇妙的這個簡單的Javascript LZW功能,從魔術師在140 bytes of javascript

function (
    a // String to compress and placeholder for 'wc'. 
){ 

    for (
     var b = a + "Ā", // Append first "illegal" character (charCode === 256). 
      c = [], // dictionary 
      d = 0, // dictionary size 
      e = d, // iterator 
      f = c, // w 
      g = c, // result 
      h; // c 

     h = b.charAt(e++); 
    ) 

     c[h] = h.charCodeAt(), // Fill in the dictionary ... 
     f = 1 + c[a = f + h] ? a : (g[d++] = c[f], c[a] = d + 255, h); // ... and use it to compress data. 

    return g // Array of compressed data. 

} 
0

我們可以使用LZW壓縮算法來壓縮文本通過高效,快速文件利用哈希表。