Array (배열)

정적배열 (Static Array)

  • 메모리상에서 연속적이다.
  • 메모리에 선언하는 시점에 각각의 인덱스가 어느 메모리에 할당되는지 정해진다.

동적배열 (Dynamic Array)

  • 원소가 추가, 삭제 됨에 따라 메모리가 늘어났다가 줄어들어야함으로 연속한 메모리에 들어있지 않다.
  • 다만, 내부적으로 O(1)의 시간 복잡도로 원소를 조회할 수 있다.

 

배열의 시간복잡도

삽입

  • [최악의 경우] 맨 앞에 새로운 값을 삽입하는 경우, 다른 값들을 모두 한칸씩 이동해야 하므로 -> O(N)
  • 맨 뒤에 새로운 값을 삽입하는 경우, 다른 값들의 이동이 존재하지 않으므로 -> O(1)

삭제

  • [최악의 경우] 맨 앞의 값을 삭제하는 경우, 다른 값들을 모두 한칸씩 이동해야 하므로. -> O(N)
  • 맨 뒤의 값을 삭제하는 경우, 다른 값들의 이동이 존재하지 않으므로 -> O(1)

탐색

  • 배열은 index 기반으로 이루어져 있기 때문에 다른 위치를 참조하여 바로 원하는 index의 원소를 구할 수 있다. -> O(1)

LinkedList (연결리스트)

  • 랜덤 접근이 가능한 배열과는 다른 순차적인(sequential) 자료구조
  • 노드들로 구성되어 있다.
  • 노드는 저장할 값과 다음 노드를 가리키는 포인터로 이루어져 있다.
  • 첫 노드인 헤드(Head)로 부터 시작해, 포인터를 사용해 리스트를 순회할 수 있다.

Single Linked List (단일 연결리스트)

  • 포인터가 한 방향(다음 노드)을 가리키면 Single Linked List

Doubly Linked List

  • Single Linked List에 이전 노드를 가리키는 포인터를 추가하게 되면 양방향으로 순회가 가능한 Doubly Linked List가 된다.

Circular Linked List

  • Linked List의 마지막 노드인 테일(Tail)과 헤드(Head)를 이으면 Circular Linked List이다.

 

연결리스트의 시간복잡도

삽입

  • 새로운 노드를 만들어 포인터로 연결 하면 되므로 -> O(1)

삭제

  • 노드를 삭제하고 이전 이후 노드를 포인터로 연결 하면 되므로 -> O(1)

탐색

  • [최악의 경우] 맨 뒤의 원소를 조회하는 경우, 헤드에서부터 순차적으로 탐색을 하므로 -> O(N)
  • 맨 앞의 원소를 조회하는 경우, 바로 탐색가능 하므로 -> O(1)

장단점 비교 및 정리

배열은 인덱스로 O(1)로 조회에 효율적이지만, 연결리스트에 비해 삽입/삭제가 비효율 적인 부분이 있다.

연결리스트는 순차적으로 탐색해야 함으로 배열에 비해 조회에 비효율적이며, 노드를 통해 삽입/삭제 효율성이 좋다.

  배열 연결리스트
조회 O(1) O(N)
맨 앞에서 삽입/삭제 O(N) O(1)
맨 뒤에서 삽입/삭제 O(1) O(1) : 마지막 원소를 아는 경우
O(N) : 마지막 원소를 모르는 경우
중간에서 삽입/삭제 O(N) 탐색시간 + O(1)

 

'CS > DSA' 카테고리의 다른 글

[알고리즘]그래프 탐색 알고리즘 BFS/DFS  (0) 2022.07.04

그래프

여러 개체들이 연결되어 있는 자료구조

탐색

특정 개체를 찾기 위한 알고리즘

대표적 문제 유형

  1. 경로탐색 유형 (최단거리, 시간)
  2. 네트워크 유형 (연결)
  3. 조합 유형 (모든 조합 만들기)

 

DFS(Depth-Firsh Search) 깊이 우선 탐색

  • 한 놈만 끝까지 패는 유형

구현 방법

  • 재귀함수가 가장 일반적
  • 한 가지 방법을 끝까지 다 해보고 다음 방식 동작

 

BFS(Breadth-First Search) 너비 우선 탐색

  • 여러 놈을 한대씩 때리면서 가는 유형

구현 방법

  • Queue / LinkedList 사용이 가장 보편적

 

DFS/BFS 알고리즘 판단 방법

  • 자신있는 알고리즘으로 탐색
  • DFS의 장점: 하나의 조합을 완성해서 정답과 비교하는 방식임으로 동작 검증이 쉽다
  • BFS의 장점: 시간복잡도가 낮다(효율성 TC에 유리)

 

참조

'CS > DSA' 카테고리의 다른 글

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

+ Recent posts