간결한 데이터 구조

Succinct data structure

컴퓨터 과학에서, 간결한 데이터 구조는 정보 이론 하위에 "가까운" 공간을 사용하는 데이터 구조이지만, (다른 압축 표현과 달리) 여전히 효율적인 쿼리 연산을 가능하게 한다.이 개념은 원래[1] Jacobson에 의해 비트 벡터, (라벨이 없는) 트리 및 평면 그래프를 인코딩하기 위해 도입되었습니다.일반적인 무손실 데이터 압축 알고리즘과 달리 간결한 데이터 구조는 먼저 압축을 풀지 않고 내부에서 사용할 수 있습니다.관련 개념은 데이터 구조의 크기가 표현되는 특정 데이터에 따라 달라지는 압축 데이터 구조의 개념입니다.

Z Z 일부 데이터를 저장하는 데 필요한 정보 이론상 최적의 비트 수라고 가정합니다.이 데이터의 표현은 다음과 같습니다.

  • Z+ ( ){ Z + (1}비트의 공간이 한 경우 암묵적으로 사용합니다.
  • Z+ () { Z + ( ) }비트의 공간이 한 경우 간결하게 표시됩니다.
  • O( { O비트의 공간이 한 경우 컴팩트합니다.

예를 들어 2개의 스타일 비트를 하는 데이터 구조는 콤팩트하고 + ( 스타일 Z {Z 비트는 하며,Z + lgZ( 스타일 Z Z 비트는 간결하며 + Z+3) 비트는 암묵적입니다.

따라서 암묵적 구조는 일반적으로 입력 데이터의 치환을 사용하여 정보를 저장하는 것으로 축소됩니다. 가장 잘 알려진 예는 입니다.

간결한 사전

순위/선택 사전이라고도 하는 간결한 색인화 사전은 이진 트리, kary 트리 및 멀티셋,[2] 접미사 트리 [3]배열 등 많은 간결한 표현 기술의 기초를 형성한다.기본적인 문제는 U [ ] { , , , - { U = [ \ n ) \ { , 1 , n - 1 \}의 저장하는 것입니다.여기서 보통 비트 B[ ]{ 0 . n } { \ 표시됩니다 인덱스 가능한 사전은 사전에서 일반적인 메서드(쿼리 및 동적 대소문자의 삽입/삭제)와 다음 작업을 지원합니다.

{ , { q \ \ { , \ }

즉, r q () _ \ _ x x까지q에 하는 요소의 수를 반환하고 (는 x(\ _ 발생 를 반환합니다 { q}

n+ (n )\ n + ( ) of space (공간(원래 비트 배열 및(n ) \ ( n )보조구조)를 하여 일정시간 랭크와 선택을 지원하는 간단한 표현이[4] 있습니다.범위 최소 쿼리와 유사한 아이디어를 사용합니다. 제한된 크기의 하위 문제에서 중지되기 전에 반복 횟수가 일정합니다.비트 B B l 2 l=\비트의 블록과 s (\ s=\/2 작은 블록으로 분할됩니다.각 대형 블록에 대해 첫 번째 비트의 랭크는 별도의 l [ /]({ [ 0 \ 에 저장됩니다.이러한 엔트리는 \ \ n / \ lg n / \ display n / lg n / lg = lg \ display n / lg \ display n큰 블록 내의 다른 [ / ]{ }[l/에는 포함된 각 l lg † \ l n} 작은 블록의 순위가 저장됩니다.여기서의 차이는 lg= lg= 2 n lg lg ⁡ { l=\ \ n비트만 하면 된다는 점입니다.따라서 이 표는 총 ( lg lgn / n / lg n n \ ( )\l=n / n비트를 사용합니다.그런 다음 lg[ i의 비트 문자열s(\ s 가능한 모든 순위 쿼리에 대한 답변을 저장하는 룩업 R_ 사용할 수 있습니다 lgdisplay n lg display n lg display n lg display n lg display n lg display n lgdisplay lg display lg display display n lg display n display ndisplay n\ n비트의 스토리지 공간따라서 이러한 보조 테이블은 각각(n )\( n )이므로 이 데이터 구조는 O( 1)타임 n + ( +( n )비트의 에서의 순위 쿼리를 지원합니다.

r (x 쿼리에 일정 시간 응답하기 위해 정수 시간 알고리즘은 다음을 계산합니다.

실제로 룩업 비트 연산 및 작은 블록에 설정된 비트 수를 찾는 데 사용할 수 있는 작은 테이블로 대체할 수 있습니다.간결한 데이터 구조가 대규모 데이터 세트에서 사용되기 때문에 캐시 누락이 훨씬 잦아지고 검색 테이블이 더 가까운 CPU 캐시에서 제거될 가능성이 [5]높아집니다.랭크에 사용되는 보조구조와 동일한 바이너리 검색을 실행하면 선택 쿼리를 쉽게 지원할 수 있지만 최악의 경우 O n O n시간이 ./ lg n + ( lg n ( ) o ( n ) { / \\ n + O ( { \ { n \ ( n )비트를 사용한 보다 복잡한 구조를 사용하여 일정 시간 [6]에 선택할 수 있다.실제로 이러한 솔루션의 대부분은 점근적 이점이나타나기 전에 O O 숨겨진 상수를 가지고 있습니다.광대어 연산 및 단어 정렬 블록을 사용한 구현은 실제로 [7]더 나은 성능을 발휘하는 경우가 많습니다.

엔트로피 압축 사전

+ (n ){ n + (n )스페이스 어프로치는 [ 길이 n n구별되는 m{\m} - 서브셋이[n](또는 n{ n 이진 문자열)에 m {\display style n}이있는 것에 주목함으로써 개선할 수 있습니다.} 1's)와 같이 n) (nm ) \ \ { } ( m , n \ \ { } { \rceil }는B를 하는 데 필요한 비트 수에 대한 이론상 하한을 나타내는 입니다 ( ,) + ( ( ,){ { { ( , ) + ( { \ { } ( , ) } )[8]스페이스이 구조는 랭크 및 선택 쿼리를 지원하도록 할 수 있으며 B(m ,) + ( + lg lg n / n ) \ { ( m , ) + ( +\ n / n )스페이스를 합니다.[2]그러나 이 구조에서 올바른 순위 쿼리는 최소 완전 해시 함수의 작동 방식과 유사하게 집합에 포함된 요소로 제한됩니다.이 바운드는 사전의 저장 공간을 ( , n )+ ( / tn + 3/) ( \ { {} ( , ) + ( ^ { } / \ ^ { } + n / )로 줄임으로써 공간/ 시간 트레이드오프( )로 줄일 수 있습니다

Null 종단 문자열(C 문자열)은 Z + 1 공간을 차지하므로 암묵적입니다.임의의 길이(Pascal 문자열)의 문자열은 Z + log(Z) 공간을 차지하므로 간결합니다.2 = 4 GiB의 데이터가 매우 긴 문자열이고64 2 = 16 EiB의 데이터가 실제 문자열보다 크기 때문에32 최대 길이가 있는 문자열이 있는 경우, 길이가 있는 문자열도 암묵적이며 여기서 k는 최대 길이를 나타내는 데이터 수(예: 64비트)입니다.

일련의 가변 길이 항목(문자열 등)을 부호화할 필요가 있는 경우는, 다양한 가능성이 있습니다.직접적 접근법은 길이와 항목을 각 레코드에 저장하는 것입니다. 그런 다음 이러한 항목을 차례로 배치할 수 있습니다.이를 통해 k번째 항목을 찾을 수 없지만 다음으로는 효율적입니다.다른 방법으로는 구분 기호(예: null-terminated 문자열)를 사용하여 항목을 정렬하는 것입니다.이 방법에서는 길이 대신 딜리미터가 사용되며 시퀀스 전체에서 딜리미터를 스캔해야 하므로 속도가 상당히 느립니다.둘 다 공간 효율적입니다.또 하나의 방법은 아웃오브밴드 분리입니다.구분자는 구분하지 않고 항목을 차례로 배치할 수 있습니다.그런 다음 항목 경계를 이 시퀀스에 길이 또는 더 나은 오프셋의 시퀀스로 저장할 수 있습니다.또는 항목이 시작되는 위치에 1s로 구성되고 다른 위치에 0s로 구성되는 별도의 이진 문자열이 항목과 함께 인코딩됩니다. 문자열을 지정하면 인덱스를 [10]지정하면 항목이 어디에서 시작되는지 판단할 수 있습니다2Z 공간, 즉 O(Z)를 사용하기 때문에 콤팩트하지만 간결하지는 않습니다.

다른 예는 바이너리 트리의 표현입니다n개의 \ 임의의 바이너리 트리는 +n ) 표시할 수 .또한 부모, 왼쪽 및 오른쪽 자식 찾기, 서브트리 크기 반환 등 임의의 노드에서 다양한 조작을 지원합니다.일정한 시간 안에n개 다른 바이너리트리 수는 ( {/ ( 1/ ( 입니다 n n의 경우 약 4입니다.따라서 이를 인코딩하려면 로그 µ style _}(})= 필요합니다.따라서 간결한 바이너리 트리는 노드당

「 」를 참조해 주세요.

레퍼런스

  1. ^ Jacobson, G. J (1988). Succinct static data structures (Ph.D. thesis). Pittsburgh, PA: Carnegie Mellon University.
  2. ^ a b Raman, R.; V. Raman; S. S Rao (2002). "Succinct indexable dictionaries with applications to encoding k-ary trees and multisets". Proceedings of the thirteenth annual ACM-SIAM symposium on Discrete algorithms. pp. 233–242. arXiv:0705.0552. CiteSeerX 10.1.1.246.3123. doi:10.1145/1290672.1290680. ISBN 0-89871-513-X.
  3. ^ Sadakane, K.; R. Grossi (2006). "Squeezing succinct data structures into entropy bounds" (PDF). Proceedings of the seventeenth annual ACM-SIAM symposium on Discrete algorithm. pp. 1230–1239. ISBN 0-89871-605-5. Archived from the original (PDF) on 2011-09-29.
  4. ^ Jacobson, G. (1 November 1989). Space-efficient static trees and graphs (PDF). 30th IEEE Symposium on Foundations of Computer Science. doi:10.1109/SFCS.1989.63533. Archived from the original (PDF) on 2016-03-12.
  5. ^ González, R.; S. Grabowski; V. Mäkinen; G. Navarro (2005). "Practical implementation of rank and select queries" (PDF). Poster Proceedings Volume of 4th Workshop on Efficient and Experimental Algorithms (WEA). pp. 27–38.
  6. ^ Clark, David (1996). Compact pat trees (PDF) (Ph.D. thesis). University of Waterloo.
  7. ^ Vigna, S. (2008). Broadword implementation of rank/select queries (PDF). Experimental Algorithms. Lecture Notes in Computer Science. Vol. 5038. pp. 154–168. CiteSeerX 10.1.1.649.8950. doi:10.1007/978-3-540-68552-4_12. ISBN 978-3-540-68548-7.
  8. ^ Brodnik, A.; J. I Munro (1999). "Membership in constant time and almost-minimum space" (PDF). SIAM J. Comput. 28 (5): 1627–1640. CiteSeerX 10.1.1.530.9223. doi:10.1137/S0097539795294165.
  9. ^ Pătraşcu, M. (2008). "Succincter" (PDF). Foundations of Computer Science, 2008. FOCS'08. IEEE 49th Annual IEEE Symposium on. pp. 305–313.
  10. ^ Belazzougui, Djamal. "Hash, displace, and compress" (PDF).