덜 알려졌지만 유용한 데이터 구조는 무엇입니까?


795

실제로는 유용하지만 대부분의 프로그래머에게는 알려지지 않은 데이터 구조가 있습니다. 그들은 어느 것입니까?

링크 된 목록, 이진 트리 및 해시에 대해서는 누구나 알고 있지만 목록 건너 뛰기블룸 필터 무엇입니까 ? 나는 일반적이지 않지만 더 많은 데이터 구조를 알고 싶습니다. 훌륭한 아이디어에 의존하고 프로그래머의 도구 상자를 풍부하게하기 때문에 알아야 할 가치가 있습니다.

추신 : 나는 또한 일반적인 데이터 구조의 속성을 영리하게 사용하는 춤 링크 와 같은 기술에 관심 이 있습니다.

편집 : 데이터 구조를 자세히 설명하는 페이지에 대한 링크포함 시키십시오. 또한 Jonas Kölker가 이미 지적한 것처럼 데이터 구조가 멋진 이유 에 대해 몇 마디를 추가하십시오 . 또한 답변 당 하나의 데이터 구조 를 제공하십시오 . 이를 통해 투표만으로 더 나은 데이터 구조를 맨 위에 표시 할 수 있습니다.


답변:


271

접두사 트리 또는 크리트 비트 트리 라고도하는 Tries 는 40 년 이상 존재했지만 여전히 상대적으로 알려지지 않았습니다. 시도를 매우 멋지게 사용하는 방법은 " TRASH-동적 LC-trie 및 해시 데이터 구조 "에 설명되어 있으며 trie와 해시 함수를 결합합니다.


12
매우 일반적으로 맞춤법 검사기에서 사용
스티븐 A. 로우

버스트 시도는 문자열의 접두사 만 노드로 사용하고 그렇지 않으면 노드에 문자열 목록을 저장하는 흥미로운 변형입니다.
Torsten Marek

Perl 5.10의 정규식 엔진은 자동으로 시도를 만듭니다.
Brad Gilbert

내 경험상 포인터가 일반적으로 문자보다 길다는 것을 감안할 때 시도는 고통 스럽습니다. 특정 데이터 세트에만 적합합니다.
Joe

18
에 관계없이 주제없이 SO 질문, 때문에, jQuery를 .... 존 레식, jQuery를의 창조자를 언급하는 사람없이 완료 그가 다른 사람의 사이에서 다양한 트라이 구현에 보이는 게시물의 흥미로운 데이터 구조 시리즈가 있습니다 ejohn.org/blog/ 수정 - 자바 스크립트 - 사전 검색
오스카 Austegard

231

블룸 필터 : m 비트 의 비트 배열로 , 처음에는 모두 0으로 설정됩니다.

당신은을 통해 그것을 실행 항목을 추가하려면 k 개의 해시 함수를 그건 당신이 줄 것이다 케이 하면 배열에 색인을 하고 1로 설정합니다.

항목이 세트에 있는지 확인 하려면 k 인덱스를 계산하고 모두 1로 설정되어 있는지 확인하십시오.

물론, 이것은 위양성 일 가능성이 있습니다 (wikipedia에 따르면 약 0.61 ^ (m / n)이며 여기서 n은 삽입 된 항목 수입니다). 부정 부정은 불가능합니다.

항목을 제거하는 것은 불가능하지만 int 배열과 증가 / 감소로 표시되는 counting bloom filter를 구현할 수 있습니다 .


20
당신은 사전과 함께 사용하는 것을 언급하는 것을 잊어 버렸습니다 :) 값이없는 해시 테이블과 같이 약 512k의 블룸 필터에 전체 사전을 넣을 수 있습니다.
Chris S

8
Google은 BigTable을 구현할 때 Bloom 필터를 사용합니다.
Brian Gianforcaro

16
@FreshCode 실제로 거짓 긍정을 얻을 수 있지만 거짓 부정을 얻을 수 없기 때문에 실제로 세트에 요소가 없는지 테스트 할 수 있습니다.
Tom Savage

26
@FreshCode @Tom Savage가 말했듯이 음수를 확인할 때 더 유용합니다. 예를 들어, 메모리 사용 측면에서 빠르고 작은 맞춤법 검사기로 사용할 수 있습니다. 여기에 모든 단어를 추가 한 다음 사용자가 입력 한 단어를 찾아보십시오. 부정적인 경우 철자가 잘못되었음을 의미합니다. 그런 다음 더 비싼 검사를 실행하여 가장 근접한 일치 항목을 찾고 수정 사항을 제공 할 수 있습니다.
lacop

5
@ abhin4v : 대부분의 요청이 "아니오"(예 : 여기)와 같은 응답을 반환 할 가능성이 높을 때 블룸 필터가 종종 사용됩니다. 즉, 적은 수의 "예"응답을 더 느린 정확한 테스트로 확인할 수 있습니다. 여전히 평균 쿼리 응답 시간 이 크게 줄어 듭니다 . Chrome의 세이프 브라우징이 그렇게하는지 알지 못하지만 그건 내 추측입니다.
j_random_hacker

140

로프 : 저렴한 접두사, 부분 문자열, 중간 삽입 및 추가를 허용하는 문자열입니다. 나는 실제로 한 번만 사용했지만 다른 구조로는 충분하지 않았습니다. 규칙적인 문자열과 배열 접두어는 우리가해야 할 일에 비해 너무 비쌌으며 모든 것을 뒤집는 것은 의문의 여지가 없었습니다.


나는 내 자신의 용도로 이와 같은 것을 생각했다. 이미 다른 곳에 구현되어 있다는 것을 알게되어 기쁩니다.
Kibbee 2012

15
SGI STL (1998)에는 다음과 같은 구현이 있습니다. sgi.com/tech/stl/Rope.html
quark

2
소위 무엇을 알지 못하고 최근에 Java에 대해 이와 비슷한 것을 썼습니다. code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/…
mikera

로프는 매우 드 rare니다 : stackoverflow.com/questions/1863440/…
Will

6
Mikera의 링크가 오래되었습니다. 여기에 현재가 있습니다.
aptwebapps

128

건너 뛰기 목록 은 매우 깔끔합니다.

위키 백과
건너 뛰기 목록은 이진 검색 트리 (대부분의 작업에서 평균 n 시간 평균 순서)와 비교할 수있는 여러 병렬, 정렬 된 연결 목록을 기반으로하는 확률 적 데이터 구조입니다.

그것들은 균형 잡힌 나무의 대안으로 사용될 수 있습니다 (엄격한 균형 시행 대신에 균형 잡힌 균형 사용). 그들은 구현하기 쉽고 빨강-검정 나무보다 빠릅니다. 나는 그들이 모든 훌륭한 프로그래머들에게 있어야한다고 생각합니다.

건너 뛰기 목록에 대한 심층적 인 소개를 원한다면 여기 에 MIT의 알고리즘 소개 강의 비디오 링크가 있습니다.

또한 여기 에 건너 뛰기 목록을 시각적으로 보여주는 Java 애플릿이 있습니다.


+1 Qt는 정렬 된 맵 및 세트에 RB- 트리 대신 스킵 목록을 사용합니다. 그렇습니다, 그들은 훌륭합니다 (어쨌든 명령형 언어로).
Michael Ekstrand

2
Redis는 건너 뛰기 목록을 사용하여 "정렬 세트"를 구현합니다.
antirez

건너 뛰기 목록은 좋은 데이터 구조가 필요할 때 가장 선호하는 데이터 구조 일 수 있으며 데이터 순서에 대한 보장이 없으며 다른 "균형"데이터 구조보다 간단한 구현을 원합니다. 그런 좋은 일입니다.
earino

재미있는 참고 사항 : 건너 뛰기 목록에 충분한 수준을 추가하면 기본적으로 B- 트리가 생깁니다.
Riyad Kalla

92

공간 인덱스 , 특히 R- 트리KD- 트리는 공간 데이터를 효율적으로 저장합니다. 지리적 인지도 좌표 데이터 및 VLSI 장소 및 경로 알고리즘에 적합하며 때로는 가장 가까운 이웃 검색에 적합합니다.

비트 어레이 는 개별 비트를 콤팩트하게 저장하고 빠른 비트 작동을 허용합니다.


6
공간 지수는 중력과 같은 장거리 힘과 관련된 N-body 시뮬레이션에도 유용합니다.
Justin Peel

87

지퍼 (Zipper) -현재 위치 인 '커서'라는 자연스러운 개념을 갖도록 구조를 수정하는 데이터 구조의 파생물입니다. xmonad 창 관리자 와 같이 인덱스가 범위를 벗어날 수 없음을 보장하므로 실제로 유용합니다. 에서 어떤 창에 포커스가 있는지 추적하는 데 사용됩니다.

놀랍게도 미적분 에서 원래 데이터 구조의 유형에 기술을 적용하여 이를 도출 할 수 있습니다 !


2
이것은 함수형 프로그래밍에서만 유용합니다 (필수적 언어에서는 포인터 또는 색인 만 유지). 또한 tbh는 여전히 Zippers가 실제로 어떻게 작동하는지 얻지 못했습니다.
Stefan Monov

4
@Stefan 요점은 지금 별도의 색인이나 포인터를 유지할 필요가 없다는 것입니다.
돈 스튜어트

69

몇 가지가 있습니다 :

  • 접미사가 시도합니다. 거의 모든 종류의 문자열 검색에 유용합니다 (http://en.wikipedia.org/wiki/Suffix_trie#Functionality ). 접미사 배열도 참조하십시오. 그것들은 접미사 나무만큼 빠르지는 않지만 훨씬 작습니다.

  • 플레이 트리 (위에서 언급 한 바와 같이). 그들이 멋진 이유는 세 가지입니다.

    • 그것들은 작습니다 : 이진 트리에서와 같이 왼쪽 및 오른쪽 포인터 만 필요합니다 (노드 색상 또는 크기 정보를 저장할 필요가 없습니다)
    • 그들은 (비교적으로) 구현하기가 매우 쉽습니다.
    • 모든 "측정 기준"에 대한 최적의 상각 복잡성을 제공합니다 (모두 알고있는 시간 인 log n 조회 시간). 보다http://en.wikipedia.org/wiki/Splay_tree#Performance_theorems
  • 힙 순서 검색 트리 : 키와 관련하여 검색 트리이고 우선 순위와 관련하여 힙 순서로 정렬되도록 여러 키 (prio) 쌍을 트리에 저장합니다. 그러한 나무가 독특한 모양을 가지고 있음을 보여줄 수 있습니다 (그리고 항상 왼쪽에서 완전히 채워지는 것은 아닙니다). 임의 우선 순위를 사용하면 예상 O (log n) 검색 시간 IIRC를 제공합니다.

  • 틈새 시장은 O (1) 인접 쿼리가있는 무 방향 평면 그래프의 인접 목록입니다. 이것은 기존 데이터 구조를 구성하는 특정 방법만큼 데이터 구조가 아닙니다. 방법은 다음과 같습니다. 모든 평면 그래프에는 최대 6 도의 노드가 있습니다. 이러한 노드를 선택하고 이웃을 이웃 목록에 넣고 그래프에서 제거하고 그래프가 비어있을 때까지 반복합니다. 쌍 (u, v)이 주어지면 v의 이웃 목록에서 u를 찾고 u의 이웃 목록에서 v를 찾으십시오. 둘 다 크기가 최대 6이므로 O (1)입니다.

위의 알고리즘에 따르면 u와 v가 이웃이면 v 목록에 u와 u 목록에 v가 모두 없습니다. 필요한 경우 각 노드의 누락 된 이웃을 해당 노드의 이웃 목록에 추가하고 빠른 검색을 위해 살펴보아야 할 이웃 목록의 양을 저장하십시오.


힙 정렬 검색 트리를 트랩이라고합니다. 이것으로 할 수있는 한 가지 트릭은 노드의 우선 순위를 변경하여 쉽게 삭제할 수있는 트리의 맨 아래로 푸시하는 것입니다.
paperhorse

1
"힙 정렬 검색 트리를 트랩이라고합니다." 내가 들었던 IIRC에서 treap은 임의의 우선 순위를 가진 힙 순서 검색 트리입니다 . 당신은 ... 응용 프로그램에 따라 다른 우선 순위를 선택할 수 있습니다
조나스 콜커에게

2
접미사 트리는 가장자리에 개별 문자가없고 문자열이 있으며 선형 시간으로 만들 수있는 훨씬 더 멋진 접미사 트리 와 거의 동일하지는 않습니다 . 또한 점진적으로 느리기는하지만 실제로 접미어 배열은 크기가 작고 포인터 간접 지정이 적기 때문에 많은 작업에서 접미사 트리보다 훨씬 빠릅니다. O (1) 평면 그래프 조회 BTW를 좋아하십시오!
j_random_hacker

@j_random_hacker : 접미사 배열은 점진적으로 느리지 않습니다. 다음은 선형 접미어 배열 구성을위한 ~ 50 줄의 코드입니다. cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
Edward KMETT

1
@Edward Kmett : 나는 실제로 그 논문을 읽었으며, 서 픽스 배열 구성 에서 상당히 획기적인 것이었다 . (접미사 트리를 통해 "선형"으로 이동하여 선형 시간 구성이 가능하다는 것은 이미 알려져 있지만, 이것은 명백히 실용적이지 않은 "직접"알고리즘입니다.) 테이블도 내장되어 있습니다. O (n)에서도 수행 할 수 있지만 그렇게하면 순수한 접미어 배열의 크기 및 지역적 이점을 잃게됩니다.
j_random_hacker

65

표준 데이터 구조에 대한 잠금없는 대안, 즉 잠금없는 대기열, 스택 및 목록이 훨씬 간과되고 있다고 생각합니다.
동시 읽기 / 쓰기를 처리하기 위해 Mutexes 또는 잠금을 사용하는 것보다 동시성이 우선 순위가 높아지고 더 훌륭한 목표가됨에 따라 점점 더 관련성이 높아지고 있습니다.

다음 링크는
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
http://www.research.ibm.com/people/m/michael/podc-1996.pdf 링크입니다 . [PDF 링크]
http://www.boyet.com/Articles/LockfreeStack.html

Mike Acton (종종 도발적인) 블로그에는 잠금없는 디자인 및 접근 방식에 대한 훌륭한 기사가 있습니다.


잠금없는 대안은 오늘날의 멀티 코어, 매우 평행 한 확장 성 중독 세계에서 매우 중요합니다. :-)
earino

글쎄, 대부분의 경우 혼란이 실제로 더 나은 일을합니다.
deadalnix

55

Disjoint Set 은 여러 항목을 별개의 세트와 쿼리 멤버쉽으로 나누어야하는 경우에 매우 유용 하다고 생각 합니다. Union 및 Find 작업을 올바르게 구현하면 상각 된 비용이 효과적으로 일정합니다 (데이터 구조 클래스를 올바르게 기억하면 Ackermnan의 기능과 반대).


8
이것을 "유니언 찾기 데이터 구조" 라고도합니다 . 알고리즘 클래스에서이 영리한 데이터 구조에 대해 처음 알게되었을 때 경외감을
느꼈습니다

공용체 찾기 삭제 확장 프로그램은 일정한 시간의 삭제도 허용합니다.
Peaker

4
나는 던전 발전기에 디스 조인트 세트를 사용하여 모든 방이 구절을 통해 도달 할 수 있도록했습니다.)
goldenratio

52

피보나치 힙

가장 짧은 경로 문제와 같은 많은 그래프 관련 문제에 대해 가장 빠른 알려진 알고리즘 (무증상)에 사용됩니다. Dijkstra의 알고리즘은 표준 이진 힙으로 O (E log V) 시간에 실행됩니다. 피보나치 힙을 사용하면 O (E + V log V)까지 향상되어 밀도 그래프의 속도가 크게 향상됩니다. 불행히도, 그들은 일정한 요소를 가지고 있기 때문에 종종 실용적이지 못합니다.


당신이 말한 것처럼 높은 상수 요인, 그리고 친구에게 따르면 잘 구현하기가 어렵습니다. 마지막으로 그렇게 시원하지는 않지만 여전히 알만한 가치가 있습니다.
p4bl0

이 사람들은 다른 힙 종류와 비교할 때 경쟁력을 갖추 었습니다 . cphstl.dk/Presentation/SEA2010/SEA-10.pdf 구현하기 쉽고 실제 성능이 매우 우수한 페어링 힙이라는 관련 데이터 구조가 있습니다. 그러나 이론적 분석은 부분적으로 열려 있습니다.
Manuel

Fibonacci 힙에 대한 경험을 통해 메모리 할당을 고가로 운영하면 어레이가 백엔드 한 단순한 이진 힙보다 효율성이 떨어집니다.
jutky

44

3D 렌더링 경험이있는 사람이라면 누구나 BSP 트리에 익숙해야합니다 . 일반적으로 3D 장면을 구성하여 카메라 좌표 및 방위를 아는 렌더링에 관리 할 수 ​​있도록하는 방법입니다.

이진 공간 분할 (BSP)은 공간을 하이퍼 플레인에 의해 볼록한 세트로 재귀 적으로 세분화하는 방법입니다. 이 세분화는 BSP 트리로 알려진 트리 데이터 구조를 통해 장면을 표현합니다.

즉, 복잡한 모양의 다각형을 볼록한 세트 또는 비 반사각 (180 °보다 작은 각도)으로 구성된 작은 다각형으로 분할하는 방법입니다. 공간 분할에 대한보다 일반적인 설명은 공간 분할을 참조하십시오.

원래이 접근 방식은 렌더링 효율성을 높이기 위해 3D 컴퓨터 그래픽에서 제안되었습니다. 일부 다른 응용 분야에는 CAD의 모양 (구조적 입체 구조), 로봇 및 3D 컴퓨터 게임에서의 충돌 감지, 복잡한 공간 장면 처리와 관련된 기타 컴퓨터 응용 프로그램의 기하학적 작업 수행이 포함됩니다.


... 및 관련 octree 및 kd-trees.
Lloeki


38

특히 앞서 언급 한 순전히 기능적인 데이터 구조 를 좋아한다면 Finger Trees를 살펴보십시오 . 그것들은 상각 된 일정한 시간에 끝 부분에 대한 액세스를 지원하고 작은 조각의 크기에서 시간 로그로 연결하고 분할하는 지속적인 시퀀스의 기능적 표현입니다.

당으로 원래 기사 :

우리의 기능적인 2-3 개의 핑거 트리는 오카 사키 (1998)에 의해 도입 된 암시 적 재귀 감속 이라고하는 일반적인 설계 기법의 예입니다 . 우리는이 트리들이 그의 암묵적 deque 구조의 확장이며, 효율적인 연결과 분할에 필요한 유연성을 제공하기 위해 쌍을 2-3 개의 노드로 대체합니다.

핑거 트리는 monoid 로 매개 변수를 지정할 수 있으며 , 다른 monoid를 사용하면 트리의 동작이 달라집니다. 이를 통해 Finger Trees는 다른 데이터 구조를 시뮬레이션 할 수 있습니다.



이 중복 답변을 살펴보십시오. 읽어 볼 가치가 있습니다!
Francois G

34

원형 또는 링 버퍼 -무엇보다도 스트리밍에 사용됩니다.


4
또한 역겨운 방법으로 (적어도 비디오에 사용될 때) 특허를 받았다. ip.com/patent/USRE36801
David Eison

링크를 읽은 결과, 데이터 구조 자체가 특허가 있다고 생각하지는 않지만 그에 기반한 일부 발명품입니다. 나는 이것이 매우 사용률이 낮은 데이터 구조라는 데 동의합니다.
중력

33

아무도 Merkle 나무 (즉, Hash Trees )를 언급하지 않은 것에 놀랐습니다 .

파일의 일부만 사용 가능한 경우 전체 파일의 해시를 확인하려는 많은 경우 (P2P 프로그램, 디지털 서명)에 사용됩니다.


32

<zvrba> 반 엠드-보아스 나무

멋진 아는 것이 도움이 될 것 같아요 . 일반적으로 "왜"라는 질문이 가장 중요합니다.)

내 대답은 사용중인 키 수에 관계없이 {1..n} 키로 O (log log n) 사전을 제공한다는 것입니다. 반절을 반복하면 O (log n)가 생기고, sqrting을 반복하면 vEB 트리에서 발생하는 O (log log n)가 나타납니다.


그들은 이론적 인 관점에서 훌륭합니다. 그러나 실제로는 경쟁력있는 성능을 얻는 것이 매우 어렵습니다. 내가 아는 종이는 최대 32 비트 키 ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.7403 ) 까지 잘 작동 하지만 34-35 비트 이상으로 확장되지 않습니다. 그래서 그 구현은 없습니다.
Manuel

이들이 멋진 이유 중 하나는 여러 가지 캐시를 모르는 알고리즘의 핵심 구성 요소이기 때문입니다.
Edward KMETT


29

해시 테이블의 흥미로운 변형은 Cuckoo Hashing 입니다. 해시 충돌을 처리하기 위해 1이 아닌 여러 해시 함수를 사용합니다. 충돌은 기본 해시로 지정된 위치에서 이전 객체를 제거하고 대체 해시 함수로 지정된 위치로 이동하여 해결됩니다. Cuckoo Hashing을 사용하면 3 개의 해시 함수만으로로드 팩터를 최대 91 %까지 늘릴 수 있으며 액세스 시간이 길어지기 때문에 메모리 공간을보다 효율적으로 사용할 수 있습니다.


5
hopscotch 해싱이 더 빠르다는 것을 확인하십시오.
chmike

27

최소 - 최대 힙 (A)의 변형 구현하는 양두 우선 순위 큐. 힙 특성을 간단히 변경하여이를 달성합니다. 짝수 (홀수) 레벨의 모든 요소가 모든 어린이 및 손자보다 작을 경우 트리는 최소-최대 정렬이라고합니다. 레벨은 1부터 시작하여 번호가 매겨집니다.

http://internet512.chonbuk.ac.kr/datastructure/heap/img/heap8.jpg


구현하기 까다로운. 최고의 프로그래머 조차도 틀릴 수 있습니다.
finnw

26

캐시 명백한 데이터 구조를 좋아 합니다. 기본 아이디어는 트리를 재귀 적으로 작은 블록으로 배치하여 다양한 크기의 캐시가 편리한 블록을 활용할 수 있도록하는 것입니다. 이로 인해 RAM의 L1 캐시에서 디스크의 큰 데이터 덩어리에 이르기까지 캐싱 계층의 크기에 대한 구체적인 내용을 알 필요없이 캐싱을 효율적으로 사용할 수 있습니다.


그 링크에서 흥미로운 기록 : "핵심은 1977 년 Peter van Emde Boas에 의해 고안된 van Emde Boas 트리 데이터 구조의 이름을 딴 van Emde Boas 레이아웃"
sergiol

23

왼쪽 기대어 검은 색 나무 . 2008 년에 출판 된 Robert Sedgewick의 레드-블랙 트리 구현이 대폭 간소화되었습니다 (~ 구현할 코드의 절반). Red-Black 트리의 구현에 대해 머리를 감싸는 데 어려움이 있다면이 변형에 대해 읽으십시오.

Andersson Trees와 매우 유사합니다 (동일하지 않은 경우).



19

부트 스트랩 스큐 이항 힙Gerth Stølting Brodal과 Chris Okasaki의 :

긴 이름에도 불구하고 기능 설정에서도 무조건 최적의 힙 작업을 제공합니다.

  • O(1)크기, 유니온 , 인서트, 최소
  • O(log n) deleteMin

좌파 힙 과 같이 데이터 구조 교과서에서 일반적으로 다루는 잘 알려진 힙과는 달리 유니온은 시간 O(1)보다 O(log n)시간 이 걸립니다 . 그리고 피보나치 힙 과 달리 , 이러한 무증상은 지속적으로 사용하더라도 상각되지 않고 최악의 경우입니다!

Haskell 에는 여러 가지 구현 이 있습니다 .

그들은 Brodal과 오카 사키에 의해 공동으로 파생되었습니다. Brodal 이 동일한 무증상으로 명령적인 힙 을 얻은 후에 .


18
  • 실시간 레이트 레이싱에서 사용되는 공간 데이터 구조 인 Kd-Trees 는 서로 다른 공간과 교차하는 삼각형이 잘 려야한다는 단점이 있습니다. 일반적으로 BVH는 더 가볍기 때문에 더 빠릅니다.
  • MX-CIF Quadtrees 는 일반 쿼드 트리를 쿼드 가장자리의 이진 트리와 결합하여 임의의 포인트 세트 대신 경계 상자를 저장합니다.
  • HAMT , 관련된 상수로 인해 액세스 시간이 일반적으로 O (1) 해시 맵을 초과하는 계층 적 해시 맵.
  • Inverted Index 는 검색 엔진 분야에서 잘 알려져 있습니다. 다른 검색어와 관련된 문서를 빠르게 검색하는 데 사용되기 때문입니다.

이들 중 대부분은 NIST 알고리즘 및 데이터 구조 사전에 문서화되어 있습니다.



17

실제로 데이터 구조는 아닙니다. 동적으로 할당 된 배열을 최적화하는 더 많은 방법이 있지만 Emacs에 사용되는 갭 버퍼 는 멋지다.


1
나는 그것이 데이터 구조라고 분명히 생각할 것입니다.
Christopher Barber

관심있는 사람이라면, 이것이 Swing 텍스트 컴포넌트를 뒷받침하는 문서 (예 : PlainDocument) 모델도 정확하게 구현되는 방식입니다. 1.2 이전에는 문서 모델이 직선 배열이라고 생각하여 큰 문서의 경우 삽입 성능이 끔찍합니다. 그들이 갭 버퍼로 옮기 자마자 모든 것이 세상과 다시 맞았습니다.
Riyad Kalla

16

펜윅 트리. 주어진 두 개의 하위 인덱스 i와 j 사이에서 벡터의 모든 요소의 합계를 유지하는 데이터 구조입니다. 처음부터 합계를 미리 계산하는 사소한 솔루션은 항목을 업데이트 할 수 없습니다 (유지하려면 O (n) 작업을 수행해야 함).

Fenwick Trees를 사용하면 O (log n)로 업데이트하고 쿼리 할 수 ​​있으며 작동 방식은 정말 시원하고 간단합니다. Fenwick의 원본 논문에 잘 설명되어 있으며 여기에서 무료로 제공됩니다.

http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue3/spe884.pdf

RQM 트리의 아버지이기도합니다. 벡터의 두 인덱스 사이의 최소 요소에 대한 정보를 유지할 수 있으며 O (log n) 업데이트 및 쿼리에서도 작동합니다. 저는 먼저 RQM과 Fenwick Tree를 가르치고 싶습니다.


이것이 복제 본인 것 같습니다 . 아마도 이전 답변에 추가하고 싶습니까?
Francois G

또한 모든 종류의 범위 쿼리를 수행하는 데 유용한 세그먼트 트리가 관련됩니다.
dhruvbird


13

중첩 집합 은 관계형 데이터베이스에서 트리를 나타내고 쿼리를 실행하기에 좋습니다. 예를 들어, ActiveRecord (Ruby on Rails의 기본 ORM)에는 매우 간단한 중첩 세트 플러그인 이 포함되어있어 나무 작업이 간단합니다.


12

도메인에 따라 다르지만 하프 에지 데이터 구조 는 매우 깔끔합니다. 컴퓨터 그래픽과 계산 기하학에 매우 유용한 다각형 메쉬 (면 가장자리) 를 반복하는 방법을 제공합니다.

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