연결리스트는 배열보다 메모리 사용량이 높다
연결리스트(Linked List)는 메모리 상 서로 떨어져있는 노드(Node)들이, 포인터로 서로 연결되는 구조를 가지고 있다. 때문에 노드는 기본적으로 자신이 가지는 값(data
) 외에도 다음 노드의 위치를 가리키는 포인터(next
) 또한 요소로 가지게 된다.
그러다보니 같은 개수의 데이터를 보유한 배열과 연결리스트를 비교해보면, 연결리스트가 배열보다 메모리를 더 점유하게 된다.
- 32-bit int형 원소 다섯 개를 가지고 있다고 가정
- 배열의 경우 4 bytes * 5 = 20 bytes
- 단반향 연결리스트의 경우 (4 bytes * 5) + (포인터 4 or 8 bytes * 5) = 40~60 bytes
만약 양뱡향 연결리스트(Doubly Linked List)라면 노드에 포인터가 하나 더 늘어나기 때문에 메모리 사용량은 더 늘어난다.
하지만 연결리스트의 경우는 필요할 때, 필요한 만큼의 노드를 가지기 때문에 실질적으로 낭비하는 공간은 없는 반면, 배열은 연속된 메모리 블럭을 미리 할당하므로, 데이터의 수가 급격히 줄거나 예상보다 적을 경우 메모리가 낭비될 수 있다.
확장 🌱
- 연결리스트의 경우 포인터 때문에 메모리 사용량이 늘어나게 되는데, 이를 줄일 수 있는 방법이 있을까?
- Doubly linked list의 경우는 XOR 연결리스트가 있다
- 배열에서 사용하지 않는 공간을 낭비하지 않기위해 처리하는 방법이 따로 있을까
- 원소의 개수와 배열의 크기를 비교해서 일정 수치 이하로 내려갈 경우, 배열의 크기를 반으로 줄이는 함수를 구현할 수 있다.
- 반대로 배열을 확장해야 할 때는 한 칸씩 공간을 추가하는 것 보다, 배열 크기의 두 배로 늘리면 배열의 생성과 기존 원소의 복사 과정의 연산 횟수를 크게 줄일 수 있다.
관련 노트 📘
- 250515204930 - 시간복잡도를 알아야 프로그램의 성능을 예측할 수 있다