옛날에는 데이터 구조 수업에서 AVL 트리의 작동 방식을 배웠습니다 . 나는 수업 중 하나에서 그것을 가지고 있었지만 강사는 "실제로 이것을 사용하지 않을 것"이라고 말하고 대신 2-3 나무와 b * 나무를 배우게했습니다. 그 당시에는 기억이 빡빡하고 프로세스가 단독으로 스레드 된 시절이있었습니다. 단독으로 연결된 목록이 작동 할 때 deque를 사용하지 않았습니다.
건너 뛰기 목록은 오늘날 사용 가능한 메모리와 동시성이 문제가되어 훨씬 더 일반적입니다 (스킵 목록에서 기록기 역할을 할 때 AVL 트리가있는 모든 항목에 비해 크게 잠글 필요는 없습니다).
솔직히 말해서, 그것은 그것이 내가 어떻게 작동하는지와 그것이 유리하거나 불리한 곳에서 쉽게 추론 할 수있는 점에서 지금 가장 좋아하는 데이터 구조입니다.
인터뷰 질문으로받지 않는 한 AVL 트리를 구현할 가능성이있는 경우를 제외하고 처음부터 새로 작성할 필요는 없습니다.
당신은 하는 당신이 선택하려는 이유를 이해하기 위해 필요에가는 ConcurrentSkipListMap
오히려보다 자바를 HashMap
하거나 TreeMap
또는 다른 맵 구현의.
작동 방식을 이해하려면 이진 트리의 작동 방식을 이해해야합니다. 잠깐만 요, 수정하겠습니다. 균형 잡힌 이진 트리의 작동 방식을 이해해야합니다 . 이진 트리의 균형을 맞추지 않으면 조회를 통해 실질적인 이점을 얻지 못합니다.
이 트리가 있다고 가정 해 봅시다.
그리고 우리는 '8'을 삽입합니다. 이제 우리는 :
그리고 그것은 균형이 맞지 않습니다. 그래서 우리는 구현을 통해 균형을 잡는 마술을 수행합니다 ...
그리고 당신은 균형 잡힌 나무를 다시 얻었습니다. 그러나 그것은 내가 손을 흔들면서 많은 마술이었다.
건너 뛰기 목록을 가져옵니다.
이것은 이상적인 것입니다. 거의 없지만, 스킵리스트가 이상적인 근사치 인 이진 트리 특성을 보여줍니다.
이제 여기에 6을 삽입하고 싶습니다. 이것은 링크 된 목록과 매우 유사하게 삽입됩니다. 그러나 우리는 맨 위에서 시작하여 내려갑니다. 상단은 5를 가리 킵니다. 6> 5입니까? 예. 좋아, 상단은 이제 끝을 가리 키므로 스택을 내려갑니다 (우리는 5에 있습니다). 다음은 7입니다. 6> 7입니까? 아니. 우리는 레벨을 내려 가고 기본 레벨에 있으므로 5의 오른쪽에 6을 삽입합니다.
우리는 동전을 뒤집습니다-우리가 만드는 머리, 우리가 남는 꼬리. 꼬리. 더 이상 할 일이 없습니다.
이제 8을 삽입하겠습니다. 8> 5? 네. 8> 7? 네. 이제 화살표와 스택을 따라 가서 다시 맨 아래 레벨에 있으며 8> 11을 테스트합니까? 아니. 따라서 우리는 7의 오른쪽에 8을 삽입합니다.
우리는 동전을 뒤집습니다-우리가 만드는 머리, 우리가 남는 꼬리. 꼬리. 더 이상 할 일이 없습니다.
균형 잡힌 나무에서, 우리는 균형 잡히지 않은 나무에 관한 모든 일을 끝내고 있습니다. 그러나 이것은 나무가 아닙니다-건너 뛰기 목록. 우리 는 균형 잡힌 나무와 비슷 합니다.
이제 10을 삽입하자. 나는 모든 비교를 피할 것이다.
우리는 동전을 뒤집습니다-우리가 만드는 머리, 우리가 남는 꼬리. 머리! 그리고 다시 뒤집어, 다시 머리! 다시 뒤집어주세요. 꼬리가 있습니다. 기본 연결 목록 위의 두 레벨.
여기서 장점은 12를 삽입하면 다른 모든 비교를 수행하지 않고 5에서 10으로 건너 뛸 수 있다는 것입니다. 건너 뛰기 목록으로 건너 뛸 수 있습니다. 그리고 우리는 균형 잡힌 나무에 대해 걱정할 필요가 없습니다. 쌓기의 확률 적 특성은 우리를 위해 그렇게합니다.
이것이 왜 그렇게 유용한가요? 10을 삽입 할 때 전체 구조가 아닌 5 및 7 및 8 포인터의 쓰기를 잠그면 가능합니다. 그리고 그렇게하는 동안 독자는 일관성이없는 상태를 유지하지 않고 건너 뛰기 목록을 계속 진행할 수 있습니다. 동시 사용을 위해 더 빨리 잠글 필요가 없습니다. 맨 아래 레이어를 반복하기 위해 트리보다 빠릅니다 (트리 탐색을위한 BFS 및 DFS 알고리즘의 즐거움-걱정할 필요가 없습니다).
당신은 그것을 만날 것인가? 아마도 장소에서 사용중인 것을 볼 수있을 것입니다. 그런 다음 작성자가 왜 또는 구현 대신 해당 구현을 선택했는지 알 수 있습니다 .TreeMap
HashMap
이것의 대부분은 내 블로그 게시물에서 빌 렸습니다 : 건너 뛰기 목록