Skip List를 어디에 쓸 수 있을까
Skip List 일반 Linked List 는 정렬이 되어있더라도 그 이점을 살리지 못하고 , 원하는 노드를 찾기 위해 헤드부터 끝까지 쭉 돌아야 한다 . == O(n). Skip List 는 일반 Linked List 에 level 의 개념을 추가해서 마치 binary search tree 처럼 탐색 속도를 줄이는 자료구조라고 할 수 있다 우선 생긴 것은 아래와 같다 . 출처 : https://en.wikipedia.org/wiki/Skip_list#/media/File:Skip_list.svg 각 노드마다 위쪽으로 길게 포인터가 붙어있는데 , 이것을 레벨이라고 한다 . ( 위에서부터 0 이라 하는지 , 밑에서부터 0 이라 하는지 등의 구체적인 것은 구현에 따라 달라질 수 있음 ) 먼저 find 를 생각해보자 . 위의 Skip List 에서 7 를 찾고 싶다고 생각하면 , 기존의 Linked List 에선 7 개의 노드를 봐야한다 . (1) 1 보고 , 아니네 ? 다음 (2) 2 보고 , 아니네 ? 다음 (3) 3 보고 , 아니네 ? 다음 … (7) 6 보고 , 아니네 ? 다음 (8) 7 보고 , 맞네 ? 찾았다 ! 물론 원하는 게 바로 안 나오면 n 개까지 찾다가 없다고 알아낼 수 있다 . 7 을 7 번만에 찾았다는 건 운이 좋은 경우이고 , 정렬이 되어있더라도 이 사실은 크게 변하지 않는다 ( 일반적인 Linked List 라고 하면 ). 반면 Skip List 에서 8 를 찾고 싶다면 1 -> 4 -> 6 -> 7 을 거쳐 찾을 수 있다 . (1) 1 보고 , 나보다 작네 ? 가장 높은 레벨 (4) 이 가리키는 애를 보자 (2) Null 을 가리키고 있네 .. 그러면 다음 낮은 레벨 (3) 을 보자 . (3) 4 를 기리키고 있네 ? 내가 찾고자하는 8 보다 작으니 이동하자 (4) 4 에서 같은 레