연결 리스트는 배열과 같이 크기가 정해져 있는 자료구조와 달리 메모리를 동적으로 사용할 수 있다는 장점이 있다. 반면, 다음 노드를 가리키는 포인터를 저장할 메모리를 사용해야 하기 때문에, 정적인 메모리 사용에 비해 메모리가 추가적으로 필요하다. 이와 같이 장점, 단점을 중심으로 연결 리스트를 비교 분석하려 한다.
1. 배열 vs 연결 리스트
아래와 같이 배열은 처음에 할당받은 메모리만큼 사용 할 수 있다. 실제 메모리 주소는 예로 든 그림과 다르지만 이해를 돕기 위해서 그려보았다. 아래와 같이 0x1000 부터 0x1006 까지 할당을 받게 되면, 7개의 영역을 사용할 수 있게 되며, 7개의 영역을 모두 사용하게 되면, 더 이상 메모리를 사용할 수 없게 된다.
하지만 아래와 같이 메모리를 필요할 때 마다 할당을 받으면, 컴퓨터의 전체 메모리가 허락하는 한 계속해서 자료를 저장할 수 있게 된다. 사용하는 방법은, 0x1000 에 자료 "1" 을 저장하고, 0x1001 에 다음 자료가 저장되는 메모리 주소인 0x1002 를 저장한다. 이와 같은 방식으로 반복해서 메모리를 할당받아 자료를 저장한다.
위와 같이 연결 리스트는 동적으로 메모리를 사용할 수 있다는 장점이 있지만, 자료를 저장하는 공간 이외에 다음 자료가 저장되는 메모리 주소를 저장함으로써 메모리를 추가적으로 사용한다는 단점이 있다.
2. 단순 연결 리스트 vs 이중 연결 리스트
단순 연결 리스트와 이중 연결 리스트는 메모리 주소를 하나 가지고 있느냐, 두개 가지고 있느냐의 차이가 있다. 이로 인해서 나타나는 차이는 노드를 리스트에서 삭제할 때 나타난다.
위와 같이 단순 연결 리스트에서는 pstSLL_Temp_1 이 가리키는 노드를 삭제하기 위해서는, 리스트의 첫번째 노드에서 부터 탐색하여 pstSLL_Temp_1 의 앞 노드, 그림에서의 pstDLL_Temp_2 를 찾아야한다. 이는 그림에서의 하늘색 포인터를 다시 연결해주어야 하기 때문이다. 이 탐색은 최대 O(n-1) 의 시간을 소비하게 된다.(리스트의 마지막 노드를 삭제할 경우)
반면, 아래 그림과 같이 이중 연결 리스트는 pstSLL_Temp_1 이 가리키는 노드를 삭제하기 위해 찾아야 하는 pstSLL_Temp_2 를 단 한번만에 찾을 수 있다. 이는 각각의 노드가 리스트에서 자신의 앞 노드를 가리키는 포인터를 가지고 있기 때문이다.
위와 같이 이중 연결 리스트는 단순 연결 리스트에 비해 리스트에서 노드를 삭제할 때 효율적이라는 장점이 있지만, 하나의 포인터 메모리 공간이 더 사용하기 때문에, 메모리를 추가적으로 사용한다는 단점이 있다.
3. 이중 연결 리스트 vs 원형 연결 리스트
이중 연결 리스트와 원형 연결 리스트는 메모리의 사용에서 약간의 차이가 있을 뿐, 기본적인 구조는 차이가 없다. 하지만, 사용의 차이로 인해 리스트에 노드를 추가할 때에 효율이 차이가 나게 된다.
위와 같이 이중 연결 리스트에서 리스트에 노드를 추가하기 위해서는 리스트의 마지막 노드를 찾아야하고, 이 탐색은 O(n) 의 시간을 소비하게 된다
반면, 원형 연결 리스트는 아래 그림과 같이, 리스트의 첫번째 노드의 앞 노드를 가리키는 포인터가 이미 리스트의 마지막 노드를 가리키고 있으므로, 이를 찾는 연산이 필요없다.
위와 같이 원형 연결 리스트는 구현하는 데에 있어서 조금 어려워진다는 단점 이외에는 리스트에 노드를 추가할 때에 효율적이다.
'Programming > Data Structure' 카테고리의 다른 글
[C] 스택 (Stack) 배열 (Array) 1. 생성 / 소멸 / 기능(Push, Pop, Etc) (0) | 2013.05.29 |
---|---|
스택 (Stack) 정의 (0) | 2013.05.28 |
[C] 원형 연결 리스트 (Circular Linked List) 3. 코드 정리 / 예제 (0) | 2013.05.14 |
[C] 원형 연결 리스트 (Circular Linked List) 2. 추가 / 탐색 / 삽입 / 삭제 (0) | 2013.05.14 |
[C] 원형 연결 리스트 (Circular Linked List) 1. 정의 / 생성 / 소멸 (0) | 2013.05.14 |