알고리즘 문제 풀이/알고리즘 이론 공부

4장 Greedy Algorithm

2023. 7. 30. 16:23
목차
  1. Minimum spanning Tree 문제 = 최소 비용 신장트리
  2. Prim’s greedy MST
  3. Kruskal ‘s greedy MST = edge가중치를 정렬하여 가장 작은 값 포함시키기
  4. Dijkstra 알고리즘 shortest path, single → many destination
  5. Huffman Code Tree
  6. 0-1 knapsack problem을 통한 greedy, DP 비교

chap4 Greedy algorithm design pattern

=과거 미래에 상관없이 현재 순간에 최선을 고르는 방식. = local optimal 해결책임 , global optimal solution이 아닐 수 있음.

greedy 알고리즘의 반복순서

  1. selection step = solution set에 들어갈 현재의 최선을 선택함
  2. feasibility check = 타당한지 확인함(가능한지)
  3. solution checking step = 새로운 solution set이 문제를 만족하는 해답인지 확인.
    • global optimal solution을 얻기 위해 local optimal을 선택하는 과정

Minimum spanning Tree 문제 = 최소 비용 신장트리

  1. Select an edge
  2. Cycle 없는지 check
  3. 다 연결하고 문제 없는 spanning tree인지 확인.(만든 tree의 node수가 전체 node수와 같으면 종료)
  • MST문제는 Prim와 Kruskal 알고리즘 2가지 방식이 있음.

Prim’s greedy MST

  1. vertex(시작지점)을 골라주고,
  2. 가장 가까운 vertex 선택
  3. cycle이 아니면 통과하고 vertex를 리스트에 포함시킴. + adjacency matrix 값 변경
  4. 2~3 반복하다가 vertex 개수 확인 후 같으면 종료
  • adjacency matrix를 만들어 관리.
  • time complextiy = N^2 ,basic op = comparison

Kruskal ‘s greedy MST = edge가중치를 정렬하여 가장 작은 값 포함시키기

  1. edge weight가 가장 작은 edge 선택
  2. 선택한 edge가 cycle 생성하는지 체크
  3. 완성되면 반복 종료
  • basic op = comparison = mergesort를 사용하여 edge를 정렬(mlogm)하는 과정
  • worst case인 경우 n^2 logn 까지 나오기도 함.
  • best case 는 nlogn까지도 나옴.
  • average case = mlogm 인데, n-1≤ m ≤n(n-1)/2임 m = number of edges n = number of vertices , 즉 그래프 형태에 따라 complexity가 달라짐 edge가 많을 수록 더 느려진다는 문제점

Dijkstra 알고리즘 shortest path, single → many destination

  • DP의 floyd 알고리즘을 사용하면 many → many가 n^3에 걸쳐 가능했다.(graph방식)
  • 그래서 greedy 방식인 Dijkstra 알고리즘을 사용하겠다.(spanning tree방식)
  1. select new vertex
  2. vertex를 완료 리스트에 포함
  3. vertex개수 비교로 반복종료
  • adjacency matrix사용
  • basic OP = comparison T(n) = n^2 = code word 를 binary code로 효율좋게 정리하는 방식

Huffman Code Tree

fixed

  • length binary code 방식은 문자 개수만큼 비트를 할당해주는 비효율적인 방식으로 character하나당 log_2(n) 만큼의 bit가 필요함
  • 비효율적이라 아래방식 사용함.

variable

  • length binary code는 빈도수를 확인해 문자마다 구분 가능한 가장 효율적인 bit를 부여함. = optimal binary code problem
  1. n개의 값들을(character들을) 빈도수에 따라 정렬한 후(min heap 구현) 가장 작은 값 2개를 merge한다.
  2. single tree 가 될때까지 반복한다.
  • 유용성 계산은 bit 수 *확률을 모두 더하면 된다.
  • fixed -그 값/ fixed *100 을 하면 reduction of bit의 퍼센트를 얻을 수 있음 = ex) Huffman’s encoding은 25% less memory than its fixed-length code 라고 답을 적음

0-1 knapsack problem을 통한 greedy, DP 비교

  1. Trial and Error solution 모든 경우를 다 해보면 2^n complexity 필요
  2. greedy algorithm solution
    • price/weight 값으로 정렬한 후 .가장 적당한거 선택.
    • 그냥 price 높은 순서대로 weight가 넘치지 않게 선택.
  • 하는 두가지 greedy 풀이 경우가 있는데 상황에 따라 optimal 값이 다르더라 = greedy 방식으로 풀 수 없는 문제이다.
  1. DP solution
    • DP 표를 만든다.
    image
  • 그러면 optimal 값을 얻어낼 수는 있지만, n*n!이라는 time complexity를 가진다. 이를 줄이기 위해서 modified 방식이 있는데, 모든 entry를 구할 필요는 없다는 생각에서 나옴. 위 표는 꽉차있지만 오른쪽 아래로 가는 대각선으로 선을 긋고 선이 지나는 중간 부분을 제외한 아래 부분은 필요없지 않냐는 생각
  • =2^n의 time complexity의 worst case 결과를 가지더라.
  • 그래서 나온게
  • Memory Function = hybrid of Divde and conquer and DP

= 둘의 장점을 함쳐서 오직 필요한 sub problem만 계산하도록 해보자

  • DP는 unnecessary sub problem을 계산하지 않도록 주의해야한다.는 개념.

'알고리즘 문제 풀이 > 알고리즘 이론 공부' 카테고리의 다른 글

6장 Branch and bound Algorithm  (0) 2023.07.30
5장 Backtracking Algorithm  (0) 2023.07.30
3장 Dynamic Programming  (1) 2023.07.30
2장 Divide and conquer  (0) 2023.07.30
1장 algorithm efficiency  (0) 2023.07.30
  1. Minimum spanning Tree 문제 = 최소 비용 신장트리
  2. Prim’s greedy MST
  3. Kruskal ‘s greedy MST = edge가중치를 정렬하여 가장 작은 값 포함시키기
  4. Dijkstra 알고리즘 shortest path, single → many destination
  5. Huffman Code Tree
  6. 0-1 knapsack problem을 통한 greedy, DP 비교
'알고리즘 문제 풀이/알고리즘 이론 공부' 카테고리의 다른 글
  • 6장 Branch and bound Algorithm
  • 5장 Backtracking Algorithm
  • 3장 Dynamic Programming
  • 2장 Divide and conquer
잘잔디
잘잔디
4학년이 되고 취업 준비를 위해 2023-01-01부터 공부한 내용을 정리한 블로그입니다.
잘잔디
MBCS 공부일지
잘잔디
전체
오늘
어제
  • 분류 전체보기 (217)
    • 파이썬 (28)
      • 파이썬 이론 (8)
      • NumPy (3)
      • Pandas (6)
      • 파이썬 시각화 (8)
      • 응용 (2)
    • Java (3)
    • Back (38)
      • DataBase이론 (12)
      • MySQL (2)
      • JSP (8)
      • JSTL (2)
      • Spring (0)
      • Django (8)
      • MongoDB (6)
      • FastAPI (0)
    • Front (8)
      • HTML (3)
      • CSS (2)
      • JS (1)
    • 회고록 (10)
    • 알고리즘 문제 풀이 (95)
      • 알고리즘 이론 공부 (14)
      • 프로그래머스 (69)
      • 백준 (12)
    • 머신러닝 (0)
    • 딥러닝 (0)
    • Git (3)
    • R 프로그래밍 (3)
    • 빅데이터 관리 (16)
      • 리눅스 (4)
      • Hadoop (12)
    • AWS (2)
    • 일상 (10)
      • 책 리뷰 (5)
      • TOEIC (2)
      • 자잘하게 공부한 것들 (2)
    • 사이버보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • CSS
  • JS
  • Encore
  • HTML
  • git
  • db
  • 백준
  • 객체지향
  • Java
  • playdata
  • Database
  • web
  • OOP
  • 독산역
  • 즐거웠다
  • 이중우선순위 큐
  • 골드
  • backend
  • JavaScript

최근 댓글

최근 글

hELLO · Designed By 정상우.
잘잔디
4장 Greedy Algorithm
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.