이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Data Structure] 우선순위 큐(Priority Queue) & 힙(Heap)

  • 2022.08.17 02:20
  • Algorithm/Data Structure
글 작성자: SeoArc

우선순위 큐(Priority Queue)

우선순위 큐(Priority Queue)는 우선순위가 높은 데이터가 먼저 나가는 형태의 자료구조이다.

우선순위 큐의 요소는 모두 우선순위를 가지고 있으며, 우선순위가 같은 경우에는 큐의 순서에 따라 처리한다.

 

우선순위 큐는 여러 방식으로 구현할 수 있지만 힙(heap)이 가장 효율을 보이기 때문에 일반적으로 힙을 이용하여 구현한다.

방식 시간 복잡도
배열 O(N)
연결 리스트 O(N)
힙 O(logN)

 

힙(heap)

힙의 특징

  • 완전이진트리 형태로 이루어져 있다.
  • 부모노드는 자식노드 사이에 대소관계를 가지고 있다.
  • 중복된 키를 허용한다.

 

힙의 종류

  • 최대 힙(max heap): 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 힙
  • 최소 힙(min heap): 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 힙

 

힙 구현

최대 힙(max heap)

class MaxHeap(object):
	
    def __init__(self):
    	self.queue = []
       
    def insert(self, n):
    	self.queue.append(n)
        last_index = len(self.queue) - 1
        while 0 <= last_index:
        	parent_index = self.parent(last_index)
            if 0 <= parent_index and self.queue[parent_index] < self.queue[last_index]:
            	self.swap(last_index, parent_index)
                last_index = parent_index
            else:
            	break
    
    def delete(self):
    	last_index = len(self.queue) - 1
        if last_index < 0:
        	return -1
        self.swap(0, last_index)
        maxv = self.queue.pop()
        self.maxHeapify(0)
        print(maxv)
        return maxv
    
    def maxHeapify(self, i):
    	left_index = self.leftchild(i)
        right_index = self.rightchild(i)
        max_index = i
        
        if left_index <= len(self.queue) - 1 and self.queue[max_index] < self.queue[left_index]:
        	max_index = left_index
        if right_index <= len(self.queue) - 1 and self.queue[max_index] < self.queue[right_index]:
        	max_index = right_index
        
        if max_index != i:
        	self.swap(i, max_index)
            self.maxHeapify(max_index)
    
    def swap(self, i, parent_index):
    	self.queue[i], self.queue[parent_index] = self.queue[parent_index], self.queue[i]
    
    def parent(self, index):
    	return (index - 1) // 2
    
    def leftchild(self, index):
    	return index * 2 + 1
    
    def rightchild(self, index):
    	return index * 2 + 2
    
    def printHeap(self):
    	print(self.queue)

코드 출처: https://daimhada.tistory.com/108

 

파이썬은 heapq 내장 라이브러리를 제공하여 손쉽게 heap을 사용할 수 있다.

import heapq

heap = []
heapq.heappush(heap, 50)
heapq.heappush(heap, 10)
heapq.heappush(heap, 20)

print(heap) # [10, 50, 20]
  • heapq.heappush(heap, object): heap에 object를 추가한다.
  • heapq.heappop(heap): heap에서 가장 작은 원소를 pop한다.
  • heapq.heapify(list): list를 heap으로 변환시킨다.

heapq 모듈은 최소 힙으로 구현되어 있다. 따라서 최대 힙을 구현하기 위해서는 부호를 활용하는 등의 트릭을 써야 한다.

'Algorithm > Data Structure' 카테고리의 다른 글

[Algorithm] 펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)  (0) 2023.04.07
[Data Structure] 트라이 트리(Trie Tree)  (0) 2023.03.19
[Data Structure] 최소 신장 트리(MST, Minimum Spanning Tree)  (0) 2023.02.14
[Data Structure] 세그먼트 트리(Segment Tree)  (0) 2022.09.08
[Data Structure] 이진 탐색 트리(Binary Search Tree)  (0) 2022.08.17

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Data Structure] 트라이 트리(Trie Tree)

    [Data Structure] 트라이 트리(Trie Tree)

    2023.03.19
  • [Data Structure] 최소 신장 트리(MST, Minimum Spanning Tree)

    [Data Structure] 최소 신장 트리(MST, Minimum Spanning Tree)

    2023.02.14
  • [Data Structure] 세그먼트 트리(Segment Tree)

    [Data Structure] 세그먼트 트리(Segment Tree)

    2022.09.08
  • [Data Structure] 이진 탐색 트리(Binary Search Tree)

    [Data Structure] 이진 탐색 트리(Binary Search Tree)

    2022.08.17
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (108)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (5)
      • Spring (3)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • graph
  • algorithm
  • 네트워크
  • 그래프
  • java
  • 알고리즘
  • network
  • 자바

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바