본문 바로가기
PHP

[PHP] SplMaxHeap 가장 큰 값이 항상 맨 위에 위치하는 자료구조

by teamnova 2025. 10. 19.
728x90

안녕하세요.

오늘은 가장 큰 값이 항상 맨 위에 위치하는 자료구조인 SplMaxHeap에 대해 알아보겠습니다. 

 

SplMaxHeap

SplMaxHeap은 PHP의 SPL(Standard PHP Library)이 제공하는 자료구조입니다. 
이름에서 알 수 있듯이, 가장 큰(Max) 값이 항상 맨 위(Top)에 위치하도록 보장하는 저장소입니다.

데이터를 추가할 때마다 내부적으로 정렬 상태를 자동으로 유지하기 때문에, 언제든지 가장 큰 값을 즉시 조회하거나 꺼내올 수 있습니다. 
실시간 랭킹이나 우선순위가 가장 높은 작업을 처리할 때 매우 유용합니다.

 

주요 메소드

  • insert(value): 힙에 새로운 값을 추가합니다. 추가하는 즉시 힙 구조가 자동으로 재정렬됩니다.
  • top(): 힙에서 값을 제거하지 않고 가장 큰 값을 확인합니다.
  • extract(): 힙에서 가장 큰 값을 꺼내고(제거하고) 반환합니다.

예제

실시간으로 들어오는 태스크(Task) 중 중요도(priority)가 가장 높은 것을 먼저 처리하는 시스템을 SplMaxHeap으로 구현해 보겠습니다. 
중요도를 배열의 첫 번째 요소로 두면 SplMaxHeap이 알아서 비교해 줍니다.

 

<?php

// SplMaxHeap은 가장 큰 값을 맨 위로 보내는 자료구조입니다.
$taskHeap = new SplMaxHeap();

echo ">> 새로운 작업들을 추가합니다...<br>";
// insert([중요도, 작업내용])
$taskHeap->insert([99, '긴급 서버 패치']);
$taskHeap->insert([50, '사용자 문의 답변']);
$taskHeap->insert([10, '데이터베이스 백업']);
$taskHeap->insert([80, '결제 시스템 점검']);

// top() 으로 현재 가장 중요한 작업을 확인만 할 수 있습니다.
$mostUrgentTask = $taskHeap->top();
echo "현재 가장 중요한 작업(확인만): '{$mostUrgentTask[1]} (중요도: {$mostUrgentTask[0]})'<br><br>";

echo ">> 중요도 순서대로 작업을 처리합니다...<br>";
// extract() 로 가장 중요한 작업부터 하나씩 꺼내서 처리합니다.
while (!$taskHeap->isEmpty()) {
    $task = $taskHeap->extract();
    echo "처리 완료: '{$task[1]} (중요도: {$task[0]})'<br>";
}

?>

 

결과 

insert 순서와 관계없이, extract를 호출하면 중요도가 가장 높은 순서대로 작업이 처리되는 것을 명확하게 확인할 수 있습니다.

>> 새로운 작업들을 추가합니다...
현재 가장 중요한 작업(확인만): '긴급 서버 패치 (중요도: 99)'

>> 중요도 순서대로 작업을 처리합니다...
처리 완료: '긴급 서버 패치 (중요도: 99)'
처리 완료: '결제 시스템 점검 (중요도: 80)'
처리 완료: '사용자 문의 답변 (중요도: 50)'
처리 완료: '데이터베이스 백업 (중요도: 10)'