- 여러 데이터를 그룹화 해서 element로써 관리하기 위한 자료구조
Array
- Array 선언 시 고정된 크기의 메모리를(길이를) 할당한다.
- 선언시 정해진 메모리(길이)는 변하지 않는다.
- Array는 같은 자료형의 element만 포함할 수 있다.
- Array의 index는 각 value에 대한 유일한 식별자이다. (0부터 시작) 단순히 몇 번째인지를 나타내는 List의 index와는 다르다.
- 이 고정된 index를 사용해서 데이터에 대한 빠른 접근과 수정이 가능하다. (시간복잡도 O(1) )
- Array 중간의 데이터를 삭제하면 삭제된 데이터의 index 위치에 그대로 빈 메모리가 생긴다. (메모리 낭비)
- 빈 메모리를 없애기 위해서는 빈 곳의 index+1 부터 한 칸씩 앞으로 재할당해줘야한다.
- Array 중간에 데이터를 삽입하는 경우 원래 index 위치의 원소부터 한 칸씩 뒤로 재할당 해줘야 한다.
List
- List 는 Array와 달리 동적으로 크기를 조정할 수 있다. 데이터를 추가하고 삭제, 수정, 조회하기 위한 다양한 메소드들을 지원한다.
- 배열의 장점인 고정된 index 대신 메모리의 빈틈 없이 데이터를 저장하는 방식을 채택했다.
- 서로 다른 자료형의 element를 포함할 수 있다.
//Python
my_list = [1, "Hello", True, 3.14]
//Java
List<Object> myList = new ArrayList<>();
myList.add(1);
myList.add("Hello");
myList.add(true);
myList.add(3.14);
- List interface를 구현한 List Collection Class에는 ArrayList, LinkedList, Stack, Vector 등등이 있다.
ArrayList
- 내부적으로 Array를 사용한다.
- 데이터의 추가/삭제의 경우 임시 Array를 생성해 데이터를 복사한다.
- 따라서 대량의 데이터를 추가/삭제하는 경우, 그만큼 복사가 많이 일어나게 되어 성능 저하가 일어날 수 있다. 즉, add() 메서드 실행 시, 더 큰 용량의 배열을 만들어 데이터를 옮기는 것이다.
- 하지만 index를 갖고 있어 검색 등 데이터에 접근하는 작업에 더 효율적이다. Array와 마찬가지로 O(1)의 시간복잡도를 갖는다.
LinkedList
- 데이터를 각 노드에 저장하여, 각 노드가 다음 노드의 상태만을 알거나(단방향) 이전과 다음 노드의 상태만을 알고 있는 것(양방향)을 말한다.
- 검색 시 맨 처음(Head)부터 모든 노드들을 탐색해야 하기 때문에 최악의 경우 O(n)의 시간복잡도를 가질 수 있다. 따라서 검색에 있어서는 ArrayList보다 비효율적이다.
- 하지만 데이터의 삽입, 삭제시에는 훨씬 빠르다. 해당 노드를 참조하는 이전노드와 다음노드의 포인터 상태를 바꾸면 되기 때문이다.
'Computer Science > Data Structure' 카테고리의 다른 글
Graph (0) | 2023.04.22 |
---|---|
Hash (0) | 2023.04.21 |