땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • E
  • 이것이 리눅스다 with Rocky Linux9
  • D
  • ㅗ
  • I

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Coding Test(Priority Queue, Heap)
Algorithm/concept

Coding Test(Priority Queue, Heap)

2022. 4. 30. 14:50

우선순위 큐(Priority Queue)

우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조

- list를 이용한 구현

- heap을 이용한 구현

단순히 N개의 데이터를 heap에 넣었다가 모두 깨내는 작업은 정렬과 동일 == Heap Sort =>O(NlogN)

 

Heap

- Max value or Min value을 찾아내는 연산을 빠르게 하기위해 완전 이진 트리를 기본으로한 자료구조

- heap에서는 항상 root node를 제거

 

최소 힙(min heap)

- root node가 가장 작은 값을 가진다

- 값이 작은 데이터가 우선적으로 제거

 최대 힙(max heap)

- root node가 가장 큰 값을 가진다

- 값이 큰 데이터가우선적으로 제거

 

완전 이진 트리(Complete Binary Tree)

root node부터 시작하여 왼쪽 자식 노드, 오른쪽 자식 노드 순서대로 데이터가 차례대로 삽입되는 Tree

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

(상향식) 부모 노드로 거슬러 올라가며,  부모보다 자신의 값이 더 작은 경우에 위치를 교체한다

 

Heap에 새로운 원소가 삽입될 때 ==> O(logN)

Heap에서 원소가 제거될 때 ==> O(logN)

1. 가장 마지막 노드가 root node 위치에 오도록 한다

2. 이후에 root node에서 하향식으로(더 작은 자식 노드로) Heapify()를 진행

 

 

 

 

 

import heapq

#heap에 원소추가
heapq.heappush(list, value)

#가장 작은 원소 삭제 후 값 return
value = heapq.heappop(list)

#list to heap ==> O(logN)
heapq.heapify(list)

 

최소 힙(Min heap)

import heapq

#오름차순 힙 정렬
#최소 힙
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

최대 힙(Max Heap)

음수화 해준 값에 대해 최소힙으로 나타낸 후 pop()과정에서 다시 양수화를 해버리면 그 자체가 최대힙

import heapq

#내림차순 힙 정렬
#최대 힙
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

 

특정 규칙으로 Heap 구조 만들기(최대힙도 적용)

heapq.heappush(heap, (abs(num), num))

print(heapq.heappop(heap)[1])

Heap을 tuple로 구성했을 때 맨 앞 숫자만 가지고 정렬하므로 특정 규칙으로 Heap구조를 만들 함수를 앞에 적어주고

pop을 할 때 본래의 값을 꺼내주려면 tuple의 2번째 항을 pop 해야하기 때문에 heapq.heappop(list)[1]을 해준다

 

 

K번째 Min/Max Value 구하기

import heapq

def kth_smallest(nums, k):
  heap = []
  for num in nums:
    heapq.heappush(heap, num)

  kth_min = None
  for _ in range(k):
    kth_min = heapq.heappop(heap)
  return kth_min

print(kth_smallest([4, 1, 7, 3, 8, 5], 3))

힙 정렬(Heap Sort)

import heapq

def heap_sort(nums):
  heap = []
  for num in nums:
    heapq.heappush(heap, num)

  sorted_nums = []
  while heap:
    sorted_nums.append(heapq.heappop(heap))
  return sorted_nums

print(heap_sort([4, 1, 7, 3, 8, 5]))

 

 

 

 

 

 

참고자료

https://www.youtube.com/watch?v=jfwjyJvbbBI

https://www.youtube.com/watch?v=AjFlp951nz0

 

'Algorithm > concept' 카테고리의 다른 글

Coding Test(Union-Find, Disjoint-set)  (0) 2022.05.22
코딩 테스트를 위한 기술 정리  (0) 2022.05.13
Python - 깊은 복사(Deep Copy)  (0) 2022.01.03
Coding Test(최단 경로 알고리즘)  (0) 2021.12.17
Coding Test(다이나믹 프로그래밍)  (0) 2021.12.16
    'Algorithm/concept' 카테고리의 다른 글
    • Coding Test(Union-Find, Disjoint-set)
    • 코딩 테스트를 위한 기술 정리
    • Python - 깊은 복사(Deep Copy)
    • Coding Test(최단 경로 알고리즘)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바