21-02-24 알고리즘 기초강의
최적 이진검색트리
주어진 n개의 키로 최적 이진검색트리를 구하는 문제
→ 주어진 n개의 키: K1, K2…, Kn
→ 각 키의 검색 확률 pi: 전체 검색횟수 중에서 Ki를 검색하는 확률
→ 각 키의 비교 횟수 ci: Ki를 검색하는데 필요한 키의 비교 횟수
→ 각 키의 평균 검색 시간: 검색 확률 * 비교 횟수 (pi* ci)
→ 전체 키의 평균 검색 시간: pi* ci의 총 합(n ~ i=1)Dynamic Programming 방식으로 접근하기
- 재귀 관계식을 찾는다
- A: 이진검색트리를 만드는데 최적 검색비용의 행렬
- A[i][j]: K
i에서 Kj까지 이진검색트리를 만드는데 최적 검색 비용 - K
i… Kj를 (Ki… Kk-1)Kk(Kk+1… Kj)로 분할하는 재귀 관계식 찾기
- 상향식 방법으로 해답을 구하기
- A[i][i] = p
i - 대각선의 상향식 계산으로 A[1][n]을 구함
- 최적 이진검색트리의 재귀관계식
- 트리 k: 키 K
k가 루트 노드에 있는 최적 이진검색트리 - 키 비교 횟수: 서브 트리의 비교 횟수에 루트에서 비교 한 번 추가
- m ≠ k 인 K
m에 대해서 트리 k에 Km을 놓기 위한 비교 한 번 추가
→ A[1][n] = minimum(A[1][k-1]+A[k+1][n] + ∑(n ∼ m=1)Pm) (단, i ≤ k ≤ j)
파이썬으로 최적 이진검색트리
1 | def optsearchtree (p): |
참고: 연쇄 행렬 곱셈 알고리즘
최적 이진검색트리의 노드 순서 구하기
1 | def tree (R, i, j): |
자바스크립트로 최적 이진검색트리의 노드 순서 구하기(수정 중)
1 | const optsearchtree = p => { |