2016-04-24 99 views
0

我做了關於壓縮逗號分隔整數算法存在的表面水平的研究,但我沒有找到任何相關的。整數CSV壓縮算法

我的目標是壓縮大量已知值範圍的結構化逗號分隔整數。有沒有一種已知的算法來做這樣的事情?如果不是在哪裏開始閱讀一些有關的興趣領域,那麼我會開始研究這種算法?當然,算法必須是可逆的和損失的,這樣我才能解壓縮壓縮的數據來檢索csv值。

數據結構是一個包含三個值的數組,第一個數字的域從0到4,第二個從0到6,第三個從0到n,其中n不是一個大數。重複該結構以創建二維數組中的數據。

回答

0

在結構化數據上使用標準壓縮算法(如gzip或bzip2)不會產生最佳的壓縮效率,因此構建特定於案例的算法確實有效。

數據結構如下所示。

// cell: a data structure, array of three numbers 
// digits[0]: { 0, 1, 2, 3, 4 } 
// digits[1]: { 0, 1, 2, 3 } 
// digits[2]: { 0, 1, 2, ..., n } n is not an absurdly large number 
// Below it is reused in a multi-dimensional array. 
var cells = [ 
    [ [3, 0, 1], [4, 2, 4], [3, 0, 2], [4, 1, 3] ], 
    [ [4, 2, 3], [3, 0, 3], [4, 3, 3], [1, 1, 0] ], 
    [ [3, 3, 0], [2, 3, 1], [2, 2, 5], [0, 2, 4] ], 
    [ [2, 1, 0], [3, 0, 0], [0, 2, 3], [1, 0, 0] ] 
]; 

我也使用標準的壓縮算法在此數據結構的各種試驗(不包括白色空格作爲字符串):

  • GZ從171到88字節的壓縮
  • bzip2的從171到壓縮87個字節
  • 放氣從171到76字節

該算法我CONSTRU壓縮將數據壓縮到33字節,直到n = 192。因此,在特定案例的基礎上,我能夠使用標準文本壓縮算法的兩倍以上的效率來壓縮數據。

我實現這種壓縮的方法是通過映射單元格可容納的所有不同組合的可能值爲整數。如果你想研究這樣一個概念,它就被稱爲數學中的組合數學。然後,我將基數10整數轉換爲更高的基數來表示字符串。因爲我的目標是人類的可用性(壓縮的代碼將被打印),我使用了基數62,我分別用0到61表示{[0-9],[a-z],[A-Z]}。我在將Base62轉換爲兩位數時緩衝了單元格長度。這允許62 * 62(3844)不同的單元組合。

最後,我在表示列數的壓縮字符串的開頭添加了一個基數爲62的數字。當解壓縮y大小時,用於從字符串的長度推斷x大小。因此數據可以正確解壓縮而不會丟失數據。

上面的例子中的壓縮串看起來是這樣的:

var uncompressed = compress(cells); // "4n0w1H071c111h160i0B0O1s170308110" 

我提供我的方法的解釋來解決我的問題,以幫助其他面臨類似的問題。我沒有提供我的代碼爲晦澀的原因。

TL; DR

要壓縮的結構化數據:

  1. 代表離散的對象作爲一個整數
  2. 編碼基座10整數到更高的基
  3. 重複對所有對象
  4. 將行數或列數附加到壓縮字符串

要解壓縮的結構化數據:

  1. 閱讀的行或列,並從字符串長度
  2. 反向於壓縮步驟1和2
  3. 重複對所有對象推導出其他
0

除非您的列表中有一些特定的結構不泄露,並且可能會大大有助於壓縮,否則標準無損壓縮算法(如gzipbzip2)應該可以處理一串數字。

這種常用算法庫應該普遍適用於幾乎所有的語言和平臺。

+0

我想爲csv整數構建一個特定於案例的算法來提高壓縮率。這就是爲什麼我要避免一般的無損文本壓縮算法。 –

+0

@OmarChehab:但是一般的算法對此很好。你想達到的具體目標是什麼? –

+0

鑑於數據的已知結構,我想探索構建特定於案例的算法來提高壓縮效率的方法。一般的壓縮算法肯定會起作用,毫無疑問。如果在這種情況下沒有可能的方式來壓縮它們的壓縮效率,我會使用它們。 –