AVL 나무와 실제 세계


14

학교에서는 삽입 또는 삭제시 AVL 트리의 균형을 맞추는 방법을 배웁니다.

이러한 유형의 지식은 실제로 실제로 어떻게 유용합니까? 누군가 이런 유형의 지식이 실제로 유용한시기에 대한 예를 들어 줄 수 있습니까?

내가 본 것에서, 직장에서 그런 세부 사항은 거의 나오지 않습니다 ...

알고리즘과 일부 데이터 구조에 대한 자세한 지식이 얼마나 중요한지 알 수 있지만 AVL 트리 회전 (및 유사한 세부 개념)과 같은 세부 사항은 아닙니다.

감사!


7
실제 세계에 해당되는 경우 인터뷰에 도움이됩니다.
Kevin

이것은 일부 사람들이 학교에서 "삼각법을 배우는 것에 대해 말하는 것과 같은 주장입니다. 현실에서 언제 그것을 사용하게 될까요?"라는 대답은 "전체 클래스의 문제를 분석하고 해결하는 방법을 생각했습니다"입니다. . 그리고 언젠가 당신은 나무를 자르고 싶어하고 파트너는 "집에 부딪치지 않을 것입니까?"라고 묻습니다. 구조에 손을 대십시오!
이진 걱정

답변:


13

AVL 트리에 대한 연구는 다음과 같은 이유로 도움이 될 수 있습니다.

  • 추상 데이터에 대한 추론에 대한 좋은 연습입니다. 하나의 특정 트리에 대해 생각할 필요가 없으며 모든 가능성을 고려해야합니다. 이런 종류의 추론으로 연습하면 더 간단한 경우에도 도움이 될 수 있습니다.

  • 술어와 계약을 이해하는 것이 좋습니다. 트리의 균형을 유지하고 각 작업의 균형을 유지하기 위해 사용하는 도구를 예를 들어 보안 문제 및 병렬 코드에 적용 할 수 있습니다.

  • 고유 한 변형을 작성하거나 완전히 새로운 유형의 데이터 구조를 만들 수도 있습니다.

  • 새 라이브러리 또는 플랫폼에 대해 AVL 트리를 구현해야 할 수도 있습니다.

각 종류의 정렬 알고리즘 또는 각 종류의 균형 트리를 배우는 특별한 장점에 대해 토론 할 수 있습니다. 실제로 어떤 것을 배우는 지는 중요하지 않지만 가장 중요한 주제를 완전히 다루어야합니다.

알고있는 알고리즘이 실제 세계에서 얼마나 중요한지 알고 싶다면 Friendster의 몰락에 관한 Inc의 기사 인 "좋은 아이디어를 죽이는 방법! " 읽고 효율성을 개선하기 위해 기본 원칙을 조금만 적용 하면 알고리즘이 어떻게 도움이 되었습니까?


흥미로운 기사이지만 AVL 트리가 어떻게 친구를 사귀 었는지 알 수 없습니다.
에라토스테네스

B + -Trees가 데이터베이스 인덱싱에 사용되는 것과 같은 예를보고 싶었습니다.
Luca Fülbier

5

Macneils 포인트 외에도 ...

C ++ std::map(적어도 AFAIK) 와 같은 표준 라이브러리 구현에서 널리 지원되지 않는 유용한 효율적인 작업이 있기 때문에 레드-블랙 트리가 더 유용 할 수 있습니다 . 레드-블랙 트리는 "분할"(나무를 둘로 자르고, 하나는 지정된 키보다 작은 키를 포함하고 다른 하나는 키를 포함)을 지원하고 "조인"(큰 키의 나무를 작은 나무와 결합)을 지원할 수 있습니다. 키)는 O (log n) 시간에 수행 할 수 있지만 표준 컨테이너 라이브러리에서 지원되는 경우 잘 숨겨져있는 것으로 보입니다.

그러나 "확장"데이터 구조가 일반적입니다. 간단한 예는 O (log n) 첨자를 지원하기 위해 거의 모든 트리 데이터 구조의 노드에 서브 트리 크기 정보를 추가하는 것입니다. 보다 복잡한 예에는 간격 트리가 포함됩니다.

데이터 구조를 확장한다는 아이디어를 얻으면 특정 응용 프로그램에 유용 할 수있는 많은 변형이 있으며 라이브러리로 사전 패키지로 제공되는 것은 거의 없습니다. 기존 표준 라이브러리 데이터 구조 (예 : 등 std::map)는 소스 코드를 복사하고 직접 수정하는 것만으로는 기능을 보강 할 수 없습니다. 템플릿 매개 변수를 사용하여 기능을 보강 할 수는 없습니다.

물론 기능 보강 된 데이터 구조를 개발하려면 기본 기능 보강되지 않은 데이터 구조를 이해해야합니다.

삽입 / 삭제보다 검색을 더 많이 수행하고 분할 / 결합 작업이 필요하지 않은 경우 AVL 트리는 빨강-검정 트리보다 빠를 수 있습니다. 증강.


1
데이터 구조를 보강하는 데 +1이지만, 매우 드물게 수행됩니다. 대부분의 프로그래머는 성능을 위해 노력할 필요가 없습니다 (그렇지 않으면 C ++ / C / Fortran / Assembly를 사용하게됩니다).
Matthieu M.

@ Matthieu-나는 그것이 일반적이지만 특정 종류의 개발 환경에서만 믿습니다. 솔직히 말해서… 모순이 아닙니다.
Steve314

난 전적으로 동의합니다! : D
Matthieu M.

5

아니

실제로는 유용하지 않습니다 ...

당신이 생각하게 하는 것을 제외하고 .

현실 세계에는 훨씬 더 어려운 문제가 있으며, 그 중 많은 문제 에는 이미 잘 알려진 해결책이 없습니다.

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