압축을 위해 데이터를 재정렬하는 알고리즘이 있습니까? 나는 이것이 데이터와 압축 알고리즘에 고유하다는 것을 이해하지만이 주제에 대한 단어가 있습니까? 이 분야의 연구는 어디서 찾을 수 있습니까?
특히, 나는 150 만 문자열의 json 목록을 가지고 있으며 gzip (HTTP의 경우) 압축이 최적화되도록 문자열을 다시 정렬하려고합니다. 문자열을 정렬하는 것은 꽤 좋지만 실제로 그것이 최적인지는 알 수 없습니다.
압축을 위해 데이터를 재정렬하는 알고리즘이 있습니까? 나는 이것이 데이터와 압축 알고리즘에 고유하다는 것을 이해하지만이 주제에 대한 단어가 있습니까? 이 분야의 연구는 어디서 찾을 수 있습니까?
특히, 나는 150 만 문자열의 json 목록을 가지고 있으며 gzip (HTTP의 경우) 압축이 최적화되도록 문자열을 다시 정렬하려고합니다. 문자열을 정렬하는 것은 꽤 좋지만 실제로 그것이 최적인지는 알 수 없습니다.
답변:
Burrows--Wheeler 변환 은 압축 할 문자열의 문자를 재정렬하여 작동하는 잘 알려진 압축 알고리즘입니다.
gzip 압축을 향상 시키려면 "유사한"문자열을 목록에서 가깝게 만들고 싶습니다. 이러한 유사성을 정의하는 방법에는 여러 가지가 있습니다. 실제로 잘 작동하는 합리적인 것을 설명하겠습니다. gzip의 블록 크기는 64K입니다. 따라서 데이터는 64K 바이트 블록으로 분할되고 모든 블록은 독립적으로 압축됩니다. 압축을 최적화하면 모든 블록에서 고유 한 k-mer (크기 k의 하위 문자열) 수를 최소화해야합니다. 동기 부여는 그러한 모든 하위 문자열이 식별자로 대체되는 것입니다.
위의 문제는 이론 상으로는 어렵지만 (이것은 하이퍼 그래프 파티셔닝의 변형 임), 빠른 실용적인 알고리즘이 있습니다. 데이터를 한 번에 통과하여 구현할 수있는 LSH와 유사한 클러스터링을 권장 합니다. 알파벳순 정렬은 유사한 문자열을 함께 "클러스터"하는 또 다른 방법입니다. 그러나 특수 클러스터링 알고리즘이 더 잘 수행 될 수 있습니다.
대안은 zstd 를 사용하는 것인데 , 이는 (i) 더 빠르며 (ii) 더 높은 압축 비율을 얻으며 (iii) 블록 크기에 제한이 없으므로 (입력 순서와 상관없이 문자열을 동일하게 압축합니다).
얼마 전에 알고리즘이 유용 할 수 있습니다. 편집 거리 알고리즘을 사용하여 각 단어 사이의 거리를 계산합니다. 따라서 각 모서리 가중치가이 거리 인 그래프를 작성합니다. 마지막으로 가중치 합계가 가장 낮은 경로를 선택하는 순서를 얻습니다. 어쩌면 gzip을 향상시킬 수 있습니다.