이진 탐색 트리와 순회(BSTs and traversals)
이진 탐색 트리와 순회(BSTs and traversals)
오프닝: BST(Binary Search Tree, binärer Suchbaum)는 '정렬된 숫자 그림'이 아니라, 한 번 비교할 때마다 한쪽 subtree(Teilbaum) 전체를 버리게 해 주는 약속입니다. 예를 들어 70을 찾는데 root가 50이면 50 이하가 모인 왼쪽은 볼 필요가 없습니다. 오른쪽으로 가서 80을 만나면 이번에는 80보다 큰 쪽을 버리고 왼쪽으로 갑니다. 그래서 좋은 BST에서는 search가 빠르지만, tree가 한 줄 chain처럼 망가지면 linked list처럼 느려집니다.
선수 지식: tree(Baum)는 node(Knoten)들이 parent-child 관계로 연결된 구조입니다. 시작점은 root(Wurzel), child가 없는 node는 leaf(Blatt), 어떤 node 아래에 매달린 전체 부분은 subtree(Teilbaum)입니다. depth(Tiefe)는 root에서 현재 node까지 내려간 거리이고, height(Höhe)는 현재 node 또는 tree에서 가장 깊은 leaf까지 내려가는 최대 거리입니다. Lecture 03은 empty tree의 height를 -1로 둡니다. Binary tree(binärer Baum)는 각 node가 left child와 right child를 각각 최대 하나씩 가지는 tree입니다.
1단계 핵심 정의: BST는 binary tree에 ordering invariant를 붙인 것입니다. 이 페이지에서는 Sheet05 삽입 예시와 맞추어 모든 node v에 대해 left subtree의 모든 \(\text{key} \le v.\text{key} < \text{right} \text{subtree}\)key ≤ v.key < right subtree의 모든 key 라는 duplicate convention을 씁니다. 단, Lecture 03의 일반 표기는 오른쪽 subtree에 >=를 허용하는 형태이므로, 시험에서는 duplicate가 어느 쪽으로 가는 convention인지 먼저 말해야 합니다. 중요한 말은 subtree-wide입니다. 바로 왼쪽 child 하나만 작다고 충분한 것이 아니라, 왼쪽 subtree 안의 모든 descendant가 ancestor가 만든 upper bound를 지켜야 합니다.
2단계 search mental model: BST search는 root에서 시작해서 key를 비교하고 딱 한 방향만 고릅니다. \(k \le \text{current}.\text{key}\)k ≤ current.key이면 왼쪽, \(k > \text{current}.\text{key}\)k > current.key이면 오른쪽으로 갑니다. 반대쪽 subtree 전체는 후보에서 사라집니다. 그래서 search path는 한 줄입니다. 하지만 Sheet05 G5 같은 path 검증 문제에서는 바로 이전 node만 보지 말고, root부터 내려오며 생긴 lower bound와 upper bound를 계속 들고 가야 합니다. 오른쪽으로 내려가면 lower bound가 올라가고, 왼쪽으로 내려가면 upper bound가 내려갑니다.
3단계 traversal mental model: traversal(Traversierung)은 tree 모양을 바꾸는 연산이 아니라, 같은 tree를 어떤 순서로 읽을지 정하는 규칙입니다. Preorder는 root-left-right라서 root first, inorder는 left-root-right라서 root middle, postorder는 left-right-root라서 root last입니다. BST에서 inorder가 sorted order를 주는 이유는 traversal 규칙 하나 때문이 아니라 BST invariant와 결합되기 때문입니다. Lecture 03은 서로 다른 binary tree가 같은 inorder 또는 preorder를 가질 수 있음을 보여 주므로, traversal 하나만으로 shape를 항상 복원할 수 있다고 말하면 안 됩니다.
4단계 update 연산: insert는 실패한 search가 nil에 도착한 자리에 새 node를 붙입니다. delete는 leaf 삭제, one-child bypass, two-child replacement로 나눕니다. 두 child가 있으면 아무 leaf나 올리는 것이 아니라 \(\text{successor} = \min(\text{right} \text{subtree})\)successor = min(right subtree)또는 \(\text{predecessor} = \max(\text{left} \text{subtree})\)predecessor = max(left subtree)를 써서 BST invariant를 보존합니다. Sheet05 G4(c)는 15, 70, 80 삭제를 통해 이 case 구분을 연습시킵니다.
5단계 runtime: traversal은 모든 node를 한 번씩 방문하므로 \(\Theta(n)\)Θ(n)입니다. BST search, insert, delete는 한 root-to-leaf path를 따라가므로 \(O(h)\)O(h)입니다. h가 \(\Theta(\log n)\)Θ(log n)이면 \(O(\log n)\)O(log n)이지만, plain BST는 자동으로 balanced가 아닙니다. 정렬된 입력을 계속 넣으면 \(h = \Theta(n)\)h = Θ(n)이 되어 search/insert/delete가 \(O(n)\)O(n)이 될 수 있습니다. Sheet05 G6(b)의 BST-sort best case \(O(n \log n)\)O(n log n)과 \(\text{worst} \text{case} \Theta(n^{2})\)worst case Θ(n²)는 이 height 차이에서 나옵니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
점근 표기(Asymptotic notation)
점근 표기(Asymptotic notation)
Asymptotic notation(Landau-Notation)은 실제 초 단위 시간이 아니라 입력 크기 n이 충분히 커졌을 때 Laufzeit이 어떤 성장급(Wachstumsklasse)에 속하는지 말하는 언어입니다. 작은 n에서의 우연한 교차, 상수배, 낮은 차수항을 버리고 dominant term을 찾은 뒤, O, Omega, Theta, o 중 문제의 방향에 맞는 가장 제한적인 표기(restriktivste Notation)를 고르는 것이 핵심입니다. Sheet02와 2025 기억 프로토콜은 함수 단순화, 부등식으로 주어진 upper/lower bound, 그리고 중첩 루프의 \(\Theta(n \log n)\)Θ(n log n) 함정을 반복해서 묻습니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
루프 불변식과 정확성 증명
Loop invariants and correctness
Loop invariant(Schleifeninvariante)는 loop의 같은 시점에서 반복해서 참이어야 하는 상태 문장입니다. AUD에서는 보통 각 반복 직전의 상태를 잡고, Initialization, Maintenance/Fortsetzung, Termination/Terminierung 세 의무로 partial correctness를 보입니다. Vorlesung/01Introduction.pdf는 algorithm characteristic로 Korrektheit와 Terminierung을 구분하고, Sheet01은 insertion sort와 invariant proof를 연습시킵니다. 정렬 proof에서는 sorted만 말하면 약합니다. 원래 원소를 잃지 않았다는 permutation 또는 multiset preservation까지 같이 말해야 postcondition(Nachbedingung)이 됩니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
점화식과 마스터 정리
Recurrences and Master theorem
Recurrence(Rekurrenz)는 recursive algorithm의 실행 시간 T(n)을 더 작은 입력의 실행 시간으로 다시 쓰는 식입니다. Master theorem(Mastertheorem)은 \(T(n)=a\,T(n/b)+f(n)\)T(n)=aT(n/b)+f(n)꼴에서 recursion tree의 leaf 쪽 기준 \(n^{\log_{b} a}\)n^(log_b a)와 현재 level의 바깥 작업 f(n)을 비교해 tight bound를 빠르게 고르는 규칙입니다. 시험에서는 case 번호를 외우기보다 pseudocode에서 a, b, f(n)을 읽고, baseline을 계산하고, f(n)과 baseline 사이에 polynomial gap이 있는지 말해야 합니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
정렬과 비교 기반 하한
Sorting and lower bounds
정렬(sorting, Sortieren)은 단순히 숫자를 예쁘게 나열하는 문제가 아니라, 알고리즘이 입력에 대해 어떤 정보를 얻을 수 있는지 묻는 모델 문제입니다. 비교 기반 정렬(comparison-based sorting)은 두 원소를 비교한 yes/no 결과만으로 순서를 알아냅니다. 그래서 한 번의 비교는 가능한 세계를 최대 두 갈래로만 줄입니다. 서로 다른 n개 key의 가능한 입력 순열은 n!개이므로, 올바른 비교 기반 정렬은 worst case에서 그 많은 경우를 구분할 만큼의 비교를 해야 합니다. 그 결론이 \(m \ge \log_{2}(n!) = \Omega(n \log n)\)m ≥ log2(n!) = Ω(n log n)입니다. 이 문장은 RadixSort나 CountingSort처럼 digit, bucket, key range를 직접 쓰는 알고리즘에는 그대로 적용되지 않습니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
AVL 트리와 레드-블랙 트리
AVL 트리와 레드-블랙 트리
AVL tree와 red-black tree는 plain BST가 한 줄짜리 chain으로 망가지는 문제를 막는 balanced search tree입니다. 둘 다 먼저 BST order invariant를 만족해야 하고, 그 위에 height를 작게 유지하는 balance invariant를 추가합니다. AVL은 각 node의 왼쪽과 오른쪽 subtree 높이 차이를 최대 1로 제한합니다. 삽입이나 삭제 뒤 이 조건이 깨지면 rotation으로 국소적으로 모양을 고칩니다. Red-black tree는 색 규칙과 black-height 조건으로 height가 \(O(\log n)\)O(log n)을 넘지 않게 제한합니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
B-트리(B-tree)
B-트리(B-tree)
B-tree(B-Baum)는 한 node(Knoten)에 여러 sorted keys와 여러 child pointers를 넣어 height를 낮추는 balanced multiway search tree입니다. BST처럼 한 비교마다 왼쪽/오른쪽 둘 중 하나만 고르는 구조가 아니라, node 안 key들이 separator가 되어 여러 child interval 중 하나를 고릅니다. 강의의 핵심 동기는 block access입니다. disk/page/block 단위로 데이터를 읽는 상황에서는 node 하나를 조금 크게 읽더라도 내려가는 level 수를 줄이는 편이 유리합니다. 그래서 B-tree 답안은 항상 node capacity, child interval, equal leaf height, split-before-descent insertion, delete-before-descent repair를 함께 말해야 합니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
해싱·스킵 리스트·블룸 필터
Hashing, skip lists, Bloom filters
Hash table(Hashtabelle)은 key를 hash function h로 bucket index에 보내 exact dictionary operation을 빠르게 하려는 구조입니다. Skip list(Skip-Liste)는 정렬 linked list 위에 random shortcut levels를 쌓아 ordered search를 빠르게 합니다. Bloom filter(Bloom-Filter)는 실제 값을 저장하지 않고 bit array evidence만 저장하는 approximate membership filter입니다. 따라서 세 구조 모두 lookup과 관련 있지만 guarantee가 다릅니다: hash table은 exact storage, skip list는 ordered exact structure, Bloom filter는 memory-saving probabilistic filter입니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
문자열 매칭
String matching
String matching은 긴 text T 안에서 짧은 pattern P가 시작되는 모든 shift(Verschiebung)를 찾는 문제입니다. 핵심은 '문자열이 비슷해 보인다'가 아니라, 각 shift sft에 대해 모든 j에서 \(T[\text{sft}+j]=P[j]\)T[sft+j]=P[j]인지 확인하는 것입니다. Sheet07은 이 정의, NaiveStringMatching의 invariant와 Laufzeit, Rabin-Karp의 rolling hash와 false hit를 직접 다룹니다. Sheet09는 finite automaton(FSMMatching)에서 state st가 현재 shift가 아니라 지금까지 읽은 text suffix와 pattern prefix가 맞는 최대 길이라는 점을 묻습니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
그래프 순회: BFS, DFS, SCC
그래프 순회: BFS, DFS, SCC
이 장은 그래프(Graph)를 처음 보는 학생이 BFS, DFS, topological sort, SCC를 한 번에 연결해서 말할 수 있게 만드는 첫 강의입니다. 핵심은 하나입니다. 그래프에서는 '어디에서 어디로 갈 수 있는가(reachability)'를 묻고, BFS와 DFS는 그 질문을 서로 다른 순서로 탐색합니다. BFS는 가까운 층부터 queue로 넓게 보고, DFS는 recursion/stack으로 깊게 들어갔다가 되돌아옵니다. Topological sort는 DFS finish time을 DAG 위의 선후관계 순서로 바꾸는 응용이고, SCC는 directed graph에서 서로 왕복 가능한 정점들을 최대 묶음으로 압축하는 응용입니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
최소 신장 트리와 최단 경로
최소 신장 트리와 최단 경로
MST(minimum spanning tree, minimaler Spannbaum)와 shortest paths(kürzeste Wege)는 둘 다 weighted graph를 보지만 질문이 다릅니다. MST는 source 없이 모든 vertex를 하나의 tree로 연결하면서 total edge weight를 최소화합니다. Shortest path는 source s에서 각 vertex v까지의 path weight를 최소화합니다. 그래서 Kruskal과 Prim은 '어떤 edge를 골라 전체 연결망을 만들까?'를 묻고, Dijkstra와 Bellman-Ford는 's에서 v까지 지금 알려진 거리 dist[v]를 더 줄일 수 있을까?'를 묻습니다. 이 차이를 놓치면 MST를 shortest-path tree로 착각하거나, Prim의 key[v]와 Dijkstra의 dist[v]를 섞는 시험 함정에 바로 걸립니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기
그리디·동적 계획법·환원
Greedy, dynamic programming, reductions
이 단원은 고급 알고리즘 설계 방법(Entwurfsmethoden)을 구분하는 법입니다. Greedy는 지금 보이는 가장 좋은 선택을 하나씩 붙이는 방식이지만, 그 선택이 안전하다(safe)고 증명해야 합니다. Dynamic programming(Dynamisches Programmieren, DP)은 같은 부분문제(overlapping subproblems)가 반복될 때 답을 표(table)나 메모(memoization)에 저장해 다시 쓰는 방식입니다. Reduction(Reduktion)은 문제 A의 입력을 문제 B의 입력으로 빠르게 바꾸고, B solver의 답을 A의 답으로 해석하는 문제 번역입니다. 시험에서는 이름을 외우는 것보다 각 방법의 의무를 말해야 합니다: Greedy는 안전성 증명, DP는 state/transition/runtime, reduction은 방향 \(A \le_{p} B\)A ≤p B와 결론입니다.
판별 순서: 정의의 전제조건을 확인하고, 절대 표현이 있으면 최소 반례를 찾은 뒤, 실행시간의 경우 최악·평균·상환 중 어느 기준인지 밝힙니다.
한국어 개념 강의 읽기