간결한 데이터 구조 알고리즘에 대한 좋은 개요가 필요합니다


14

(이미 기본 사이트 에서 요청했지만 더 나은 적용 범위를 요청하려면 죄송합니다.)

간결한 데이터 구조 에 대해 알고 있었기 때문에 해당 분야의 최신 개발에 대한 훌륭한 개요가 절실히 필요합니다.

나는 구글에서 내 머리 위로 요청에 대한 구글 결과 상단에서 볼 수있는 많은 기사를 읽었습니다. 나는 여전히 내가 여기서 중요한 것을 놓친 것 같다.

나에게 특히 관심있는 주제는 다음과 같습니다.

  1. 부모, 왼쪽 / 오른쪽 자식, 하위 트리의 요소 수를 효율적으로 가져 오는 이진 트리의 간결한 인코딩

    여기서 주요 질문은 다음과 같습니다. 내가 아는 모든 접근법은 호흡 우선 순서대로 열거 된 트리 노드를 가정합니다 (이 분야의 개척자 작업과 마찬가지로 Jacobson, G. J (1988). 간결한 정적 데이터 구조). 내 작업에 적합한 것 같습니다. 나는 깊이 우선 레이아웃에 주어진 거대한 이진 트리를 다루고 깊이 우선 노드 인덱스는 다른 노드 속성의 핵심이므로 트리 레이아웃을 변경하면 비용을 최소화해야합니다. 따라서 BF 트리 레이아웃 이외의 다른 것을 고려하여 작품에 대한 참조를 얻는 데 관심이 있습니다.

  2. 외부 메모리에 큰 가변 길이 항목 배열. 배열은 변경할 수 없습니다 : 항목을 추가 / 삭제 / 편집 할 필요가 없습니다. 유일한 요구 사항은 O (1) 요소 액세스 시간과 가능한 적은 오버 헤드로, 간단한 오프셋 및 크기 접근 방식보다 낫습니다. 내 작업의 일반적인 데이터에 대해 수집 한 통계는 다음과 같습니다.

    전형적인 품목 수-수억, 최대 수백만;

    아이템의 약 30 %는 1 비트 이하의 길이를 가지며 ;

    40 % -60 % 항목의 길이는 8 비트보다 작습니다.

    항목의 몇 퍼센트 만이 32에서 255 비트 사이의 길이를가집니다 (255 비트가 한계 임)

    평균 항목 길이 ~ 4 비트 +/- 1 비트.

    항목 길이의 다른 분포는 이론적으로 가능하지만 실제로 모든 흥미로운 사례는 위에서 설명한 통계와 비슷합니다.

복잡한 기사, 모호한 튜토리얼, 다소 문서화 된 C / C ++ 라이브러리에 대한 링크-유사한 작업에 유용하거나 교육받은 추측에 의해 그와 비슷한 것-그러한 모든 것들에 감사드립니다.

업데이트 : 나는 질문 1을 추가하는 것을 잊었다. 나는 그것들을 변경하기위한 요구 사항이 없으며, 필요한 모든 것은 노드에서 자식 또는 부모로 항상 이동하는 다양한 방식으로 만 순회하기 때문에 그러한 작업의 평균 비용은 O (1)이었습니다.

또한 일반적인 트리에는 수백만 개의 노드가 있으며 RAM에 완전히 저장해서는 안됩니다.

답변:


12

실제로 효율적인 간결한 외부 메모리 데이터 구조에 관심이 있다고 가정합니다. 이 경우 몇 가지 기본 기술과 엔지니어링을 통해 원하는 것을 얻을 수 있습니다.

나무의 경우 Arroyuelo et al .: Succinct Trees in Practice 를 읽는 것으로 시작하겠습니다 . 이 논문은 메인 메모리의 트리를 다루지 만, 대부분의 기술은 아래와 같이 비슷한 선택으로 외부 메모리에 사용될 수 있습니다.

γδ

에스에스[나는]=1나는제이아르 자형케이(제이)

순위 인덱스를 작게 유지하려면 블록 크기를 상당히 크게 (아마도 킬로바이트 또는 수십 킬로바이트) 만들어야하므로 위의 기본 솔루션은 CPU를 많이 사용합니다. 디스크에 저장된 블록에 약간의 오버 헤드를 추가하면이 문제를 해결할 수 있습니다. 기본적으로 동일한 솔루션을 재귀 적으로 적용하여 각 디스크 블록에 여러 개의 작은 블록과 다른 순위 인덱스를 저장합니다. 올바른 디스크 블록을 검색 한 후에는 전체 블록을 디코딩하는 대신 디스크 내 순위 인덱스를 사용하여 디코딩 할 올바른 작은 블록을 찾습니다. 이 보조 인덱스를 사용하면 가장 빠른 SSD (Solid-State Drive)를 사용하더라도 임의 액세스가 I / O 바인딩 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.