개념
List
- 값(value)들을 저장하는 추상자료형(ADT)
- 순서가 있음
- 중복을 허용
언제 쓸까?
Set이나 Map이 더 적절한 상황이 아니라면,
거의 대부분 List를 사용한다고 봐도 된다.
- 객관식 문제의 정답을 List로 관리할 수 있음
- 일반적으로 사용되는 프로그래밍 언어 순위를 순서대로 저장할 수 있음
- DB에서 데이터를 여러 개의 읽어와서 그것을 담을 수 있음
List 구현체
Array list
- 배열(array)을 사용하여 List를 구현
- 연속적인 메모리 공간에 데이터를 저장
Linked list
- 노드를 연결(linked)시키는 형태로 구현
- 노드 각각이 각 포인터를 통해 다음 노드를 가리키는 구조
- 메모리 공간에 띄엄 띄엄 저장
- 확장팩들
- circular linked list
- tail이 가리키는 마지막 노드가 첫번째 노드를 가리킴
(head 라는 포인터를 관리할 필요 없음)
- doubly linked list
- 양방향 통행 (앞뒤 이동으로 빨리 접근 가능)
- circular doubly linked list
Array list vs. Linked list
구현
- 배열(array) 사용 vs. 노드를 연결(linked)
데이터 접근 시간
- 모든 데이터 상수 시간 접근 vs. 위치에 따라 이동 시간 발생
삽입/삭제 시간
- 공통점: 삽입삭제 자체는 상수 시간
- 삽입/삭제 시 데이터 시프트가 필요한 경우, 추가 시간 발생
vs. 삽입/삭제 위치에 따라 그 위치까지 이동하는 시간 발생
리스트 크기 확장
- 배열 확장이 필요한 경우, 새로운 배열에 복사하는 추가 시간 발생
vs. 없음
검색
- 공통점: 최악의 경우, 리스트에 있는 아이템 수 만큼 확인
CPU cache