2017-03-17 25 views
1

我看着link瞭解lz4是如何工作的。我寫了下面的測試。我們可以看到sinInput2不能被壓縮,因爲它只有隨機數據。 sinInput1的大小減少到1/8。我想這是因爲它的數據有8個不同的塊。這是否意味着lz4可以找到重複的子串?它是否有任何限制可以找到一個子字符串多長時間?lz4能找到連續的重複子串嗎?

#include <string> 
#include <iostream> 
#include "lz4.h" 
#include <stdio.h>  /* printf, NULL */ 
#include <stdlib.h>  /* srand, rand */ 
#include <time.h>  /* time */ 
#include <math.h> 
int main() { 
    using namespace std; 

    srand(time(NULL)); 
    double sinInput1[1024]; 
    double sinInput2[1024]; 
    for (int i = 0; i < 1024; ++i) { 
     sinInput1[i]=sin(i % 128); 
     sinInput2[i]=sin(i); 
    } 

    int inputSize = 1024 * sizeof(double); 
    cout << "Input size: " << inputSize << endl; 
    char *compressedData = new char[2 * inputSize]; 

    cout << "Compressed size of sinInput1: " << LZ4_compress_fast((char*)sinInput1, compressedData, inputSize, inputSize*2, 1) << endl; 
    cout << "Compressed size of sinInput2: " << LZ4_compress_fast((char*)sinInput2, compressedData, inputSize, inputSize*2, 1) << endl; 

    return 0; 
} 

Input size: 8192 
Compressed size of sinInput1: 1064 
Compressed size of sinInput2: 8222 

回答

1

LZ4可以找到重複的子串。 它很容易找到它們。

重複的子字符串可以有任何長度,高達64 KB。 實際上,大多數重複模式是< = 4個字節,其中最常見的是一堆零。但偶爾有一些異常值。

一旦找到模式,它可以重複任意次數。 LZ4對比賽的大小沒有格式限制。