출시·고도화 중
Algorithm
문자열 알고리즘은 텍스트에서 패턴을 찾고 접두사로 단어를 검색하는 기법으로, KMP, Rabin-Karp, 트라이, Z 알고리즘이 대표적입니다.
문자열 알고리즘은 글자의 나열을 빠르고 정확하게 비교하고 검색하는 방법을 다룹니다. 가장 대표적인 문제는 긴 텍스트에서 짧은 패턴이 나타나는 위치를 모두 찾는 패턴 매칭이며, 사전에서 특정 접두사로 시작하는 단어를 찾는 문제, 여러 패턴을 한 번에 찾는 문제도 여기에 속합니다. 모든 위치를 하나씩 비교하는 순진한 방법은 최악의 경우 텍스트 길이와 패턴 길이의 곱만큼 시간이 걸립니다.
편집기의 찾기, 로그 검색, 검색창 자동 완성, 침입 탐지, 파일 동기화, 유전체 분석은 모두 문자열 알고리즘 위에서 동작합니다. KMP는 이미 비교한 정보를 실패 표로 재사용해 선형 시간을 보장하고, Rabin-Karp는 굴러가는 해시로 창을 한 칸씩 옮기며 비교를 줄이며, 트라이는 공통 접두사를 공유해 단어 길이에만 비례하는 시간에 접두사를 검색합니다. 코딩 테스트와 기술 면접에서도 자주 나오는 주제입니다.
먼저 접두사, 접미사, 경계 같은 용어를 익히고 순진한 매칭이 왜 느린지 손으로 확인하는 것이 좋습니다. 이어서 작은 패턴으로 접두사 함수 표를 직접 계산해 보고, KMP 검색과 트라이를 구현한 뒤 표준 라이브러리 결과와 비교해 검증합니다. 마지막으로 해시 충돌과 유니코드 정규화처럼 실무에서 결과를 틀리게 만드는 함정을 함께 살펴봅니다.
패턴의 각 접두사마다 가장 긴 경계 길이를 미리 구해 두고, 불일치가 나면 텍스트를 되돌리지 않고 더 짧은 경계로 넘어가 O(n + m)에 검색합니다.
Rabin-Karp는 길이 m인 창의 해시를 O(1)에 갱신해 패턴 해시와 비교하고, 해시가 같을 때만 실제 글자를 비교해 확인합니다.
단어의 글자를 따라 내려가는 나무로, 공통 접두사를 한 경로로 공유해 접두사 검색과 자동 완성을 단어 길이에 비례하는 시간에 처리합니다.
Z 배열은 각 위치에서 시작하는 접미사와 전체 문자열의 공통 접두사 길이를 선형 시간에 구합니다. 실제 텍스트에서는 정규화와 인덱스 단위를 함께 고려해야 합니다.
prefix_function은 패턴의 각 접두사에서 가장 긴 경계 길이를 계산하고, kmp_search는 이 표를 써서 텍스트를 한 번만 앞으로 읽으며 패턴이 시작하는 위치를 모두 찾습니다. 일치를 찾은 뒤 k를 pi[k - 1]로 두기 때문에 위치 0과 2처럼 겹치는 출현도 찾습니다. python string_search.py로 실행하면 두 결과가 출력됩니다.
string_search.py
def prefix_function(p: str) -> list[int]:
"""pi[i] = length of the longest proper border of p[:i + 1]."""
pi = [0] * len(p)
k = 0
for i in range(1, len(p)):
while k > 0 and p[i] != p[k]:
k = pi[k - 1]
if p[i] == p[k]:
k += 1
pi[i] = k
return pi
def kmp_search(text: str, pattern: str) -> list[int]:
"""Start positions of every (possibly overlapping) occurrence."""
if not pattern:
return list(range(len(text) + 1))
pi = prefix_function(pattern)
hits, k = [], 0
for i, ch in enumerate(text):
while k > 0 and ch != pattern[k]:
k = pi[k - 1]
if ch == pattern[k]:
k += 1
if k == len(pattern):
hits.append(i - k + 1)
k = pi[k - 1]
return hits
if __name__ == "__main__":
print(prefix_function("ababaca")) # [0, 0, 1, 2, 3, 0, 1]
print(kmp_search("abababcabab", "abab")) # [0, 2, 7]
python string_search.py설치부터 문자열 알고리즘 의 핵심 개념까지, 여섯 장으로 차근차근 따라 합니다.
문자열 알고리즘 에 관해 묻고, 경험을 나누고, 의견을 주고받는 곳입니다.
아직 토론이 없습니다. 첫 이야기를 시작해 보세요.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.