배열과 연결리스트는 순차적으로 데이터를 저장한다는 점에서 비슷하다. 두 자료구조에 대해서 알아보자.
배열(Array)
배열은 논리적 저장순서와 물리적 저장순서가 일치하는 자료구조이다. 즉 인덱스(index)로 해당 원소에 접근 할 수 있다. 따라서 원소의 인덱스값을 이용하면 O(1)에 해당 원소에 접근 할 수 있다.
그러나 삭제 또는 삽입의 과정에서 추가적인 시간이 소요될 수 있다. 예를 들어 아래와 같은 상황에서 배열의 첫번째 자리(Arr[0])에 새로운 원소를 추가한다고 하자.
위와 같은 상황에서 Arr[0] 에 데이터 10을 추가하기 위해서는, Arr[0] 부터 Arr[4] 까지 모든 원소가 한 칸 씩 오른쪽으로 이동하게 된다.
즉, 원소를 삽입할 때 최악의 경우 모든 원소들을 1씩 옮기는 작업이 필요할 수 있다. 따라서 배열의 삽입은 O(n) 의 시간을 요구하게 된다. 마찬가지로 삭제의 경우도 O(n)의 시간을 요구하게 된다.
또한 배열은 배열이 꽉 차 있을 경우 메모리를 재할당해야 하거나 최악의 경우에는 삽입이 불가능 할 수 있다.
연결리스트(Linked List)
연결리스트의 노드는 논리적 저장순서와 물리적 저장순서가 다르다. 배열이 인덱스를 통해 원소에 접근한다면, 연결리스트는 포인터를 이용해 원소에 접근하다. 이 때 처음부터 끝까지 순차적으로 탐색하여 원소를 찾기 때문에 배열보다 접근 속도가 느릴 수 있다. 이 때 최악의 경우 모든 원소를 탐색할 수도 있으므로 탐색은 O(n) 의 시간이 걸린다.
삽입/삭제 시에는 노드의 포인터만 재설정 해주면 되므로 그 속도가 배열보다 빠를 수 있다. 그러나 삽입/삭제를 할 위치를 찾기 위해 탐색이 필요해 여전히 시간은 O(n) 이 걸린다.
정리
위 내용을 표로 정리하면 아래와 같다.
'Computer Science > [자료구조]' 카테고리의 다른 글
[자료구조] 트리의 순회, 중위 순회, 전위 순회, 후위 순회 | C언어 트리 순회 구현 (4) | 2021.07.19 |
---|---|
[자료구조] 트리(Tree)의 개념, 이진 트리, 전 이진 트리, 완전 이진트리, 포화 이진 트리, 이진 탐색트리 (6) | 2021.07.16 |
[자료구조] 큐(Queue)란? | c언어 큐 구현 (3) | 2021.07.15 |
[자료구조] 스택(stack) 의 개념과 이해 | c언어 스택 구현 (0) | 2021.07.14 |
[자료구조] 연결리스트(Linked List)의 개념, 이해 | 단순연결리스트(Singly linked list) C언어 구현, 소스코드 (4) | 2021.07.05 |