[Python] [알고리즘] 2. String
Brute-Force
본문 문자열을 처음부터 끝까지 차례대로 순회하며 패턴 내 문자들을 하나하나 비교하는 방식으로 동작한다.
p = 'is' #찾을 패턴
t = 'This is a book' #전체 텍스트
M = len(p)
N = len(t)
def BruteForce(p,t):
i = 0 #t의 idx
j = 0 #p의 idx
while j<M and i<N:
if t[i] != p[j]:
i -= j
j = -1
i = i + 1
j = j+1
if j == M :return i-M #검색 성공
else: return -1
p ='ab'
t ='aaaaaabaaaababb'
M = len(p)
N = len(t)
def bf(p, t):
i = 0#t에서의 비교 위치
j = 0# p에서의 비교 위치
while i < N and j < M:#비교할 문장이 남아있고 패턴 찾기 전에만 while문 돌기
if t[i] != p[j]:#서로 다른 문자를 만나면
i -= j#비교를 시작한 위치로
j = -1#패턴의 시작 전으로
i += 1
j += 1
if j == M:#패턴을 찾은 경우
return i-M
else:
return -1
print(bf(p,t))
T = "This pattern matching algorithm"
def brute(P):
lenP = len(P)
lenT = len(T)
idx_T = 0
for idx_T in range(lenT-lenP+1):
idxP = 0
while idxP < lenP and T[idx_T+idxP] == P[idxP]:
idxP += 1
if idxP == lenP:
return idx_T
return -1
print(brute('patt'))
KMP 알고리즘(O: M+N)
불일치가 발생한 텍스트 스트링의 앞 부분에 어떤 문자가 있는지를 미리 알고 있으므로, 불일치가 발생한 앞 부분에 대해 다시 비교하지 않고 매칭을 수행한다. 패턴을 전처리하여 배열 next[M}을 구해서 잘못된 시작을 최소화한다.(next[M]은 불일치가 발생했을 경우 이동할 다음 위치) 매칭이 실패했을 경우 돌아갈 곳을 생각한다.

보이어-무어 알고리즘(O: M*N)
오른쪽에서 왼쪽으로 비교하는 알고리즘. 대부분의 상용 SW에서 채용한다. 패턴의 오른쪽 끝에 있는 문자가 불일치하고 이 문자가 패턴 안에 존재하지 않는 경우, 패턴의 길이 만큼 건너뛴 후 뒤에서부터 비교하는 알고리즘이다.
오른쪽 끝에 있는 문자가 불일치하고 이 문자가 패턴 내에 존재하는 경우는 패턴에서 일치하는 문자를 찾아 이동한다.
for문은 하나씩 이동하는 방법이기 때문에 보이어-무어 알고리즘은 while문을 사용하여야 한다. O의 경우 크지만, 일반적으로 (n)보다 시간이 덜 든다.

'SSAFY > TIL' 카테고리의 다른 글
| [Python] [알고리즘] 6. 큐 (0) | 2023.02.20 |
|---|---|
| [Python] [알고리즘] 5. 스택(3) (0) | 2023.02.16 |
| [Python] [알고리즘] 4. 스택(2) (0) | 2023.02.15 |
| [Python] [알고리즘] 3. 스택(1) (0) | 2023.02.15 |
| [Python] [알고리즘] 1. 배열 (0) | 2023.02.14 |
TAGS.
