자료구조&알고리즘

우선순위 큐

CalebHong 2022. 2. 25. 11:47

큐, 스택과 달리 중요도에 따라 먼저 처리하는 방식

 

- 시간에 따른 우선 순위 : 스택, 큐

 

 -시간 외 다른 가치 우선 순위 : 우선 순위 큐 

 ▪ 우선 순위 큐는 스택이나 큐 보다 일반적인 구조

 

- 키의 필요 여부

 ▪ <우선 순위 큐>에서는 키(= 우선 순위 값) 필드가 필요

 ▪ <스택>, <큐>에서는 시간에 따라 자료구조를 조직화하게 되므로 키 필드가 불필요

 

추상 자료형 우선 순위 큐

- 용어

 ▪ Create : 새로운 우선 순위 큐를 만들기

 ▪ Destroy : 사용되던 우선 순위 큐를 파기하기

 ▪ Add : 현재 우선 순위 큐에 새로운 레코드를 삽입하기

 ▪ Remove : 가장 우선 순위가 높은 레코드를 삭제하기

 ▪ IsEmpty : 현재 우선 순위 큐가 비어있는지 확인하기

 

- 우선 순위 큐에서의 삭제(Remove) 작업

 ▪ 어떤 레코드가 우선 순위가 가장 높은지는 큐 자체가 알고 있으므로 호출 함수 쪽에서는 파라미터를 넘길 필요가 없다.

 

우선 순위 큐의 구현

1. 배열을 이용한 구현

1) 정렬된 배열

 ▪ 우선 순위를 기준으로 오름차순으로 정렬

 ▪ 가장 우선 순위가 큰 레코드는 항상 배열의 마지막에 위치

 ▪ 삭제 함수는 마지막 레코드를 리턴, 배열 레코드의 개수를 하나 줄임

 ▪ 이 작업의 시간적 효율은 O(1)

 ▪ 삽입 함수는 일단 키 값을 기준으로 이진 탐색 하는데 O(lgN)

 ▪ 데이터 이동에 O(N)

2) 정렬 안 된 배열

 ▪ 새로운 레코드를 무조건 배열 끝에 붙임

 ▪ 삽입의 효율은 O(1)

 ▪ 삭제의 효율은 O(N). 처음부터 끝까지 찾아야 함

 ▪ 정렬된 배열과 정렬 안 된 배열을 사용할 때의 삽입, 삭제 효율은 서로 뒤바뀐 모습

 ▪ 삭제가 빨라야 한다면 정렬된 배열, 삽입이 빨라야 한다면 정렬 안 된 배열

 ▪ 삽입, 삭제 전체를 감안하면 두 방법 모두 O(N)의 효율

 

2. 연결 리스트를 이용한 구현

1) 우선 순위를 기준으로 내림차순으로 정렬

 ▪ 우선 순위가 가장 높은 레코드를 헤드 포인터가 직접 가리킴

 ▪ 삭제 시간은 O(1)

 ▪ 삽입 함수는 키 값을 기준으로 삽입 위치를 찾아야 함

 ▪ 최악의 경우 마지막 위치. O(N)

 ▪ 배열처럼 이동은 불필요

 ▪ 삭제와 삽입 모두를 감안한 효율은 O(1) + O(N) = O(N)

2) 정렬 안 된 연결 리스트

 ▪ 삽입될 레코드를 가장 첫 노드로 만들면 삽입은 O(1)

 ▪ 삭제를 위해 가장 큰 레코드를 찾는데 O(N)

 ▪ 삭제와 삽입 모두를 감안한 효율은 O(N) + O(1) = O(N)

 

3. 이진 탐색 트리를 이용한 구현

1) 가장 큰 키 값을 지닌 노드

 ▪ 루트로부터 출발해서 RChild를 계속 따라 감

 ▪ 더 이상 RChild가 없으므로 자식이 하나이거나 없는 노드

 ▪ 상대적으로 쉬운 삭제

2) 효율

 ▪ 삭제 함수의 효율은 O(lgN). 루트로부터 리프까지 내려감

 ▪ 삽입 위치를 찾아 리프 노드까지 내려가는데 O(lgN)

 ▪ 효율은 O(lgN) + O(lgN) = O(lgN). 단 균형 트리에 한함

 

4. 구현 방법별 효율 비교

1) 자료구조별 우선 순위 큐의 효율 비교

'자료구조&알고리즘' 카테고리의 다른 글

재귀 호출(Recursion)  (0) 2022.03.03
힙(Heap)과 우선 순위 큐(Priority Queue)  (0) 2022.03.03
큐(Queue)  (0) 2022.02.24
스택의 응용  (0) 2022.02.23
스택의 구현  (0) 2022.02.22