Odds and Ends
[CS 개념 정리] Union Find, 투 포인터, KMP 알고리즘 본문
Union-Find란?
Union-Find의 개념
- 서로 중복되지 않는 부분 집합 (Disjoint Set = 서로소 집합 자료구조)을 표현할 때 사용하는 자료구조
- 초기화 / 합치기 (Union) / 찾기 (Find) 세 가지 연산을 사용한다
- 최소 스패닝 트리를 구현하는 크루스칼 알고리즘에 사용되며, 사이클을 만들지 않고 모든 노드를 방문할 수 있다
Union-Find의 구현
- 초기화 : N 개의 원소가 각각의 집합에 포함되어 있도록 초기화한다 -> 각각을 유일한 원소로 가지는 집합 생성
- Union (합치기) : 두 원소 a, b 가 각각 속한 두 집합을 하나로 합친다 -> 두 개의 집합을 하나로 연결하는 역할
- Find (찾기) : 원소 a 가 주어질 때, 이 원소가 속한 집합을 루트노드를 반환한다 -> a가 어느 집합에 속해있는지 찾는 역할
투 포인터란?
투 포인터 (two-pointer)
: Two Pointers 는 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻는 알고리즘
- 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리
- 정렬되어있는 두 리스트의 합집합에도 사용됨.
* 두 개의 포인터를 사용하여 기존의 방식보다 시간을 개선할 수 있다.
KMP 알고리즘이란?
KMP 알고리즘(문자열 처리 알고리즘)
: 특정 문자열에서 부분 문자열을 찾을 때 사용한다.
> KMP 알고리즘의 핵심은 이전까지 비교했던 정보를 기억하는 것
> 접두사와 접미사를 활용해서 일정 부분이 맞는다면 Jump 하는 방식
- KMP 알고리즘은 부분문자열을 찾는 알고리즘 중 유일하게 선형 시간복잡도를 가지기때문에 유명하다.
[ KMP의 기본 개념 ]
- 문자열 패턴 불일치가 발생한 전체 문자열에서 어떤 부분 문자열이 일치했는지 알고있다.
- 불일치가 발생한 앞 부분에 대하여 다시 비교하지 않고 매칭을 수행한다.
KMP 알고리즘 시간복잡도 : O(M+N) >> (N : 원본 문자열의 길이, M : 찾을 문자열의 길이)
def simpleCompare(original, search) :
for i in range(len(original)- len(search)) :
flag = True
for j in range(len(search)) :
if original[i+j] != search[j] :
flag = False
break
if flag :
return i
return -1
def makeFailureFunctionTable(word) :
# j = 0, i = 1 부터 비교를 진행해 줍니다. ->KMP 알고리즘은 2글자 이상의 문자열에서만 적용됩니다.
j = 0
table = [0]*len(word) # 반환할 Table을 생성해줍니다.
for i in range(1, len(word)) :
while j > 0 and word[i] != word[j] :
j = table[j-1]
if word[j] == word[i] :
j += 1
table[i] = j
return table
def KMP(original, search) :
table = makeFailureFunctionTable(search)
j = 0
for i in range(len(original)) :
while j > 0 and search[j] != original[i] :
j = table[j-1]
if search[j] == original[i] :
if j == len(search) -1 :
print(i - len(search) + 1, "번째 인덱스에서부터 일치합니다.")
j = table[j-1]
j += 1
print(simpleCompare("abcdef", "cd"))
print(KMP("ababacabacaabacaaba", "abacaaba"))
[참고]
KMP 알고리즘이란?
KMP Algorithm KMP 알고리즘이란? KMP(Knuth-Morris-Pratt) 알고리즘은 어떤 문자열에서 특정 문자열을 찾고자 할때 유용한 알고리즘입니다. KMP 란 이름이 붙은 이유는 Knuth, Morris, Pratt 세사람이 함께 만들..
richard25.tistory.com
[Algorithm] 투포인터(Two Pointer) 알고리즘
알고리즘 문제를 풀다보면 종종 나오는 투포인터 알고리즘! 막 꼬여가지고 ㅋㅋㅋ 저도 중간에 제대로 못짜고 그러는 경우가 많은데요, 많은 코딩테스트 문제에 등장하는 것은 아니지만 잊을만
butter-shower.tistory.com
[Algorithm] Union-Find의 개념과 구현
Union-Find의 개념 서로 중복되지 않는 부분 집합 (Disjoint Set)을 표현할 때 사용하는 자료구조 초기화 / 합치기 (Union) / 찾기 (Find) 세 가지 연산을 사용한다 최소 스패닝 트리를 구현하는 크루스칼 알
jinee0717.tistory.com
728x90
'CS 개념 정리' 카테고리의 다른 글
[CS 개념 정리] 관계형 데이터베이스(RDBMS) (0) | 2022.11.10 |
---|---|
[CS 개념 정리] 이분 탐색, 최단 경로(다익스트라), 최소 비용(MST)(크루스칼, 프림) - 파이썬 코드 구현 (0) | 2022.10.26 |
[CS 개념 정리] 합병 정렬, 퀵 정렬, 힙 정렬 (0) | 2022.10.25 |
[알고리즘 개념 정리] 분할 정복법 (Divide and Conquer), 탐욕 알고리즘 (Greedy), 동적 계획법 (Dynamic Programming) (0) | 2022.10.13 |
[정렬 알고리즘 정리, python] 선택 정렬, 거품 정렬, 삽입 정렬 (0) | 2022.10.13 |