List 컬렉션 클래스
ArrayList<E>
LinkedList<E>
Vector<E>
Stack<E>
내부적으로 배열을 이용하여 요소를 저장한다.
get/set
배열의 index를 통해 빠르게 접근한다.
=> 상수 시간
의 시간 복잡도를 갖는다.
add
ArrayList는 기본적으로 배열이다. 따라서 중간에 값을 끼워넣는 연산이 불가능하다.
새로운 값을 추가할 때, List의 크기가 생성되어 있는 배열의 size(default: size = 10)보다 커지면 이전 크기의 2배가 되는 배열을 생성해 배열 전체를 복사하여 새로운 배열에 복사하고 제일 뒤에 값을 추가한다.
즉, 기존에 있던 배열에서 추가하고 싶은 index부터 마지막 index까지 배열을 한칸씩 뒤로 미룬다.
=> 해당하는 인덱스를 찾아가는 시간(O(1)) + 배열을 복사하는 시간(O(n)) = O(n)
remove
삭제된 index + 1부터 마지막 index까지 한 칸씩 앞으로 당긴다.
=> O(n)
의 시간 복잡도
get/set을 자주 사용하는 경우(index를 통해 접근할 때) 유용하다.
공간 복잡도의 경우 연속된 메모리안에 저장되어 낭비되는 공간이 없어 속도가 빠른 경우가 발생한다.
연결 리스트를 이용하여 요소를 저장한다.
단일 연결 리스트(singly linked list)
다음 요소를 가리키는 참조만을 가지는 연결리스트를 말한다.
이중 연결 리스트(doubly linked list)
이전 요소를 가리키는 것이 어려운 단일 연결 리스트의 단점을 극복한다. 이전 요소를 가리키는 참조를 함께 갖는다.
get/set
비순차적으로 저장되어 있다. 해당하는 index에 대한 값을 얻어올 때 시작이나 끝에서부터 해당 index까지 순차적으로 접근하여 확인하고 값을 얻는다.
=> 시간 복잡도는 O(n)
이다.
add
일반적인 경우
추가를 원하는 index에 도달할 때까지 순차 접근을 하여 O(n)
이 발생한다. 연결하는 작업은 next와 prev를 연결하므로 상수 시간이 O(1)
의 복잡도이다.
=> 시간 복잡도는 O(n)
이다.
시작이나 끝에 요소를 추가하는 경우
head(시작)와 tail(끝)을 갖는 구조이다. 각각을 찾아가는데 O(1)
이라는 시간 복잡도를 갖는다.
=> 시간 복잡도는 O(1)
이다.
remove
add와 비슷하다.
처음이나 끝에 잦은 삽입, 삭제가 발생하는 경우 유용하다.
공간 복잡도의 경우, 두개의 참조 노드가 필요하니 더 많은 공간을 차지한다.
TODO(10.07 작성)
Reference