[자료구조] 배열, 연결 리스트 (Array, LinkedList)

kimgwon·2023년 7월 31일

CS

목록 보기
3/10
post-thumbnail

배열

  • 배열은 입력된 데이터들이 메모리 공간에서 연속된 메모리 주소를 할당받는 자료구조이다.
  • 메모리 상에서 연속적으로 저장되어 있는 특징을 갖기 때문에, index를 통한 접근이 용이하다.
  • 배열의 크기는 처음 생성할 때 정하며, 이후에는 변경할 수 없다. 또한 해당 배열 크기 이상의 데이터를 저장할 수 없다.
  • 컴파일 과정에서 메모리가 할당되는 정적 메모리 할당이다.
  • Stack 영역에 메모리 할당이 된다.

시간 복잡도

  • 탐색:
    • 인덱스를 통한 탐색: O(1)
    • 순차 탐색: O(n)
  • 삽입/삭제:
    • 배열의 처음 또는 중간에 삽입 및 삭제: O(n)
    • 배열의 끝에 삽입 및 삭제: O(1)

연결 리스트

  • 연결 리스트는 여러개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조이며, 첫번째 노드를 head, 마지막 노드를 tail이라고 한다.
  • 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져 있다.
  • 배열과는 다르게 메모리를 연속적으로 사용하지 않는다. -> 처음부터 순차적으로 탐색해야 한다.
  • 크기의 제한이 없다.
  • 배열과는 다르게 순차적으로 접근해야 하는 면에서 불리할 수도 있으나, 노드가 연결된 구조이기 때문에 삽입, 삭제에 용이하다.
  • Tree 구조의 근간이 되는 자료구조이며, Tree에서 사용되었을때 그 유용성이 드러난다.
  • 런타임 환경에서 메모리가 할당되는 동적 메모리 할당이다.
  • Heap 영역에 메모리 할당이 된다.

시간 복잡도

  • 탐색: O(n)
  • 삽입/삭제:
    • 연결 리스트의 처음에 삽입/삭제: O(1)
    • 연결 리스트의 중간에 삽입/삭제: O(n)
    • 연결 리스트의 끝에 삽입/삭제:
      - 끝을 가리키는 별도의 포인터를 갖는 경우: O(1)
      - 끝을 가리키는 별도의 포인터를 갖지 않는 경우: O(n)

이중 연결 리스트

  • 이중 연결 리스트는 연결 리스트와 다르게 전/후로 탐색이 가능한 구조이다.
  • 즉, 단순 연결 리스트의 노드는 데이터와 다음 노드의 주소를 저장한다면, 이중 연결 리스트의 노드는 데이터, 이전 노드의 주소와 다음 노드의 주소를 저장하게 된다.
  • 장점: 단순 연결 리스트에서는 최악의 경우 n번의 탐색을 해야하지만, 이중 연결 리스트에서는 얻고자 하는 데이터의 위치가 tail에 가깝자면 tail에서부터 역방향으로 탐색이 가능하기 때문에 탐색 시간을 줄일 수 있다.

원형 연결 리스트

  • 마지막 노드가 첫번째 노드를 가리키게 하여 리스트의 구조를 원형으로 만든 연결 리스트 -> 마지막 노드의 링크필드가 NULL이 아닌, 첫번째 노드의 주소이다.
  • 리스트의 끝에 노드를 삽입하는 연산이 단순 연결 리스트보다 효율적이다. -> 해드 포인터에서 시작하여 모든 노드를 거쳐 마지막에 삽입하는 것이 아니라, 헤드 포인터가 마지막 노드를 가리키도록 구성하면 리스트의 처음과 끝에 노드를 삽입할 수 있다.

배열 vs 연결 리스트

배열연결리스트
정적 자료구조동적 자료구조
미리 크기를 정해 놓음크기를 정할 필요가 없음
연속된 메모리 주소를 할당 받음연속된 메모리 주소를 할당 받지 않음
접근, 탐색 용이추가, 삭제 용이
index 존재node 존재

장점

  • 배열
    • 인덱스를 통한 빠른 접근 가능하다.
    • 구현이 간단하다.
  • 연결 리스트
    • 삽입/삭제 용이하다.

단점

  • 배열
    • 삽입/삭제가 오래 걸린다.
    • 배열 중간에 있는 데이터가 삭제되면, 공간 낭비가 발생한다.
    • 동적으로 크기를 늘리거나 줄이는 것이 힘들다.
  • 연결 리스트
    • 임의 접근이 불가능하여 처음부터 탐색을 진행해야 함

용도

  • 배열: 빠른 접근이 요구되고, 데이터의 삽입과 삭제가 적을 때 -> 데이터 접근이 주 업무일 경우 (달력 날짜 접근)
  • 연결 리스트: 삽입과 삭제 연산이 잦고, 검색 빈도가 적을 때 -> 데이터 수정이 주 업무일 경우 (음악 플레이리스트. 이전 곡과 다음 곡 연결)

예상 질문
Q. 배열, 연결 리스트의 특징과 장단점은?
A. 배열은 정적 자료구조이고 구현이 간단하며 구현이 간단하다. 하지만 삽입/삭제가 오래걸리고 배열 중간에 있는 데이터가 삭제되면, 공간 낭비가 발생한다. 연결 리스트는 동적 자료구조이고 삽입/삭제가 용이하다. 하지만 임의 접근이 불가능하여 처음부터 탐색을 진행해야 한다.
Q. 배열 또는 연결 리스트를 사용하면 좋을 데이터의 예시와 이유
A. 배열은 인덱스를 통한 임의 접근이 가능하기 때문에 데이터 접근이 주 업무일 경우, 연결 리스트는 동적 자료구조로 삽입 삭제가 용이하기 때문에 데이터 수정이 주 업무일 경우 적합하다.
Q. 이진 트리를 구현할 때 배열과 연결 리스트 중 적합한 것과 이유
A. 연결 리스트. 배열은 연속적인 공간을 할당하기 때문에, 이진 트리를 구현할 경우 메모리 낭비가 심해질 수 있다.


참고
https://velog.io/@xxhaileypark/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8-Array-LinkedList
https://blacklobster.tistory.com/8

0개의 댓글