건너 뛰기 목록은 어떻게 작동합니까?


14

숙제를하려면 건너 뛰기 목록 이 어떻게 작동 하는지 이해해야 합니다.

나는 2 년이 조금 넘는 시간 동안 프로그래밍을 해 왔으며 (실제로는 그렇게 길지 않다는 것을 알고 있습니다) 스킵 목록에 대해 들어 본 적이 없습니다.

나는 찾을 수있는 모든 안내서를 살펴 보았지만 여전히 그들이 어떻게 작동하는지 거의 이해하지 못했습니다. 코드 구현에서 예제 구현을 검색하여 하나의 검토 만 찾았습니다. 완전한 구현조차도 아닙니다. 코스에서 제공하는 샘플 구현을 살펴 보았으며 절대적으로 끔찍합니다. 적절한 방법이 없다는 것과 단일 문자 변수 이름 사이에 나는 그것이 어떻게 작동하는지 전혀 모른다.

건너 뛰기 목록은 어떻게 작동합니까? 고급 데이터 구조를 이해하려면 스킵 목록에 대한 지식이 필요합니까?



1
교육 관련 조언은 주제와 관련이 없습니다 . 이것은 교육이 아닌 데이터 구조에 관한 것이므로 이러한 부분을 제거하기 위해 귀하의 질문을 편집했습니다. 또한 내가 편집 한 Wikipedia 링크를 읽고 여전히 이해하지 못하는 내용에 대한보다 구체적인 내용으로 질문을 업데이트하는 것이 좋습니다.

@ 눈사람 감사합니다. "교사에게 물어보기"와 같은 주석을 막기 위해서만 추가했습니다. 다음에 염두에 두겠습니다. 질문을 변경하는 수정 사항을 추가했습니다. 결국, 나는 그것이 주제가 아닌 것으로 가정하기 때문에 사람들에게 그들이 어떻게 작동하는지 설명하도록 요구하지 않습니다. 나는 그들이 배우는 것이 얼마나 중요한지 알고 싶습니다.
Carcigenicate 2016 년

1
@Carcigenicate는 그들이 실제로 어떻게 작동하는지 묻는 것보다 실제로 주제에 대해 더 많이 설명하는 것 입니다. 우리는 당신이 무엇을할지 다양한 영역을 추측 할 수 있습니다. 우리가 실제 세계에서 그들을 볼 수 있는지 묻는 것은 "그래, 나는 그들을보고 사용한다"또는 "아무도 듣지 못했다"는 이유로 우리를 여론 조사하고있다.

답변:


29

옛날에는 데이터 구조 수업에서 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 알고리즘의 즐거움-걱정할 필요가 없습니다).

당신은 그것을 만날 것인가? 아마도 장소에서 사용중인 것을 볼 수있을 것입니다. 그런 다음 작성자가 왜 또는 구현 대신 해당 구현을 선택했는지 알 수 있습니다 .TreeMapHashMap

이것의 대부분은 내 블로그 게시물에서 빌 렸습니다 : 건너 뛰기 목록


감사합니다. 내가 이해하지 못하는 것은 일반적인 구현조차 아닙니다. 나는 그들의 BST와 유사합니다. 나는 그것을 구현하는 방법을 생각하려고 시도했으며 모든 포인터 / 참조를 관리한다는 생각이 끊임없이 혼란 스러웠다. 어쩌면 나는 너무 좌절하게 만들었을 것입니다. 감사. 나는 당신의 대답을 출발점으로 삼아 내일 데리러 올 것입니다.
Carcigenicate 2016 년

2
- 당신은 또한 원래의 종이 유용을 도입 찾을 수 있습니다 @Carcigenicate 균형 나무에 확률 적 대안 : 건너 뛰기 목록을 . 사람들의 머리 위로 갈 수있는 대부분의 학술 논문에 비해 다소 이해하기 쉬운 논문입니다. 표 2는 사용중인 이유를 보여줍니다. 삽입 또는 삭제의 시간 요소는 다른 솔루션의 복잡성을 추가 합니다.

2
연결리스트는 " 불균형이 매우 불균형 한 트리"입니다. 스킵리스트는리스트 위에 일종의 트리 구조를 부분적으로 추가하는 것입니다. 개인적으로 저는 지속적인 데이터 구조에 대한 열렬한 팬이며 나무는 특정 상황에서 추론하기가 더 쉬워 보입니다. Clojure, Scala 등이 우연의 일치라고 생각하지 않습니다. Bagwell 스타일의 해시가 기본 데이터 구조로 사용되는 것으로 보입니다. (Phil Bagwell은 Scala 2.8에 대한 Scala의 컬렉션 프레임 워크의 재 설계에도 참여했습니다.) 스킵 목록은 여전히 ​​훌륭합니다.
Jörg W Mittag 2016 년

그것은 내가 읽은 건너 뛰기 목록이 어떻게 작동하는지에 대한 가장 좋은 설명입니다.
gaborous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.