내가 보는 모든 곳에서 데이터 구조는 레드 블랙 트리 ( std::set
C ++, SortedDictionary
C # 등)를 사용하여 구현되고있는 것 같습니다 .
알고리즘 클래스에서 방금 (a, b), 빨강-검정 및 AVL 트리를 다루었으므로 여기에 나와 있습니다 (교수들에게 물어보고 몇 권의 책을보고 약간의 인터넷 검색을 통해).
- AVL 트리는 빨강 검정 트리보다 평균 깊이가 작으므로 AVL 트리에서 값을 검색하는 것이 일관되게 빠릅니다.
- 레드-블랙 트리는 AVL 트리보다 균형을 잡기 위해 구조적인 변화가 적으므로 삽입 / 삭제 속도가 더 빠릅니다. 나는 잠재적으로 말하고있다. 나무에 대한 구조적 변화 비용에 달려 있기 때문에 런타임과 구현에 많이 의존하기 때문에 (나무가 불변 할 때 기능적 언어에서 완전히 다를 수 있습니까?)
온라인으로 AVL과 Red-black 트리를 비교하는 벤치 마크가 많이 있지만, 제게 놀란 것은 교수님이 기본적으로 두 가지 중 하나를 수행한다는 것입니다.
- 성능에 대해서는 그다지 신경 쓰지 않아도됩니다.이 경우 대부분의 경우 AVL과 Red-black의 10-20 % 차이는 전혀 중요하지 않습니다.
- 또는 실제로 성능에 관심이 있습니다.이 경우 AVL과 Red-black 트리를 모두 버리고 B 트리와 함께 사용하면 훨씬 더 잘 작동하도록 조정할 수 있습니다 (또는 (a, b) 트리, 나는 ' 한 바구니에 모두 넣을 것입니다.)
그 이유는 B- 트리가 데이터를 메모리에보다 콤팩트하게 저장하기 때문에 (한 노드에는 많은 값이 포함됨) 캐시 누락이 훨씬 적기 때문입니다. 유스 케이스를 기반으로 구현을 조정하고 B- 트리의 순서를 CPU 캐시 크기 등에 의존하게 만들 수도 있습니다.
문제는 실제 현대 하드웨어에서 다양한 검색 트리 구현의 실제 사용량을 분석하는 거의 모든 소스를 찾을 수 없다는 것입니다. 알고리즘에 대한 많은 책을 살펴 보았고 다른 트리 변형을 비교할만한 것을 찾지 못했습니다. 다른 트리 변형을 비교할 수는 없습니다. 실제 프로그램에서)
즉, 위에서 언급 한 것을 바탕으로 B- 트리가 성능을 능가 해야하는 이유가 무엇이든 레드 블랙 트리가 모든 곳에서 사용되는 특별한 이유가 있습니까? (내가 찾을 수있는 유일한 벤치 마크로 http://lh3lh3.users.sourceforge.net/udb.shtml 도 표시 되지만 특정 구현의 문제 일 수 있습니다). 아니면 모든 사람이 레드 블랙 트리를 사용하는 이유는 구현하기가 어렵거나 구현하기가 어렵 기 때문에 다른 단어로 표현하기 때문입니까?
또한 기능 언어의 영역으로 이동할 때 어떻게 변경됩니까? Clojure와 Scala는 모두 해시 배열 매핑 된 시도를 사용하는 것으로 보입니다 . Clojure는 분기 계수 32를 사용합니다.