새소식

컴퓨터공학 💻/자료구조

[자료구조] 우선순위 큐 응용 : 힙 정렬(heap sort), 머신 스케줄링(Machine Scheduling)

  • -

우선순위 큐에 대하여 배워보았으니 이제 우선순위 큐를 어디에 사용하고 어떻게 응용하는 지에 대하여 알아보겠습니다. 

 

힙 정렬(heap sort)

힙 정렬(heap sort)은 히프를 사용하는 정렬 알고리즘입니다.

먼저 정렬할 요소들을 최대 히프에 삽입하고 히프에서 하나씩 요소를 삭제하여 저장하면 정렬이 되는 방식입니다.

힙 정렬이 가장 유용한 경우는 가장 큰 값이 몇 개만 필요한 경우입니다.

 

힙 정렬 알고리즘

void heap_sort(element a[], int n)
{
	int i;
	HeapType* h;

	h = create(); // 히프 생성
	init(h); 
	for (i = 0; i < n; i++) {
		insert_max_heap(h, a[i]); // 최대 히프로 삽입
	}
	for (i = (n - 1); i >= 0; i--) {
		a[i] = delete_max_heap(h); // 최대 히프에서 삭제한 값을 오름차순으로 저장
	}
	free(h);
}

int main(void)
{
	element list[8] = { 23, 56, 11, 9, 56, 99, 27, 34 };
	heap_sort(list, 8);
	for (int i = 0; i < 8; i++) {
		printf("%d ", list[i].key);
	}
	printf("\n");
	return 0;
}
// 9 11 23 27 34 56 56 99

최대 히프에서의 삽입과 삭제 연산은 아래 포스팅에 자세히 설명되어 있으니 참고하시기 바랍니다.

 

[자료구조] 우선순위 큐 (priority queue), 히프의 삽입과 삭제

우선순위 큐 (priority queue) 우선순위 큐는 우선순위를 가진 항목들을 저장하는 큐입니다. 일반적으로 큐는 선입선출(FIFO)기반의 자료구조로 알려져있는데 우선순위 큐는 우선순위가 높은 데이터

yjg-lab.tistory.com

 

 

 

머신 스케줄링 (Machine Scheduling)

만약 어떤 작업을 처리하는 기계가 m개 존재하고 처리할 작업이 n개 존재한다고 합시다. 이 m개의 기계들로 최소의 시간안에 작업들을 모두 끝내야만 합니다. 이 문제에 대해 최적의 해를 구하는 것은 매우 어렵지만 근사 해는 우선순위 큐를 활용하여 쉽게 찾을 수 있습니다.

 

그러한 방법 중 하나가 가장 긴 작업을 우선적으로 기계에 할당하는 LPT(Longest Processing Time first)방식입니다.

 

LPT(Longest Processing Time first)

맨 위의 표 J1 ~ J7은 각 작업의 기계 사용 시간입니다.

최소 히프는 모든 기계의 종료시간을 저장하고 있습니다. 작업 전 초기에는 모든 기계의 종료시간이 0이며, 히프에서 최소 종료시간을 가지는 기계를 삭제하여 작업을 할당합니다. 그리고 선택된 기계의 종료시간을 업데이트하여 다시 히프에 저장합니다.

 

#define JOBS 7
#define MACHINES 3
int main(void)
{
	int jobs[JOBS] = { 8, 7, 6, 5, 3, 2, 1 }; // 작업은 정렬되어 있다고 가정
	element m = { 0, 0 }; // m.id , m.avail
	HeapType* h;
	h = create();
	init(h);
	// avail 값은 기계가 사용 가능하게 되는 시간
	for (int i = 0; i < MACHINES; i++) {
		m.id = i + 1;
		m.avail = 0;
		insert_min_heap(h, m);
	}
	for (int i = 0; i < JOBS; i++) {
		m = delete_min_heap(h);
		printf("JOB %d을 시간=%d부터 시간=%d까지 기계 %d번에 할당합니다.\n",
			i, m.avail, m.avail + jobs[i] - 1, m.id);
		m.avail += jobs[i];
		insert_min_heap(h, m);
	}
	return 0;
}
/*
JOB 0을 시간=0부터 시간=7까지 기계 1번에 할당합니다.
JOB 1을 시간=0부터 시간=6까지 기계 2번에 할당합니다.
JOB 2을 시간=0부터 시간=5까지 기계 3번에 할당합니다.
JOB 3을 시간=6부터 시간=10까지 기계 3번에 할당합니다.
JOB 4을 시간=7부터 시간=9까지 기계 2번에 할당합니다.
JOB 5을 시간=8부터 시간=9까지 기계 1번에 할당합니다.
JOB 6을 시간=10부터 시간=10까지 기계 2번에 할당합니다.
*/

최소 히프에서 기계를 꺼내서 작업을 할당하고 사용가능 시간을 증가 시킨 후에 다시 최소 히프에 추가합니다.

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.