알고리즘
[ 알고리즘 ] 우선순위 큐 (1) - 배열
Chars4785
2019. 9. 19. 23:57
@ 왜 궁금했는가?
요즘 알고리즘 공부하는데,, 우선순위 큐 문제가 자주 출제 되서 한번 정리하고 싶은 생각에 !!!
@ 공부
우선 순위 큐란?
- 큐 자제가 들어간 순서대로 나오는것인데 우선순위 큐는 값에 따라서 가장 큰 우선순위인 값이 나온다.
예)
일반 큐
(2)-(3)-(4)-(5)
: pop() 하면 2가 나온다.
우선 순위 큐
(2)-(3)-(4)-(5)
: pop() 하면 5가 나온다.
@ 구현
## 배열로 구현
4 5 3 2 1
pop : 5
4 [ ] 3 2 1
앞 공간 채워 줘야 한다.
4 3 2 1
Push: O(1)
Pop: O(n) > 누가 우선 순위가 가장 큰지 확인하고 다 땡겨 주는데 O(2N) 이므로 O(N) 이 됩니다.
- 구현
public class PriorotyQue {
public static void main(String[] args) {
PriorityQueue myQu = new PriorityQueue();
myQu.push(1);
myQu.push(8);
myQu.push(7);
myQu.push(5);
System.out.println(myQu.top()); // 8
myQu.pop();
System.out.println(myQu.top()); // 7
myQu.pop();
System.out.println(myQu.top()); // 5
myQu.pop();
System.out.println(myQu.top()); // 1
//overFlow
//underFlow 는 생략
}
}
class PriorityQueue {
int Max = 100;
int[] data = new int[Max];
int len = 0;
void push(int x) {
data[len++] = x;
}
void pop() {
int myMax = -91292389, myMaxInx = -1;
for (int i = 0; i < len; i++) {
if (data[i] > myMax) {
myMax = data[i];
myMaxInx = i;
} // 가장 큰 값이 어디 있는지 구하기 위해서
}
for (int i = myMaxInx; i < len; i++) {
data[i] = data[i + 1];
} // 다 앞으로 땡겨주고
len--;
}
int top() {
int myMax = -328942;
for (int i = 0; i < len; i++) {
if (data[i] > myMax) {
myMax = data[i];
}
}
return myMax;
}
}
## 배열을 이용한 우선순위 큐의 비효율성
for(int i= 100000 ;i>=1;i--){
myQu.push(i);
}
for(int i=1 ;i <= 100000 ;i++){
myQu.pop();
}
// O(N) 을 100000 번씩 하니까 O(n^2) 만큼 걸린다.
정말 엄청 비효율적
## 트리로 구현