큐(Queue)

2022. 11. 11. 13:08·컴퓨터 과학/자료구조

큐(Queue)

- FIFO(First In First Out) 으로 데이터를 저장하는 구조입니다.

- 먼저 들어온 데이터가 먼저 나갑니다.

- 주요 동작 : enqueue, dequeue, peekFront

- enqueue(데이터) : 큐에 데이터 추가

- dequeue( ) : 큐의 가장 앞에 있는 데이터 제거 후 반환

- peekFront : 큐의 가장 앞에 있는 데이터 반환

JavaScript 로 Queue 구현(feat.Linked List)

dequeue 메서드 구현 시 array 가 제공하는 shift() 메서드를 사용하면 간단하게 구현 가능하겠지만, shift() 메서드는 시간 복잡도가 O(n) 이므로 Queue 구현에 적합하지 않습니다.

시간 복잡도를 O(1)으로 하기 위해 연결 리스트(Linked List) 를 통해 구현해 보았습니다.

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.front = null;
    this.rear = null;
  }
  
  isEmpty() {
    return this.front == null && this.rear == null;
  }
  
  enqueue(data) {
    const newNode = new Node(data);
    if (this.isEmpty()) this.front = newNode;
    else this.rear.next = newNode;
    
    this.rear = newNode;
  }
  
  dequeue() {
    if (this.isEmpty()) return;
    this.front = this.front.next;
    if (!this.front) this.rear == null;
  }
  
  peekFront() {
    if (this.isEmpty()) return null;
    return this.front.data;
  }
}

큐의 시간 복잡도

삽입 : 큐에 들어가 있는 값들이 무수히 많아도 데이터 삽입은 한 번 일어나기 때문에 시간 복잡도는 O(1) 이 됩니다.

삭제 : FIFO 에 따라 삭제 시 첫 번째 데이터(front)가 삭제되므로 큐의 크기에 상관없이 시간 복잡도는 O(1) 이 됩니다.

접근 : 큐의 특성상 한쪽 끝(rear)으로만 자료를 넣고 뺄 때는 첫 번째 데이터(front)가 빠지게 되는 자료구조이므로 데이터 접근 또한 첫 번째 데이터(front)를 통해서만 접근이 가능합니다. 따라서 n번 째 접근은 첫 번째 데이터(front) 부터 순회하기 때문에 O(n)의 시간 복잡도를 가집니다.

탐색 : 데이터를 찾을 때 만약 큐의 첫 번째 데이터(front)를 찾는다면 시간 복잡도는 O(1) 입니다. 하지만 가장 뒤에 있는 데이터(rear)를 찾는다면 데이터의 개수만큼 작업이 발생되므로 O(n)의 시간 복잡도를 가집니다.

시간 복잡도 삽입 삭제 접근 n번째 접근 탐색
큐 O(1) O(1) O(1) O(n) O(n)

큐의 사용 사례

- 자바스크립트 엔진에서 비동기 함수 실행 시 콜백들이 대기열로 들어오는 Task queue 가 대표적입니다.

- 순서대로 처리해야 하는 작업을 임시로 저장해두는 버퍼(buffer) 로서 많이 사용됩니다.

- 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용됩니다.

'컴퓨터 과학 > 자료구조' 카테고리의 다른 글

스택(Stack)  (0) 2022.11.11
ADT 와 Data Structure 의 차이  (0) 2022.11.11
자료구조의 구분  (0) 2022.11.08
'컴퓨터 과학/자료구조' 카테고리의 다른 글
  • 스택(Stack)
  • ADT 와 Data Structure 의 차이
  • 자료구조의 구분
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (102)
      • k8s (2)
      • AWS (1)
      • 리눅스 (5)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    스택
    Kubernetes
    리눅스
    코딩테스트
    반복문
    레벨2
    조인
    도커
    Kubectl
    Python
    redis
    typescript
    자바스크립트
    네트워크
    FastAPI
    기초
    javascript
    Til
    mysql
    IP 주소
    nestjs
    iterable
    생활코딩
    typeorm
    모듈
    프로그래머스
    컨테이너
    django
    Docker
    배열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
큐(Queue)
상단으로

티스토리툴바