기본 제공 세트를 사용하면 데이터의 성격에 따라 몇 가지 경로 수준 압축을 수행하게됩니다. 물론 이것은 컨테이너의 구현에 달려 있습니다.
기수 나무, 디지털 검색 나무, 빨강 검정 나무 등 일부 정보를 살펴보십시오. 각 문자열과 각 문자열을 저장할 필요는 없습니다. 예를 들어, 문제를 단순화하자 : 각각 최대 2 번 나타날 수있는 3 개의 문자 만 있고 각 문자열은 6 자입니다. 세 가지 문자열은 다음과 같습니다
AABBCC, AABCBC,이 예제와 함께 AACBCB
, 우리는 대신에 전체 18 개 노드의 6 + 3 + 4 = 13 개 노드의 최대를 사용하여 멀리 얻을 수 있습니다. 실용적이지는 않지만 당신이하는 일을 모릅니다. 모든 유형의 압축과 마찬가지로 접두사 패턴을 많이 사용할수록 압축률이 높아집니다.
편집 : 숫자 13과 18은 경로 수준 압축에서옵니다. 예를 들어, 스트레이트 C (인수/토론 용)에서 문자열 저장소 클래스를 배열 주위에 래퍼로 구현할 경우 패턴이 포함 된 메모리의 한 지점을 참조하는 각 포인터가있는 문자 포인터 배열을 사용할 수 있습니다. 위의 예에서 18 문자 (6 * 3 = 18)를 사용합니다. 배열의 크기를 더한다 (sizeof (char *)가 4라고 가정 해 봅시다), 우리 배열은 우리의 패턴을 저장하기 위해 3 * 4 바이트의 저장 공간 = 12 + 18 또는 30 바이트를 취합니다 ..
만약 내가 일종의 디지털 검색 트리에 패턴을 저장하면 약간의 트레이드 오프가됩니다. 트리의 노드는 1 바이트 (노드의 문자는 1 바이트, 다음 포인터는 4 바이트)보다 커야합니다. 각 노드는 5 바이트입니다.) 우리가 저장하는 첫 번째 패턴은 AABBCC입니다. 이것은 트리의 6 개 노드입니다. 다음은 AABCBC입니다. 첫 번째 트리의 AAB 경로를 다시 사용하고 CBC의 노드를 세 개 추가해야합니다. 우리는 AA를 재사용하고 CBCB를 위해 4 개의 새로운 노드가 필요합니다.총 13 노드 * 5 바이트 = 65 바이트의 저장 공간입니다. 그러나 데이터의 접두어에 길고 반복되는 패턴이 많은 경우 접두어 경로 수준 압축이 표시됩니다.
이것이 사실이 아니라면, 나는 허프만 또는 LZW 압축을 조사 할 것입니다. 이를 위해서는 정수가 연결된 패턴 사전을 만들어야합니다. 압축하면 사전을 만들고 텍스트의 각 패턴에 대한 정수 ID를 만듭니다. 그런 다음 텍스트의 패턴을 정수 ID로 바꿉니다. 압축을 풀 때, 당신은 그 반대입니다. 이 알고리즘에 대해 더 자세히 설명 할 시간이 없기 때문에이를 찾아야합니다.
단순함/시간면에서는 균형이 맞지 않습니다. 데이터에서 허용하는 경우 짧은 방법을 사용하고 기본 제공 컨테이너 만 사용하십시오. 그렇지 않은 경우 데이터에 맞게 조정해야합니다.
잠깐, "우주의 크기"란 무엇입니까? 그것이 당신이 가지고있는 문자열의 양이라고 말해주지 마십시오 –
그것은 솔루션 공간입니다. 가능한 문자열의 총 수 (대부분이 중복)입니다. 나는 그 (것)들을 전부 해싱하지 않으며, 싶지도 않을 것이다. 아마 나는 더 신중하게 나의 질문을 말 했어야했다. OP를 업데이트하겠습니다. – dfetter88