가장 기본적인 자료구조인 배열(Array) 자료구조는 논리적 저장 순서와 물리적 저장 순서가 일치한다.
따라서 인덱스(index)로 해당 원소(element)에 접근할 수 있으며, 찾고자 하는 원소의 인덱스를 알고 있다면 O(1)에 해당 원소로 접근할 수 있다.
즉, Random Access가 가능하다는 장점이 있다.
하지만, 배열은 선언할 때 크기와 데이터 타입을 지정해야 하므로 계속 데이터가 늘어나는 경우 최대 사이즈를 미리 알지 못한다면 사용하기 부적합하다.
배열은 데이터를 삽입하거나 삭제할 때도 매우 비효율적이다.
만약 해당 원소에 접근하여 삽입 또는 삭제 작업을 완료했다면O(1)
, 또 한가지 작업을 추가적으로 해줘야 하기 때문에 시간이 더 걸린다.
새로운 값을 삽입해야 한다면, 원래 값들을 뒤로 밀어내며 해당 인덱스에 덮어 씌워야 한다O(n)
. 기본적으로 크기를 정해놓은 배열에서는 값들을 뒤로 밀어내는 것은 어렵다.
어떤 값을 삭제했다면, 빈 공간이 생겨 배열의 연속적인 특성이 깨지게 된다. 따라서 값들을 쉬프트(shift) 해줘야 하는 비용이 발생한다O(n)
.
따라서 배열에서의 삭제에 대한 시간 복잡도는 최악의 경우 O(n)
이다.
배열의 단점을 해결하기 위해 나온 것이 리스트(List)이다.
배열처럼 크기가 정해져 있지 않기 때문에, 중간에 데이터를 삽입하거나 삭제하더라도 크기가 정해져있던 배열에서의 문제점을 해결할 수 있다.
인덱스를 갖고 있어 검색도 빠르다.
각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료구조이다.
노드의 포인터는 다음이나 이전 노드와의 연결을 담당한다. 뒤에 노드만 가리키는 단일, 앞뒤 노드를 가리키는 다중 LinkedList가 있다.
O(1)
.O(n)
.ArrayList는 배열의 형태로 데이터를 저장하는 자료구조이다. 인덱스를 이용하여 데이터 검색이 빠르지만 삽입, 삭제가 느리다.
LinkedList는 데이터가 노드 형태로 연결되어있는 구조이다. 노드의 연결만 수정해주면 되기 때문에 데이터 삽입, 삭제가 빠르지만, 검색은 느리다.
[참고]