Hopcroft 최소화 알고리즘의 최악 사례: 단일 알파벳 언어와 de Bruijn 워드
초록
본 논문은 Hopcroft DFA 최소화 알고리즘을 단일 알파벳(유니어리) 언어에 적용했을 때, 분할 집합을 FIFO 방식으로 처리하면 오직 de Bruijn 워드가 절대적인 최악의 시간 복잡도 O(n log n)을 달성한다는 것을 증명한다. 또한 LIFO 구현에서는 동일한 최악 상황이 발생하지 않으며, 이 결과는 커버 자동화와 수정된 Hopcroft 알고리즘에도 그대로 적용된다.
상세 분석
Hopcroft 알고리즘은 상태 집합을 두 부분(F와 Q‑F)으로 초기 분할한 뒤, “분할자 집합”(splitting set) S에 들어 있는 (C, a) 쌍을 차례로 꺼내어 현재 파티션 P의 각 블록 B를 C와 a에 의해 나눈다. 알고리즘의 실행 시간은 S에 들어가는 상태 수의 총합에 비례한다는 것이 기존 연구의 핵심이다. 논문은 이 점을 이용해 “분할자 리스트 S를 FIFO(선입선출) 방식으로 관리할 때” 가장 많은 상태가 S에 들어가도록 하는 입력 자동화를 찾는다.
단일 알파벳을 가정하면 모든 (C, a) 쌍은 단순히 집합 C만으로 표현될 수 있다. 저자는 |C|=m인 현재 분할자가 있을 때, 이후에 S에 추가되는 집합은 절대 m보다 많을 수 없다는 Lemma 2를 증명한다. 따라서 최악의 경우를 만들려면 매 단계마다 |C|가 가능한 한 크게 유지되어야 한다. 이는 초기 분할에서 |F|=|Q‑F|=2^{n‑1}이어야 함을 의미하고, 이어지는 분할 과정에서 각 단계마다 두 개의 동등한 크기의 블록이 생성되어야 한다.
이러한 구조는 정확히 de Bruijn 순환 자동화와 일치한다. de Bruijn 자동화는 2^{n}개의 상태를 원형으로 연결하고, 각 상태는 n‑길이 이진 문자열을 나타낸다. 상태 전이 a(유일한 문자)는 문자열을 한 자리 왼쪽으로 시프트하고 새 비트를 추가한다. 결과적으로 단계 i에서 S에 들어가는 집합은 길이 i인 모든 이진 문자열을 나타내며, 각각 2^{n‑i}개의 상태를 포함한다. 알고리즘은 i=1부터 n까지 진행하면서 S에 총 Σ_{i=1}^{n} 2^{n‑i}=2^{n}−1개의 상태를 삽입하게 되고, 이는 O(n log n) 단계와 정확히 일치한다.
반면 LIFO(후입선출) 전략을 사용하면 작은 집합이 먼저 처리되어 큰 집합이 분할될 기회를 잃게 된다. 저자는 “세 번째 비결정성”(이미 S에 있는 집합을 대체하는 과정)에서도 작은 집합을 스택에 넣는 경우, 이후에 발생하는 분할이 기존 S에 있는 큰 집합을 파괴하므로 전체 삽입 수가 급격히 감소한다. 따라서 LIFO에서는 O(n) 수준으로 시간 복잡도가 낮아진다.
마지막으로 논문은 커버 자동화(cover automata)와 Hopcroft 알고리즘의 변형에도 동일한 논리를 적용한다. 커버 자동화는 유한 언어의 모든 접두어를 인식하도록 설계되며, 최소화 과정에서 사용되는 분할 규칙이 기본 DFA와 동일하다. 따라서 de Bruijn 구조를 갖는 커버 자동화 역시 FIFO‑Hopcroft에서 절대 최악의 O(n log n) 복잡도를 보이며, LIFO에서는 그보다 훨씬 효율적이다.
이 연구는 Hopcroft 알고리즘의 구현 세부 사항이 이론적 최악 복잡도에 미치는 영향을 명확히 보여주며, 특히 단일 알파벳 상황에서 de Bruijn 워드가 최악의 입력임을 최초로 증명한다는 점에서 의미가 크다. 또한 실무에서 스택 기반 구현이 일반적인 경우 평균 성능을 크게 향상시킬 수 있음을 시사한다.
댓글 및 학술 토론
Loading comments...
의견 남기기