학교에서는 삽입 또는 삭제시 AVL 트리의 균형을 맞추는 방법을 배웁니다.
이러한 유형의 지식은 실제로 실제로 어떻게 유용합니까? 누군가 이런 유형의 지식이 실제로 유용한시기에 대한 예를 들어 줄 수 있습니까?
내가 본 것에서, 직장에서 그런 세부 사항은 거의 나오지 않습니다 ...
알고리즘과 일부 데이터 구조에 대한 자세한 지식이 얼마나 중요한지 알 수 있지만 AVL 트리 회전 (및 유사한 세부 개념)과 같은 세부 사항은 아닙니다.
감사!
학교에서는 삽입 또는 삭제시 AVL 트리의 균형을 맞추는 방법을 배웁니다.
이러한 유형의 지식은 실제로 실제로 어떻게 유용합니까? 누군가 이런 유형의 지식이 실제로 유용한시기에 대한 예를 들어 줄 수 있습니까?
내가 본 것에서, 직장에서 그런 세부 사항은 거의 나오지 않습니다 ...
알고리즘과 일부 데이터 구조에 대한 자세한 지식이 얼마나 중요한지 알 수 있지만 AVL 트리 회전 (및 유사한 세부 개념)과 같은 세부 사항은 아닙니다.
감사!
답변:
AVL 트리에 대한 연구는 다음과 같은 이유로 도움이 될 수 있습니다.
추상 데이터에 대한 추론에 대한 좋은 연습입니다. 하나의 특정 트리에 대해 생각할 필요가 없으며 모든 가능성을 고려해야합니다. 이런 종류의 추론으로 연습하면 더 간단한 경우에도 도움이 될 수 있습니다.
술어와 계약을 이해하는 것이 좋습니다. 트리의 균형을 유지하고 각 작업의 균형을 유지하기 위해 사용하는 도구를 예를 들어 보안 문제 및 병렬 코드에 적용 할 수 있습니다.
고유 한 변형을 작성하거나 완전히 새로운 유형의 데이터 구조를 만들 수도 있습니다.
새 라이브러리 또는 플랫폼에 대해 AVL 트리를 구현해야 할 수도 있습니다.
각 종류의 정렬 알고리즘 또는 각 종류의 균형 트리를 배우는 특별한 장점에 대해 토론 할 수 있습니다. 실제로 어떤 것을 배우는 지는 중요하지 않지만 가장 중요한 주제를 완전히 다루어야합니다.
알고있는 알고리즘이 실제 세계에서 얼마나 중요한지 알고 싶다면 Friendster의 몰락에 관한 Inc의 기사 인 "좋은 아이디어를 죽이는 방법! " 을 읽고 효율성을 개선하기 위해 기본 원칙을 조금만 적용 하면 알고리즘이 어떻게 도움이 되었습니까?
Macneils 포인트 외에도 ...
C ++ std::map(적어도 AFAIK) 와 같은 표준 라이브러리 구현에서 널리 지원되지 않는 유용한 효율적인 작업이 있기 때문에 레드-블랙 트리가 더 유용 할 수 있습니다 . 레드-블랙 트리는 "분할"(나무를 둘로 자르고, 하나는 지정된 키보다 작은 키를 포함하고 다른 하나는 키를 포함)을 지원하고 "조인"(큰 키의 나무를 작은 나무와 결합)을 지원할 수 있습니다. 키)는 O (log n) 시간에 수행 할 수 있지만 표준 컨테이너 라이브러리에서 지원되는 경우 잘 숨겨져있는 것으로 보입니다.
그러나 "확장"데이터 구조가 일반적입니다. 간단한 예는 O (log n) 첨자를 지원하기 위해 거의 모든 트리 데이터 구조의 노드에 서브 트리 크기 정보를 추가하는 것입니다. 보다 복잡한 예에는 간격 트리가 포함됩니다.
데이터 구조를 확장한다는 아이디어를 얻으면 특정 응용 프로그램에 유용 할 수있는 많은 변형이 있으며 라이브러리로 사전 패키지로 제공되는 것은 거의 없습니다. 기존 표준 라이브러리 데이터 구조 (예 : 등 std::map)는 소스 코드를 복사하고 직접 수정하는 것만으로는 기능을 보강 할 수 없습니다. 템플릿 매개 변수를 사용하여 기능을 보강 할 수는 없습니다.
물론 기능 보강 된 데이터 구조를 개발하려면 기본 기능 보강되지 않은 데이터 구조를 이해해야합니다.
삽입 / 삭제보다 검색을 더 많이 수행하고 분할 / 결합 작업이 필요하지 않은 경우 AVL 트리는 빨강-검정 트리보다 빠를 수 있습니다. 증강.