압축을 위해 데이터를 재정렬 (문자열 집합) 하시겠습니까?


12

압축을 위해 데이터를 재정렬하는 알고리즘이 있습니까? 나는 이것이 데이터와 압축 알고리즘에 고유하다는 것을 이해하지만이 주제에 대한 단어가 있습니까? 이 분야의 연구는 어디서 찾을 수 있습니까?

특히, 나는 150 만 문자열의 json 목록을 가지고 있으며 gzip (HTTP의 경우) 압축이 최적화되도록 문자열을 다시 정렬하려고합니다. 문자열을 정렬하는 것은 꽤 좋지만 실제로 그것이 최적인지는 알 수 없습니다.


1
gzip 압축 (작은 슬라이딩 윈도우가있는 LZ77)을 위해 문자열을 최적으로 재정렬하면 NP-hard 문제처럼 들립니다. 가장 짧은 공통 수퍼 스트링 문제를 줄일 수 있습니다.
Jouni Sirén

@ JouniSirén 가장 짧은 공통 수퍼 스트링이 공통 부분을 연속적으로 갖는 것으로 제한하기 때문에 가장 긴 공통 하위 문자열이 더 나은 접근법이라고 생각합니다. 다루기 쉬운 한 NP-hard는 신경 쓰지 않습니다 (현대 컴퓨터에서 실행하는 데 하루가 걸리는 것처럼).
Jayen

답변:


6

이것은 Navin Goyal의 답변에 추가 된 것입니다.

JSON 파일은 트리 데이터 구조로 간주 될 수 있으므로 문자열에 대한 Burrows-Wheeler 변환의 확장 인 트리에 XBW 변환 을 사용할 수 있습니다 .


1
고마워 JSON 객체가 아닌 JSON 목록 / 배열 만 있으므로 트리로 간주되는 방법을 알 수 없습니다. 문자열을 trie로 변환 할 수는 있지만 이것이 XBW 변환과 어떤 관련이 있는지 알 수 없습니다.
Jayen

4

Burrows--Wheeler 변환 은 압축 할 문자열의 문자를 재정렬하여 작동하는 잘 알려진 압축 알고리즘입니다.


1
고맙지 만이 정보를 어떻게 사용할 수 있는지 잘 모르겠습니다. 압축되도록 목록의 문자열을 다시 정렬하고 싶지만 원래 순서를 되돌릴 수 있는지는 상관하지 않습니다.
Jayen

1

gzip 압축을 향상 시키려면 "유사한"문자열을 목록에서 가깝게 만들고 싶습니다. 이러한 유사성을 정의하는 방법에는 여러 가지가 있습니다. 실제로 잘 작동하는 합리적인 것을 설명하겠습니다. gzip의 블록 크기는 64K입니다. 따라서 데이터는 64K 바이트 블록으로 분할되고 모든 블록은 독립적으로 압축됩니다. 압축을 최적화하면 모든 블록에서 고유 한 k-mer (크기 k의 하위 문자열) 수를 최소화해야합니다. 동기 부여는 그러한 모든 하위 문자열이 식별자로 대체되는 것입니다.

위의 문제는 이론 상으로는 어렵지만 (이것은 하이퍼 그래프 파티셔닝의 변형 임), 빠른 실용적인 알고리즘이 있습니다. 데이터를 한 번에 통과하여 구현할 수있는 LSH와 유사한 클러스터링을 권장 합니다. 알파벳순 정렬은 유사한 문자열을 함께 "클러스터"하는 또 다른 방법입니다. 그러나 특수 클러스터링 알고리즘이 더 잘 수행 될 수 있습니다.

대안은 zstd 를 사용하는 것인데 , 이는 (i) 더 빠르며 (ii) 더 높은 압축 비율을 얻으며 (iii) 블록 크기에 제한이 없으므로 (입력 순서와 상관없이 문자열을 동일하게 압축합니다).


0

얼마 전에 알고리즘이 유용 할 수 있습니다. 편집 거리 알고리즘을 사용하여 각 단어 사이의 거리를 계산합니다. 따라서 각 모서리 가중치가이 거리 인 그래프를 작성합니다. 마지막으로 가중치 합계가 가장 낮은 경로를 선택하는 순서를 얻습니다. 어쩌면 gzip을 향상시킬 수 있습니다.


그 다루기 쉬운 소리지만, 누군가가 그것을 시도 않는 경우, 결과에 코멘트를 게시하시기 바랍니다하지 않습니다
Jayen

테스트 해 볼게요. 이 문제가 궁금합니다. 그 외에 왜 다루기 힘들다고 생각합니까?
라파엘 리베이로

내가 아는 한 편집 거리는 O (nm)입니다. 여기서 n과 m은 문자열 쌍의 문자 수이며 모든 문자열 쌍 O (s ^ 2)에 대해이 작업을 수행해야하므로 n = m, 그것은 O (s ^ 2 * n ^ 2)입니다. 150 만 줄에 대해 내게 들리지 않는 것 같습니다.
Jayen

오, 나는 당신의 문제가 바이너리 크기 만 줄이는 것이라고 생각했기 때문에 복잡성에 대해서는 크게 신경 쓰지 않았습니다. 이 작업이 더 자주 발생합니다.
Rafael Ribeiro

나는 여기에서 찾고 있었고 아마도 편집 거리 비용은 levenshtein automata를 사용하여 줄일 수 있습니다
Rafael Ribeiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.