[CS] 배열 / 연결리스트

눈치없어·2025년 2월 26일

배열

일정한 메모리 공간을 차지하는 여러 요소들이 순차적으로 나열된 자료구조

각 요소에는 0부터 시작하는 고유한 순서 번호인 인덱스가 매겨짐
이 인덱스로 배열의 요소를 식별할 수 있음

배열 빅 오 표기법

📌 인덱스 접근

O(1)

  • 인덱스를 통해 요소에 접근하는 시간은 요소의 개수와 무관하게 일정함
    - 인덱스를 바탕으로 배열의 특정 요소에 접근하는 시간은 O(1)로 일정
    - 인덱스를 바탕으로 배열의 특정 요소를 수정하는 시간도 O(1)로 일정

📌 순차 접근

O(n)

  • 0번 인덱스부터 N번 인덱스까지 원하는 데이터를 찾을때까지 하나씩 인덱스를 탐색해 나감
    - 요소가 N개라면 연산의 상한을 N으로 표현

📌 특정 요소 추가/삭제 경우

삽입 혹은 연산 후에 모든 요소들의 재정렬이 이루어진다고 가정하면 시간복잡도는 대략 O(n)
중간에 추가 혹은 삭제된 요소로 인해 이후의 요소들이 이동되어야 하기 때문

📌 다차원 배열

배열 확장

  • 배열은 기본적으로 일차원 구조를 가지지만, 이차원, 삼차원 배열로 확장 가능
  • 이차원 배열: 배열 속에 배열이 포함된 형태 → 두 개의 인덱스로 요소를 식별
  • 삼차원 배열: 배열 속에 배열 속에 배열이 포함된 형태 → 세 개의 인덱스로 요소를 식별

배열 활용성

  • 가장 기본적인 자료구조로, 활용도가 높음
  • 데이터를 일렬로 나열하여 관리하는 데 유용함
  • 다른 자료구조 및 알고리즘 구현의 기반이 됨

배열의 메모리 저장 구조
이차원 배열: 행과 열(row, column) 구조로 저장
삼차원 배열: 행, 열, 깊이(depth) 구조로 저장

📌 정적 배열 / 동적 배열

정적 배열: 프로그램을 실행하기 전에 크기가 고정되어 있는 배열

  • 정적 배열의 크기는 원칙적으로 프로그램 실행 도중에 바꾸지 못함

동적 배열: 실행 과정에서 크기가 변할 수 있는 배열

  • 포함된 요소의 개수가 동적으로 변할 수 있는 특성 덕분에 프로그램을 실행하기 전에 배열의 크기를 알기 어려운 경우, 유연하게 요소의 개수를 조정해야 하는 경우에 사용할 수 있음


연결리스트

노드(Node)의 모음으로 구성된 자료구조

  • 저장할 데이터 + 다음 노드의 위치(메모리 주소) 정보를 포함
  • 특정 노드에 접근하면 다음 노드의 위치를 알 수 있어 순차적으로 데이터를 탐색 가능
  • 첫 번째 노드 → 헤드(Head)
  • 마지막 노드 → 꼬리(Tail)
연결 리스트 특징
  • 메모리에 연속적으로 저장될 필요 없음 → 불연속적으로 데이터 저장 가능
  • 배열과의 차이점
    - 배열: O(1)로 임의 접근 가능(인덱스가 주어진다면)
    - 연결 리스트: O(n)으로 앞에서부터 순차 접근
연결 리스트 장점
  • 삽입/삭제 연산에서 유리함
    - 배열처럼 데이터 재정렬이 필요 없음
    - 노드의 위치만 변경하면 되므로 O(1) 만에 삽입/삭제 가능

연결 리스트 종류

📌 싱글 연결 리스트 (Singly Linked List)

  • 노드 내에 다음 노드의 위치만 저장
  • 한쪽 방향(앞 → 뒤)으로만 탐색 가능
  • 이전 노드의 위치를 알기 어려움 → 탐색이 단방향으로만 가능

📌 이중 연결 리스트 (Doubly Linked List)

  • 다음 노드의 위치 + 이전 노드의 위치도 저장
  • 양방향 탐색 가능 → 탐색 성능 향상
  • 단점: 추가적인 저장 공간(메모리 주소 2개)이 필요함

📌 환형 연결 리스트 (Circular Linked List)

  • 마지막 노드(꼬리)가 첫 번째 노드(헤드)를 가리키는 형태
  • 모든 노드를 여러 번 순회해야 할 때 유용
  • 이중 연결 리스트로도 구현 가능 → 헤드의 이전 노드가 꼬리를, 꼬리의 다음 노드가 헤드를 가리키도록 구성


참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 4-2)

profile
dock 사이즈 다르잖아

0개의 댓글