Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발블로그

[자료구조] Array vs LinkedList 본문

카테고리 없음

[자료구조] Array vs LinkedList

학교옆메추리 2020. 5. 28. 15:04

Array

  • 논리/물리적 저장 순서가 일치 (연속적인 메모리 공간에 저장)
  • index를 통한 배열 원소 접근 가능하며, 접근의 시간복잡도는 O(1)
  • 원소 삽입/삭제 시 기존 원소들을 shift해야 하므로 O(n)의 시간복잡도를 가진다.
  • 제약적 공간을 가진다.

LinkedList

  • 논리/물리적 저장 순서 불일치 (다음 노드의 주소값을 가짐)
  • index 사용 불가. 접근 시 리스트를 순회해야 하므로 시간복잡도는 O(n)
  • 원소의 삽입/삭제가 Array에 비해 빠름.

LinkedList의 원소 삽입/삭제 자체는 빠르지만, 해당 원소를 찾는데 O(n)의 시간이 걸린다. (Bottle neck)

(맨 앞/뒤에만 원소를 삽입한다고 가정하면 O(1)의 시간복잡도를 가진다.)

 

하지만, 원소를 삽입/삭제할 때마다 메모리의 할당/해제가 일어나기 때문에 사실은 O(n)보다는 크다.

사용할 크기를 미리 안다면, 미리 공간을 확보하는 Array가 더 효율적일 수 있다.(항상 상황에 따라 다르다)

 

 

Array vs LinkedList

  Array LinkedList
접근 O(1) O(n)
삽입, 삭제 O(n) O(n) (앞뒤만 하면 O(1))
메모리 할당 정적 메모리 할당(compile time, stack) 동적 메모리 할당(runtime, heap)
크기 선언 시점에 정한 크기 runtime에서 동적으로 변화

 

원소 접근이 중요하다면 Array를, 삽입/삭제가 빈번하다면 LinkedList사용 하는것이 좋을 것 같다.

 

ArrayList

c++의 vector, java의 ArrayList 등이 이에 해당한다.

  • 내부적으로 데이터를 배열에서 관리하지만, 보다 편리한 인터페이스를 제공한다. 초기에 크기를 지정하지 않고 runtime에서 늘이거나 줄일 수 있다.(LinkedList의 특성)
  • 원소의 추가/삭제는 임시 배열을 생성, 복사하는 방법을 사용하므로 대량의 자료를 추가/삭제한다면 성능이 저하된다.
  • index접근이 가능하다.(Array의 특성)