Skip to content

Commit 7d00b32

Browse files
committed
Docs: 220301/김지원/ArrayVSLinkedList summary
1 parent 71e81de commit 7d00b32

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Array vs Linked List
2+
3+
## Array
4+
순차적으로 데이터를 저장하는 자료구조
5+
6+
- `인덱스`를 통해 해당 원소에 접근할 수 있다. (`O(1)`)
7+
-`random access`가 가능하다.
8+
- 고정된 크기를 갖는 같은 자료형의 원소들이 연속적인 형태로 구성된 자료구조
9+
- `cache hit rate`가 높다.
10+
- 배열을 생성하려면 메모리 상에 **연속한 구간을 할당**해야해서 할당에 제약이 걸릴 수 있다.
11+
- 연속된 메모리 상에 원소들이 존재하므로 처음 배열을 선언한 크기만큼 데이터를 저장하지 않는다면 메모리 낭비가 발생한다.
12+
- Array의 중간 요소를 삭제/삽입 하는 경우, 뒤에 있는 데이터를 삭제/삽입 한 요소 수 만큼 `shift`해줘야 하는 비용이 발생한다. (`O(n)`)
13+
14+
## Dynamic Array 문제
15+
데이터를 새로 추가할 때 Resizing 문제(메모리의 사이즈를 다시 조정하는 문제)가 생길 수 있다.
16+
- 기존의 배열은 그대로 두고
17+
- 새로운 길이로 지정된 배열을 따로 할당 후
18+
- 순차적으로 데이터의 복사를 진행하고
19+
- 기존의 배열을 삭제
20+
21+
## List
22+
순서가 있는 데이터의 모임이다. 다른 말로는 시퀀스(sequence)라고도 부른다.
23+
24+
### ArrayList
25+
배열을 이용해서 리스트를 구현한 것을 의미한다.
26+
장점: 내부적으로 배열을 사용하기 때문에 인덱스를 이용해서 접근하는 것이 빠르다.
27+
단점: 데이터의 추가와 삭제가 느리다. + Dynamic Array 문제
28+
29+
### LinkedList
30+
배열은 미리 특정한 연결된 공간을 확보하고 데이터를 쓰고 있는 자료구조이고, 링크드 리스트는 필요할 때 마다 데이터를 추가할 수 있는 구조이다. 배열의 단점을 극복한 자료구조가 `링크드 리스트`라고 볼 수 있다.
31+
32+
- 각 노드는 연속된 공간에 저장되어 있지 않고 메모리의 여러 부분에 분포되어 있다.
33+
- 순차성을 보장하지 못하기 때문에 spacial locality 보장이 되지 않아 cache hit가 어렵다.
34+
- 각 노드에 다음 노드의 주소를 저장함으로써 다음 노드를 탐색할 수 있다.
35+
- 동적으로 메모리 사용이 가능하다.
36+
- 순차 접근 방식을 사용하기 때문에 어떤 한 데이터를 찾기 위해서는 처음부터 순차적으로 탐색해야 한다. (`O(n)`)
37+
- 삽입/삭제: `O(1)`
38+
- 원하는 노드에 접근 + 삽입/삭제: `O(n)`
39+
40+
<details>
41+
<summary>Array vs LinkedList</summary>
42+
Array는 Random Access를 지원한다. 요소들을 인덱스를 통해 직접 접근할 수 있다. 따라서 특정 요소에 접근하는 시간 복잡도는 O(1)이다. 반면 Linkedlist는 Sequential Access를 지원한다. 어떤 요소를 접근할 때 순차적으로 검색하며 찾아야 한다. 따라서 특정 요소에 접근할 때 시간 복잡도는 O(N)이다.
43+
44+
저장 방식도 배열에서 요소들은 인접한 메모리 위치에 연이어 저장된다. 반면 Linkedlist에서는 새로운 요소에 할당된 메모리 위치 주소가 linkedlist의 이전 요소에 저장된다.
45+
46+
배열에서 삽입과 삭제는 O(N)이 소요되지만, Linkedlist에서 삽입과 삭제는 O(1)이 소요된다.
47+
48+
배열에서 메모리는 선언 시 컴파일 타임에 할당이 된다. (정적 메모리 할당) 반면 Linkedlist에서는 새로운 요소가 추가될 때 런타임에 메모리를 할당한다. (동적 메모리 할당)
49+
50+
배열은 Stack 섹션에 메모리 할당이 이루어진다. 반면 Linkedlist는 Heap 섹션에 메모리 할당이 이루어진다.
51+
</details>

0 commit comments

Comments
 (0)