해시 어레이 트리

Hashed array tree

컴퓨터 과학에서 해시 어레이 트리(HAT)는 에드워드 시타스키가 [1][2]1996년에 발표한 동적 어레이 데이터 구조이며, 데이터를 하나의 연속된 메모리 영역에 유지하는 단순한 동적 어레이와는 달리 데이터 요소를 저장하기 위해 별도의 메모리 단편(또는 "leave") 배열을 유지합니다.주된 목적은 자동 어레이 크기 조정 조작에 의한 요소 복사량을 줄이고 메모리 사용 패턴을 개선하는 것입니다.

단순 동적 어레이는 기하학적 확장 낭비 선형(δ(n)) 공간에 기반하지만, 여기서 n은 어레이 내의 요소 수이며 해시 배열 트리는 O(δn) 순서 저장 공간만 낭비합니다.알고리즘을 최적화하면 낭비되는 공간을 늘리는 비용으로 데이터 복사를 완전히 없앨 수 있습니다.

심플한 다이내믹 어레이보다 약간 느리지만 일정한 시간(O(1))에 액세스를 실행할 수 있습니다.이 알고리즘은 해시 어레이 트리의 끝에 일련의 개체를 추가할 때 O(1)의 상각된 성능을 가집니다.이름과는 달리 해시 함수를 사용하지 않습니다.

16개의 요소가 포함된 풀 해시 어레이 트리

정의들

Sitarski에서 정의한 바와 같이 해시 어레이 트리에는 2개의 리프 어레이의 파워를 포함하는 최상위 디렉토리가 있습니다.모든 리프 배열은 최상위 디렉토리와 동일한 크기입니다.이 구조는 해시된 어레이 트리의 기초가 되는 어레이 기반 충돌 체인이 있는 해시 테이블과 표면적으로 유사합니다.완전한 해시 배열 트리는 m개의 요소를 포함2 수 있습니다.여기서 m은 최상위 디렉토리의 [2]크기입니다.2의 거듭제곱을 사용하면 나머지[2] 산술 연산 대신 비트 연산을 통해 물리 어드레싱을 고속화할 수 있습니다.또한 확장 중에 글로벌 어레이 복사가 가끔 존재하는 경우 추가 연산의 O(1) 상각된 성능을 보장합니다.

확장 및 크기 축소

통상적인 동적 어레이 기하학적 확장 방식에서는 어레이는 현재 크기의 2배가 되는 새로운 사이즈의 메모리 전체 시퀀셜 청크로 재할당된다(그 후 데이터 전체가 새로운 위치로 이동한다).이것에 의해, 증설한 어레이가 새로운 용량의 절반까지 채워지기 때문에, O(1)의 상각된 운용을 O(n)의 낭비되는 스페이스로 실현할 수 있습니다.

해시된 어레이 트리가 가득 차면 추가 작업을 수용할 수 있도록 해당 디렉토리와 리셋을 이전 크기의 2배로 재구성해야 합니다.이전 구조에 저장된 데이터는 새 위치로 이동됩니다.그런 다음 새로운 리프 하나만 할당되고 상위 어레이에 추가됩니다. 따라서 새 용량의 4분의 1만 채워집니다.모든 추가 리프는 아직 할당되지 않았으며 필요할 때만 할당되므로 스토리지의 [3]O(µn)만 낭비됩니다.

크기를 줄이는 방법에는 여러 가지가 있습니다.해시된 어레이 트리가 8분의 1로 가득 차면 크기가 절반으로 작은 해시된 어레이 트리로 재구성할 수 있습니다.또 다른 옵션은 리프 크기를 조정하지 않고 미사용 리프 어레이만 해방하는 것입니다.한층 더 최적화에는, 필요에 따라서 디렉토리 어레이를 확장하면서, 크기를 조정하지 않고 새로운 리프를 추가하는 것이 포함됩니다.이렇게 하면 낭비되는 공간을 작은 상수로 O(n)로 만들고 설정된 임계값 오버헤드에 [2]도달했을 때만 재구성을 수행하는 비용을 들여 데이터를 완전히 복사할 필요가 없어집니다.

관련 데이터 구조

목록 데이터 구조 비교
훔쳐보다
(인덱스)
변환(삽입 또는 삭제) 여유 공간,
평균
시작 끝. 가운데
링크 리스트 θ(n) θ(1) δ(1), 알려진 엔드 요소
δ(n), 알 수 없는 엔드 요소
Peek 시간 +
θ(1)[4][5]
θ(n)
어레이 θ(1) 0
다이내믹 어레이 θ(1) θ(n) θ(1)상각 θ(n) θ([6]n)
밸런스 트리 δ(로그 n) δ(로그 n) δ(로그 n) δ(로그 n) θ(n)
랜덤 액세스리스트 δ([7]로그 n) θ(1) --[7] --[7] θ(n)
해시 어레이 트리 θ(1) θ(n) θ(1)상각 θ(n) θ(nn)


Brodnik [8]등은 해시 어레이 트리와 유사한 공간 낭비 프로파일을 가진 동적 어레이 알고리즘을 제시했다.Brodnik의 구현은 해시된 어레이 트리에 비해 더 복잡한 주소 계산 기능을 사용하여 이전에 할당된 리프 어레이를 유지합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Sitarski, Edward (September 1996), HATs: Hashed Array Trees
  2. ^ a b c d Sitarski, Edward (September 1996), "Algorithm Alley -- HATs: Hashed array trees", Dr. Dobb's Journal, 21 (11)
  3. ^ 에디터:알렉산더 S. 쿨리코프, 앤드류 V. 골드버그'실험 알고리즘' 2016년섹션 "3 공간 효율성" 페이지 173.
  4. ^ 1일차 기조연설 - Bjarne Stroustrup : GoingNative 2012에서 C++11 Style on GoingNative 45분 또는 44일
  5. ^ 수치 계산: kjellkod에서 다시는 코드에 링크 리스트를 사용하지 않는 이유.wordpress.com
  6. ^ Brodnik, Andrej; Carlsson, Svante; Sedgewick, Robert; Munro, JI; Demaine, ED (1999), Resizable Arrays in Optimal Time and Space (Technical Report CS-99-09) (PDF), Department of Computer Science, University of Waterloo
  7. ^ a b c Chris Okasaki (1995). "Purely Functional Random-Access Lists". Proceedings of the Seventh International Conference on Functional Programming Languages and Computer Architecture: 86–95. doi:10.1145/224164.224187.
  8. ^ Brodnik, Andrej; Carlsson, Svante; Sedgewick, Robert; Munro, JI; Demaine, ED (1999), "Resizable Arrays in Optimal Time and Space" (PDF), Technical Report CS-99-09, Department of Computer Science, University of Waterloo