티스토리 뷰
- 큐(Queue)도 Stack과 같이 단순한 규칙을 가지고 있는 리스트이다.
- 규칙 : FIFO(First In First Out)
- 즉, 먼저 들어간 데이터가 가장 먼저 나온다는 의미로서 먼저 들어간게 가장 나중에 나오는 Stack과는 반대의 개념이다.
- Queue는 운영체제에서도 사용된다.
- 운영체제가 프로세스의 작업 요청을 들어온 순서대로 Queue에 넣고 이를 CPU가 순서대로 꺼내서 처리한다.
- 이를 운영체제에서는 FIFO 스케줄링이라고 한다.
- 일상생활에서 마트 계산대, 놀이공원 줄 등도 모두 Queue의 개념으로 볼 수 있다.
● 연결리스트로 Queue 구현하기
- 연결리스트의 맨 첫 번째 node를 head 라고 했을 때 숫자 1, 2, 3, 4 를 순서대로 연결리스트에 삽입하면 아래와 같다.
- 위와 같은 구조에서 숫자 1이 가장 먼저 나오려면(= 삭제하려면) 어디서부터 노드(데이터)를 제거해야 할까?
- 간단하다. FIFO 구조상 바로 뒤에서부터 데이터를 제거하면 된다.(이것이 Queue의 전부이다.)
- 하지만 항상 말만 간단하지 이것을 구현하려면 여러가지 고려해야할 것이 많다.
- 연결리스트의 맨 첫 번째 node를 head 라고 했을 때 이 개념을 이용한 데이터 삽입은 매우 간단하다.
- 연결리스트의 가장 첫 번째에 원하는 데이터를 넣어주기만 하면 되기 때문이다.
- 즉, 현재의 연결리스트 개념은 앞의 노드가 바로 뒤의 노드를 가리키는 단방향 연결리스트인 것이다.
- 이러한 구조에서는 데이터를 뒤에서부터 제거하기가 힘들다.
why?
- 가장 뒤에있는 노드를 찾기 위해서는 가장 앞에있는 head 부터 시작해서 다음, 그 다음, 그 다음 다음.... 노드를 찾는 식으로 맨 뒤의 노드를 찾아야 하기 때문이다.
- 즉, 삽입은 O(1)이지만 삭제는 O(n)의 성능을 갖는 것이다.(너무 느리다.)
- 그렇다면 가장 마지막 노드(= 가장 먼저 들어간 데이터)의 위치를 담은 tail 변수를 추가하면 되지 않을까라는 해법을 생각해볼 수 있다.
- 그러나 이것도 문제가 된다.
- tail을 이용해 마지막 노드를 삭제한 후 이번에는 마지막 노드 바로 전에 있던 노드를 삭제하고 싶은 경우 이 역시 해당 노드를 찾을 방법이 없기에 위와 동일하게 head 부터 시작해서 다음, 그 다음, 그 다음 다음.... 노드를 찾는 식으로 원하는 노드를 찾아나가야 하기 때문이다.
- 즉, 최초 삭제를 제외하고 동일하게 삽입은 O(1), 삭제는 O(n)의 성능을 갖는 것이다.
- 따라서 현재 노드가 다음 노드 뿐만이 아니라 이전 노드도 가리킬 수 있는 이중 연결리스트로 만들어야 이러한 문제점들을 보완할 수 있다.
- 이중 연결리스트를 이용해 이전 노드를 참조할 수 있다면 tail 변수를 이용해 현재 노드를 제거한 후 그 이전 노드의 위치를 tail에 새로 할당할 수 있다.
※ 정리 : Queue는 연결리스트를 이용해 간단히 구현할 수 있다. 단, 단방향이 아닌 양방향 연결리스트가 필요하다.
'CS > 자료구조 및 알고리즘' 카테고리의 다른 글
#9 버블정렬(Bubble Sort) (0) | 2023.02.23 |
---|---|
#8 해시테이블 - 개념(해시, 해시 함수) / ChatGPT 사용해봄 (1) | 2023.02.20 |
#6 Stack(스택) - 개념(FILO : First In Last Out) (1) | 2023.02.02 |
#5 연결리스트(Linked List) - 개념 with 노드(node) (0) | 2023.01.25 |
#4 배열 (0) | 2023.01.24 |
- Total
- Today
- Yesterday
- SpringBoot
- Phaser
- SQL
- OS
- nosql
- 알고리즘
- Spring Boot
- 프로세스
- 빅데이터
- 코테
- MongoDB
- MySQL
- jpa
- 메모리
- API
- Stream
- Java8
- db
- 프로그래머스
- 코딩테스트
- node.js
- 운영체제
- Phaser3
- 빅데이터 분석기사
- spring
- DART
- Advanced Stream
- 자료구조
- java
- git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |