작은 텍스트 문자열을 압축하는 알고리즘을 찾고 있습니다 : 50-1000 바이트 (예 : URL). 어떤 알고리즘이 가장 적합합니까?
tinyurls
저장 공간과 관련이 있습니까?
작은 텍스트 문자열을 압축하는 알고리즘을 찾고 있습니다 : 50-1000 바이트 (예 : URL). 어떤 알고리즘이 가장 적합합니까?
tinyurls
저장 공간과 관련이 있습니까?
답변:
Smaz를 확인하십시오 :
Smaz는 매우 짧은 문자열을 압축하는 데 적합한 간단한 압축 라이브러리입니다.
string:orig_size:compr_size:space_savings
:) This is the very end of it.:27:13:52%
, Lorem ipsum dolor sit amet:26:19:27%
, Llanfairpwllgwyngyll:20:17:15%
, aaaaaaaaaaaaa:13:13:0%
, 2BTWm6WcK9AqTU:14:20:-43%
,XXX:3:5:-67%
허프만은 정적 비용 인 허프만 테이블을 가지고 있기 때문에 좋은 선택에 동의하지 않습니다.
이를 제거하는 적응 형 버전이 있지만 압축률이 저하 될 수 있습니다. 실제로, 질문해야 할 질문은 "이러한 특성을 가진 텍스트 문자열을 압축하는 알고리즘"입니다. 예를 들어, 긴 반복이 예상되는 경우 간단한 Run-Lengh Encoding으로 충분할 수 있습니다. 영어 단어, 공백, 문장 부호 및 가끔 나오는 숫자 만 표시되도록 보장 할 수있는 경우 사전 정의 된 허프만 테이블이있는 허프만은 좋은 결과를 얻을 수 있습니다.
일반적으로 Lempel-Ziv 제품군의 알고리즘은 압축 및 성능이 매우 우수하며 라이브러리가 풍부합니다. 나는 그와 함께 갈 것입니다.
압축되는 내용이 URL이라는 정보를 사용하면 압축하기 전에 알고리즘을 쉽게 사용할 수 있으므로 압축하기 전에 제안하는 것이 좋습니다. URL은 잘 정의 된 패턴을 따르며 일부는 매우 예측 가능합니다. 이 지식을 활용하면 URL을 더 작은 것으로 URL을 체계화 할 수 있으며 허프만 인코딩의 기본 아이디어가 도움이 될 수 있습니다.
예를 들어, URL을 비트 스트림으로 변환하는 경우 "http"를 비트 1로 바꾸고 다른 비트는 "0"으로 바꾸고 실제 프로 코톨을 붙일 수 있습니다 (또는 표를 사용하여 https와 같은 다른 일반적인 프로토콜을 얻을 수 있음) ftp, 파일). 프로토콜의 끝을 표시 할 수있는 한 ": //"를 모두 삭제할 수 있습니다. 기타 URL 형식에 대해 읽고 공간을 덜 차지하도록 어떻게 코드를 작성할 수 있는지 생각해보십시오.
나는 코드를 가지고 있지 않지만 항상 256 * 256 문자 ( RFC 1978 , PPP Predictor Compression Protocol ) 의 2D 룩업 테이블을 작성하는 접근법을 좋아했습니다 . 문자열을 압축하려면 각 문자를 반복하고 조회 테이블을 사용하여 현재 및 이전 문자를 테이블의 인덱스로 사용하여 '예측 된'다음 문자를 가져옵니다. 일치하는 항목이 있으면 단일 1 비트를 작성하고, 그렇지 않으면 0을 작성하고 룩업 테이블을 현재 문자로 업데이트하십시오. 이 방법은 기본적으로 데이터 스트림에서 가장 가능성이 높은 다음 문자의 동적 (조잡한) 조회 테이블을 유지합니다.
룩업 테이블을 0으로 시작할 수 있지만 영어와 같이 각 문자 쌍에 대해 가장 가능성이 높은 문자로 초기화 된 경우 매우 짧은 문자열에서 가장 잘 작동합니다. 초기 룩업 테이블이 압축 및 압축 해제에 대해 동일하다면 압축 된 데이터로 내 보내지 않아도됩니다.
이 알고리즘은 뛰어난 압축률을 제공하지는 않지만 메모리 및 CPU 리소스가 엄청나게 부담스럽고 연속적인 데이터 스트림에서도 작동 할 수 있습니다. 압축되는 데이터 유형에 맞게 조정합니다.
사전 설정 사전을 지원하는 알고리즘 / 라이브러리 (예 : zlib) .
이런 식으로 입력에 나타날 수있는 동일한 종류의 텍스트로 컴프레서를 프라이밍 할 수 있습니다. 파일이 어떤 방식 으로든 유사하면 (예 : 모든 URL, 모든 C 프로그램, 모든 StackOverflow 게시물, 모든 ASCII 아트 도면) 특정 하위 문자열이 대부분 또는 모든 입력 파일에 나타납니다.
하나의 입력 파일에서 동일한 하위 문자열이 여러 번 반복되는 경우 모든 압축 알고리즘은 공간을 절약합니다 (예 : 영어 텍스트의 "the"또는 C 코드의 "int").
그러나 URL의 경우 특정 문자열 (예 : " http : // www .", ".com", ".html", ".aspx")은 일반적으로 각 입력 파일에 한 번 표시되므로 파일간에 공유해야합니다. 파일 당 하나의 압축 발생이 아닌 사전 설정 사전에 배치하면이를 달성 할 수 있습니다.
허프만 코딩은 일반적으로이 작업에 적합합니다.
줄임말이 아니라 텍스트를 압축하는 것에 대해 이야기하고 있다면 deflate / gzip (gzip을 감싸는 래퍼), 작은 파일과 텍스트에 zip이 잘 작동합니다. 다른 알고리즘은 bzip2 등과 같은 더 큰 파일에 매우 효율적입니다.
Wikipedia 에는 압축 시간 목록이 있습니다. (효율 비교를 찾으십시오)
Name | Text | Binaries | Raw images
-----------+--------------+---------------+-------------
7-zip | 19% in 18.8s | 27% in 59.6s | 50% in 36.4s
bzip2 | 20% in 4.7s | 37% in 32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip | 24% in 21.1s | 37% in 70.6s | 57& in 41.6s
gzip | 25% in 4.2s | 39% in 23.1s | 60% in 5.4s
zip | 25% in 4.3s | 39% in 23.3s | 60% in 5.7s
유니 코드에 대한 표준 압축 체계를 살펴볼 수 있습니다 .
SQL Server 2008 R2는 내부적으로 사용하며 최대 50 % 압축을 달성 할 수 있습니다.