Array vs Linked List

2023. 6. 24. 00:00·CS 공부/자료구조

Array란?

 

특징

연관된 데이터를 메모리상에서 연속적이며 순차적으로 미리 할당된 크기만큼 저장하는 자료구조이다.

 

  • 고정된 저장 공간 (fixed-size)
  • 순차적인 데이터 저장 (order)

 

장점

- 접근(lookup)과 마지막 원소 추가/삭제가 O(1)로 빠르다.

 

 

단점

- 선언시에 크기를 미리 할당해야해서 메모리 낭비나 추가적인 오버헤드가 발생할 수 있다.

 

※ 미리 예상한 크기보다 더 많은 개수의 데이터를 저장하기 위한 해결방법은? 

=> Dynamic Array 이용

기존의 size 보다 더 큰 array를 선언하여 데이터를 옮겨 할당한다. 모든 데이터를 옮겼다면 기존 array는 메모리에서 삭제한다. 이런식으로 동적으로 배열의 크기를 조절하는 자료구조를 Dynamic Array라고 한다.  

=> Linked List 이용

미리 크기를 예상하기 쉽지 않다면 Linked List를 사용함으로써 데이터가 추가될 때마다 메모리공간을 그때그때마다 할당하는 방식을 사용하면 된다. 

 

 

Dynamic Array란?

배경 ※ Static Array의 한계점을 보안하기 위해.. Array의 경우 size가 고정되었기 때문에 선언시에 설정한 size보다 많은 데이터를 저장할 수 없다. (Static Array의 한계점) 이를 보안하기 위해 저장공간

hyolls100.tistory.com

 

 

메모리 할당

- 컴파일 단계에서 메모리 할당이 일어난다. → 정적 메모리 할당 (Static Memory Allocation)

- Stack 메모리 영역에 할당된다. 

 

 


 

Linked List란?

 

특징

Node라는 구조체로 이루어져 있다. (Node는 데이터 값과 다음 Node를 가리키는 주소값을 저장한다.)

  • 물리적 불연속성 - 메모리상에서는 비연속적으로 저장되어 있다.
  • 논리적 연속성 - 각 Node는 다음 Node를 가리키는 주소 정보를 가지고 있기 때문에 논리적으로 연속성을 유지하면서 연결되어있다. (다음 Node의 주소값 저장으로 인해 데이터 하나당 차지하는 메모리가 크다.)

장점

- array와 다르게 초기 size를 고민할 필요가 없고, 필요한 만큼 동적 메모리 할당을 하여 메모리 낭비가 없다. 

- 중간에 데이터 삽입/삭제의 경우

array는 해당 인덱스의 뒤에 있는 모든 원소들을 shift해야 해서 O(n)이 걸리지만,

Linked List는 물리적으로 옮길 필요없이 다음 Node를 가리키는 주소값만 변경하면 되기 때문에 O(1)로 가능하다. 

 

 

메모리 할당

- 런타임 단계에서 메모리 할당이 일어난다. → 동적 메모리 할당 (Dynamic Memory Allocation)

- Heap 메모리 영역에 할당된다. 

 

 


 

Array와 Linked List의 시간복잡도

  Array Linked List
access O(1) O(n)
append O(1) O(n) 마지막 원소 찾는 시간
마지막원소 delete O(1) O(n) 마지막 원소 찾는 시간
insert O(n) O(1) (실질적 O(n))
delete O(n) O(1) (실질적 O(n))
search O(n) O(n)

 

조회 (lookup)

Array

- 메모리상에서 연속적으로 저장하기 때문에 직접(즉시) 접근할 수 있다. O(1)

Linked List

- 메모리상에서 불연속적으로 저장하기 때문에 순차 접근만 가능하다. O(n)

 

삽입/삭제 (insert/delete)

Array

- 맨 마지막 원소 추가/삭제의 경우는 O(1)

- 중간의 원소의 경우는 해당 원소보다 큰 인덱스의 원소들을 한칸씩 shift 해줘야 하는 비용이 발생하여 이 경우는 O(n) 

Linked List

- 다음 Node를 가리키는 부분만 다른 주소값으로 변경하면 되기 때문에 shift할 필요가 없어 O(1) 이지만,

  추가/삭제하려는 index까지 도달하는데 O(n)이 걸리기 때문에 실질적으로는 O(n)

 

 


 

상황에 맞는 자료구조 선택

  • 조회 작업이 잦다면? - Array
  • 조회 작업을 별로 하지않을 때? - Linked List
  • 데이터를 반복문을 통해서 빠르게 순회할 때? - Array
  • 삽입/삭제를 자주해야 될 때? - Linked List
  • 초기에 데이터 개수를 미리 알고있을 때? - Array
  • 얼마만큼의 데이터가 들어올지 예측이 안될 때? - Linked List
  • 메모리를 적게 쓰는 게 중요한 상황일 때? - Array

 

 

 

 

'CS 공부 > 자료구조' 카테고리의 다른 글

여러 종류의 트리(Tree) 정리 (이진 트리, 전 이진 트리, 완전 이진 트리, 포화 이진 트리, 이진 탐색 트리)  (0) 2023.08.09
힙(Heap)이란?  (0) 2023.08.09
원형큐(Circular Queue)란?  (0) 2023.08.07
Queue & Stack  (0) 2023.06.24
Dynamic Array란?  (0) 2023.06.24
'CS 공부/자료구조' 카테고리의 다른 글
  • 힙(Heap)이란?
  • 원형큐(Circular Queue)란?
  • Queue & Stack
  • Dynamic Array란?
횰쓰
횰쓰
개발 성장 블로그입니다
  • 횰쓰
    횰쓰토리
    횰쓰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS 공부
        • 운영체제
        • 네트워크
        • 컴퓨터구조
        • 데이터베이스
        • 알고리즘
        • 소프트웨어공학
        • 자료구조
        • 웹
      • 프로그래밍
        • Python
        • NodeJS
      • 프로젝트
        • React 프로젝트
      • 개발도구
        • Git
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    경쟁상태(Race Condition)
    운영체제
    리스트정렬여부
    한국사능력검정시험 심화
    Max힙
    chrome
    둘만의 암호
    포화이진트리
    RB트리
    Min힙
    이진탐색트리
    AVL트리
    Sync/Async
    페이지 교체
    멀티 프로세스
    멀티 스레드
    3 Way Handshake
    큐
    스택
    전이진트리
    카드뭉치
    tcp
    Push-force
    4 way handshake
    자가균형 이진탐색트리
    프로세스 주소공간
    SQL/NOSQL
    Git
    RB Tree
    최태성인강
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
횰쓰
Array vs Linked List
상단으로

티스토리툴바