예꾸
개발자국
예꾸
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • CS (6)
      • 데이터베이스 (5)
      • 운영체제 (0)
      • Computer Architecture (1)
    • 끄적끄적 (4)
    • 이론 (29)
      • 알고리즘 (18)
      • 자료구조 (4)
      • WEB (2)
      • JS (2)
      • Git (2)
      • Python (1)
    • 면접준비 (3)
      • Vue (1)
      • Design Pattern (1)
      • Frontend (1)
    • 개발기술 (20)
      • Git PUSH 자동화 (3)
      • VUE (1)
      • Linux (2)
      • MERN Stack (2)
      • React기반 Gatsby로 블로그 개발하기 (6)
      • Typescript (0)
      • 감정일기장(React) (3)
      • CI CD (3)
    • 코드트리 (6)
      • 블로그 챌린지 (3)
      • 모의시험 (3)
    • 취업준비 (3)
      • 코딩테스트 후기 (3)
    • 프로그래머스 (8)
      • SQL (7)
      • 알고리즘 (1)
    • 백준 (31)
      • 그리디(탐욕법) (6)
      • 구현 (5)
      • 그래프탐색(dfs, bfs) (5)
      • 완전탐색 (5)
      • 문자열 (5)
      • 누적합 (2)
      • DP(다이나믹 프로그래밍) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • React
  • 프로그래머스
  • 코드트리
  • gatsby
  • 운영체제
  • 백준 그래프탐색
  • 백준 완전탐색
  • 백준 그리디
  • javascript
  • 코딩테스트실력진단
  • 컴퓨터 시스템의 구조
  • 알고리즘
  • JS
  • 코딩테스트
  • 프로그래머스 SQL
  • 나만의공부노트
  • 코드트리 추천
  • 백준 문자열
  • 자료구조
  • 백준 구현

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
예꾸

개발자국

우선순위 큐와 heap - python
이론/자료구조

우선순위 큐와 heap - python

2021. 5. 28. 20:51

참고 | 이코테2021 | 우선순위 큐

 

우선순위 큐

우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조
  • 우선순위 큐는 데이터를 우선순위에 따라 처리하고 싶을 때 사용
    • ex) 물건 데이터를 자료구조에 넣었다가 가치가 높은 물건부터꺼내서 확인해야 하는 경우

구현 방법

  1. 단순히 리스트 이용해 구현 가능
  2. 힙(heap)을 이용해 구현 가능
  • 데이터가 N개일 때 구현 방식에 따른 시간복잡도
우선순위 큐 구현 방식 삽입 시간 삭제시간
리스트 O(1) O(N)
힙(Heap) O(logN) O(logN)
  • 단순히 N개의 데이터를 힙에 넣었다가 모두 꺼내는 작업은 정렬과 동일(힙 정렬)
    • 이 경우 시간 복잡도는 O(NlogN)

 

힙의 특징

최소힙 최대힙

  • 힙은 완전 이진 트리 자료구조의 일종
  • 힙에서는 항상 루트 노드를 제거한다
  • 최소 힙(mini heap)
    • 루트 노드가 가장 작은 값을 가짐
    • 따라서 값이 작은 데이터가 우선적으로 제거됨
  • 최대 힙(max heap)
    • 루트 노드가 가장 큰 값을 가짐
    • 따라서 값이 큰 데이터가 우선적으로 제거된다

 

완전이진 트리(Complete Binary Tree)

  • 완전 이진 트리란 루트 노드부터 시작해 왼쪽 자식 노드, 오른쪽 자식 노드 순서대로 데이터가 차례대로 삽입되는 트리를 의미

최소 힙 구성 함수 : Min-Heapify()

  • 힙을 구성하기위한 함수의 이름을 보통 Heapify라고 부름
  • (상향식) 부모 노드로 거슬러 올라가며, 부모보다 자신의 값이 더 작은 경우 위치를 교체
  • 부모노드가 자식노드보다 크므로 값을 교환

 

힙에 새로운 원소가 삽입될 때

  • 새로운 원소가 삽입되었을 때 O(logN)의 시간복잡도로 힙 성질을 유지하도록 할 수 있음

 

힙에서 원소가 제거될 때

  • 원소가 제거되었을 때 O(logN)의 시간 복잡도로 힙 성질 유지하도록 할 수 있음
    • 원소를 제거할 때는 가장 마지막 노드가 루트 노드의 위치에 오도록함
      2삭제 후 마지막 노드인 9를 루트 노드에 넣기
       
    •  
    • 이후에 루트 노드에서부터 하향식으로 더 작은 자식노드로 Heapify()를 진행

 

코드 구현

  • 파이썬은 디폴트로 heap정렬 오름차순(Min-heapify)으로 정렬

최소 힙 : Min-heapify

import sys
import heapq
input = sys.stdin.readline
# 입력값
# 5
# 6
# 3
# 1
# 2
# 4

# 결과값 : 1 2 3 4 6

def heapsort(iterable):
    h = []
    result = []
    #모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, value)
    
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(heapq.heappop(h))
    return result

n = int(input())
arr = []

for i in range(n):
    arr.append(int(input()))

res = heapsort(arr)

for i in range(n):
    print(res[i], end=' ')

 

최대 힙 : Max-heapify

  • Min-heapify에서 value에 -만 넣어주면 된다
import sys
import heapq
input = sys.stdin.readline

def heapsort(iterable):
    h = []
    result = []
    #모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, -value)
    
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(heapq.heappop(h))
    return result

n = int(input())
arr = []

for i in range(n):
    arr.append(int(input()))

res = heapsort(arr)

for i in range(n):
    print(-res[i], end=' ')

 

 

    '이론/자료구조' 카테고리의 다른 글
    • 스택(Stack) - JS
    • 배열 - JS
    • 연결리스트-JS
    예꾸
    예꾸
    비전공자 옒의 개발이야기💻

    티스토리툴바