반응형
Day 1: 고급 문자열 알고리즘 소개
- 강의 내용:
- 문자열 알고리즘의 중요성
- 문자열 알고리즘의 다양한 응용 사례
- 문자열 검색의 필요성
- 문자열 검색 알고리즘의 개요
- 패턴 매칭 문제 정의
- 다양한 문자열 검색 알고리즘 소개
- 문자열 알고리즘의 중요성
- 실습:
- 간단한 문자열 검색 예제
# 간단한 문자열 검색 예제
def naive_search(pattern, text):
M = len(pattern)
N = len(text)
for i in range(N - M + 1):
j = 0
while j < M and text[i + j] == pattern[j]:
j += 1
if j == M:
print("패턴 발견: 인덱스", i)
# 예제 실행
text = "AABAACAADAABAABA"
pattern = "AABA"
naive_search(pattern, text)
Day 2: KMP 알고리즘 (Knuth-Morris-Pratt Algorithm)
- 강의 내용:
- KMP 알고리즘의 개념
- KMP 알고리즘이란 무엇인가?
- KMP 알고리즘의 동작 원리
- KMP 알고리즘의 시간 복잡도
- 시간 복잡도: O(N + M) (N: 텍스트 길이, M: 패턴 길이)
- KMP 알고리즘의 주요 개념
- 접두사 함수 (Prefix Function)
- KMP 알고리즘의 개념
- 실습:
- 파이썬을 사용한 KMP 알고리즘 구현 및 예제
# KMP 알고리즘 구현
def kmp_search(pattern, text):
def compute_lps(pattern):
lps = [0] * len(pattern)
length = 0
i = 1
while i < len(pattern):
if pattern[i] == pattern[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
return lps
M = len(pattern)
N = len(text)
lps = compute_lps(pattern)
i = 0
j = 0
while i < N:
if pattern[j] == text[i]:
i += 1
j += 1
if j == M:
print("패턴 발견: 인덱스", i - j)
j = lps[j - 1]
elif i < N and pattern[j] != text[i]:
if j != 0:
j = lps[j - 1]
else:
i += 1
# 예제 실행
text = "AABAACAADAABAABA"
pattern = "AABA"
kmp_search(pattern, text)
Day 3: 보이어-무어 알고리즘 (Boyer-Moore Algorithm)
- 강의 내용:
- 보이어-무어 알고리즘의 개념
- 보이어-무어 알고리즘이란 무엇인가?
- 보이어-무어 알고리즘의 동작 원리
- 보이어-무어 알고리즘의 시간 복잡도
- 평균 시간 복잡도: O(N/M)
- 최악의 시간 복잡도: O(NM)
- 보이어-무어 알고리즘의 주요 개념
- 불일치 이동 규칙 (Mismatch Heuristic)
- 좋은 접미사 이동 규칙 (Good Suffix Heuristic)
- 보이어-무어 알고리즘의 개념
- 실습:
- 파이썬을 사용한 보이어-무어 알고리즘 구현 및 예제
# 보이어-무어 알고리즘 구현
def boyer_moore_search(pattern, text):
def bad_char_heuristic(pattern):
bad_char = [-1] * 256
for i in range(len(pattern)):
bad_char[ord(pattern[i])] = i
return bad_char
def good_suffix_heuristic(pattern):
M = len(pattern)
good_suffix = [0] * M
border = [0] * (M + 1)
i = M
j = M + 1
border[i] = j
while i > 0:
while j <= M and pattern[i - 1] != pattern[j - 1]:
if good_suffix[j] == 0:
good_suffix[j] = j - i
j = border[j]
i -= 1
j -= 1
border[i] = j
j = border[0]
for i in range(M + 1):
if good_suffix[i] == 0:
good_suffix[i] = j
if i == j:
j = border[j]
return good_suffix
bad_char = bad_char_heuristic(pattern)
good_suffix = good_suffix_heuristic(pattern)
M = len(pattern)
N = len(text)
s = 0
while s <= N - M:
j = M - 1
while j >= 0 and pattern[j] == text[s + j]:
j -= 1
if j < 0:
print("패턴 발견: 인덱스", s)
s += good_suffix[0]
else:
s += max(good_suffix[j + 1], j - bad_char[ord(text[s + j])])
# 예제 실행
text = "ABAAABCD"
pattern = "ABC"
boyer_moore_search(pattern, text)
Day 4: 라빈-카프 알고리즘 (Rabin-Karp Algorithm)
- 강의 내용:
- 라빈-카프 알고리즘의 개념
- 라빈-카프 알고리즘이란 무엇인가?
- 라빈-카프 알고리즘의 동작 원리
- 라빈-카프 알고리즘의 시간 복잡도
- 평균 시간 복잡도: O(N + M)
- 최악의 시간 복잡도: O(NM)
- 라빈-카프 알고리즘의 주요 개념
- 해싱 (Hashing)과 롤링 해시 (Rolling Hash)
- 라빈-카프 알고리즘의 개념
- 실습:
- 파이썬을 사용한 라빈-카프 알고리즘 구현 및 예제
# 라빈-카프 알고리즘 구현
def rabin_karp_search(pattern, text, q):
d = 256
M = len(pattern)
N = len(text)
p = 0
t = 0
h = 1
for i in range(M - 1):
h = (h * d) % q
for i in range(M):
p = (d * p + ord(pattern[i])) % q
t = (d * t + ord(text[i])) % q
for i in range(N - M + 1):
if p == t:
match = True
for j in range(M):
if text[i + j] != pattern[j]:
match = False
break
if match:
print("패턴 발견: 인덱스", i)
if i < N - M:
t = (d * (t - ord(text[i]) * h) + ord(text[i + M])) % q
if t < 0:
t = t + q
# 예제 실행
text = "GEEKS FOR GEEKS"
pattern = "GEEK"
q = 101 # 해시 함수로 사용할 소수
rabin_karp_search(pattern, text, q)
Day 5: 고급 문자열 알고리즘 종합 연습
- 강의 내용:
- 종합 연습 문제 풀이
- KMP, 보이어-무어, 라빈-카프 알고리즘을 활용한 종합 문제
- 고급 문자열 알고리즘의 응용
- 다양한 실생활 문제에서의 응용 사례
- 종합 연습 문제 풀이
- 실습:
- 종합 연습 문제 해결 및 결과 분석
### 종합 연습 문제 예시
1. 주어진 텍스트에서 KMP 알고리즘을 사용하여 패턴을 검색하세요.
2. 주어진 텍스트에서 보이어-무어 알고리즘을 사용하여 패턴을 검색하세요.
3. 주어진 텍스트에서 라빈-카프 알고리즘을 사용하여 패턴을 검색하세요.
Day 6: 프로젝트 준비
- 강의 내용:
- 프로젝트 주제 선정 및 요구사항 분석
- 프로젝트 주제 및 요구사항 확정
- 프로젝트 설계 및 계획 수립
- 프로젝트 구현 준비
- 데이터 구조 및 알고리즘 설계
- 프로젝트 팀 구성 및 역할 분담
- 프로젝트 주제 선정 및 요구사항 분석
- 실습:
- 프로젝트 주제 및 요구사항 분석
- 프로젝트 설계 및 계획 수립
### 프로젝트 주제 예시
1. 대규모 텍스트 데이터 검색 엔진 개발
2. 실시간 텍스트 패턴 매칭 시스템
### 프로젝트 요구사항 예시
1. 대규모 텍스트 데이터 검색 엔진:
- 대규모 텍스트 데이터셋 입력 및 저장
- 고급 문자열 알고리즘을 통한 패턴 매칭
- 검색 결과 출력 및 성능 분석
### 프로젝트 설계 및 계획 예시
1. 데이터 입력 모듈 구현
2. 고급 문자열 알고리즘 구현 (KMP, 보이어-무어, 라빈-카프 등)
3. 데이터 출력 및 성능 분석 모듈 구현
이 강의는 파이썬의 고급 문자열 알고리즘, 특히 문자열 검색 알고리즘 (KMP, 보이어-무어, 라빈-카프)의 기본 개념과 구현을 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!
반응형
'-----ETC2----- > 알고리즘(심화)' 카테고리의 다른 글
[알고리즘] Week 10: 고급 그래프 이론 - 트리 분해, 트리 DP, 라벨링 기법 (1) | 2024.06.02 |
---|---|
[알고리즘] Week 9: 고급 기하 알고리즘 - 개요와 예제 (1) | 2024.06.02 |
[알고리즘] Week 7: 고급 그래프 최단 경로 알고리즘 - 벨만-포드 알고리즘과 존슨 알고리즘 (3) | 2024.06.02 |
[알고리즘] Week 6: 고급 그래프 알고리즘 - 강한 연결 요소와 위상 정렬 (0) | 2024.06.02 |
[알고리즘] Week 5: 네트워크 플로우 알고리즘 - 개념과 최대 유량 문제 (1) | 2024.06.02 |