탐욕적 기법Greedy Algorithm 수정 2019-11-23

1강에서 얘기했듯이 T[1..n]에서 P[1..m]이 매칭하는지 검사를 할 경우 P[]를 전처리하여 그 속성을 미리 계산 해놓으면 O(mn)보다 더 좋은 결과를 도출할 수 있습니다. 이제 그 예가 되는 매칭 알고리즘 몇개를 소개하도록 하겠습니다.
K-nearest Neighbors Algorithm은 엄청 간단한 classify 하는 방법입니다.
1장에서 다루는 내용중엔 초등학교나 중학교에서 배운것도 많을겁니다. 차이점이라면그때 배운것보다 더 엄밀하게 배우는 것 뿐입니다.
탐욕적으로(?) 라는 말에 의아하시는 분들께 여기서 탐욕적으로는 현재상황에서 당장 좋은 것만 고르는 것입니다.
정점 i, j 사이의 거리를 d, 거리 테이블을 dist라고 부르겠습니다.
이때는 무조건 제일 왼쪽에 있는 점부터 시작하여 오른쪽으로 길이 L-1인 구간을 다 덮고, 그 오른쪽부터 다시 점을 찾아 덮는 걸 반복하면 됩니다.
퀵 정렬 알고리즘(quick sort algorithm)은 분할 정복 알고리즘(divide and conquer algorithm)중 하나로, 복잡하고 긴 문제들을 나누어 생각한다는 것을 의미합니다.
2. 이 정점의 이웃 정점에 대해 현재의 가격보다 더 싼 경로가 존재하는지 확인합니다. 만약 존재한다면 가격을 수정합니다.
이때는 현재 구간이 [1, 5]니까 그 길이 4를 결과에 더하고, 구간을 다시 이번 선분인 [6, 7]로 초기화합니다.
그리고 우리는 이 새로운 cell을 가장 가까운 cell type으로 분류하는 것이지요
마침내 이 포스트를 끝내게 되었습니다. 코드는 C ++을 사용하는 Sobel Edge Detection Algorithm입니다. 사용해 보십시오. 512 * 512 bmp 이미지에서만 작동합니다.
거의 같은 메커니즘을 가지고 있다고 보셔도 무방합니다.
Genetic algorithm은 진화형태의 최적화 알고리즘으로, 간단하게 컨셉만 얘기해보겠습니다.
Shockable Rhythm인지 Non-Shockable Rhythm인지 재 확인을 하여줍니다.
타잔 알고리즘은 하나의 사이클 집합의 노드들이 같은 부모를 갖게 하여 SCC를 구분합니다.
그러나 다음 번 루프에서는 dist[w] 역시 반드시 갱신될 수밖에 없습니다.
이런 문제를 방지하기 위해서는 22를 딱 한 칸만 이동해줘야합니다.
슬라이딩 윈도우는 어느 순간에도 그 구간의 넓이가 동일하다는 차이점이 있습니다.
이제 막 세 개의 최단경로 알고리즘 중 하나를 배웠지만, 꽤 많은 문제를 푸실 수 있을 겁니다.
지금까지 무지무지 길고긴 잡다한 설명을 따라와주시느라 고생하셨어요. 이제부터 진짜 Watershed Algorithm을 돌립시다! 여기서 주의할 사항은 watershed함수의 첫번째 파라미터로 원본이미지를 넣어줍니다.
Quality가 높으면 높을수록 제대로 가고있다는 뜻으로 해석하면 편합니다.
사실 아예 이전 정보가 없이 푼다는 건 불가능하죠.
시작점인 0번 정점만이... 싸이클에서 도달할 수 없으므로 최단거리가 실수 범위에서 정해지게 됩니다.
우선 Division algorithm을 살펴보면, 한 정수를 또 다른 한 정수로 나누게 되면, 유일한 몫과 나머지가 나온다는 것입니다.
1과 5는 연결되었고, 3, 5, 6의 부모는 모두 1이 됩니다.
이 문제도 정말 정말 유명한 스위핑 문제 중 하나입니다.
마지막으로 이런 증가 경로를 더 찾을 수 있습니다.
왜냐면 모든 간선이 절댓값 최대인 음의 가중치(이 문제에서는 -10000)를 가지고 있다면, N번의 루프 안에 계산 중간값의 절댓값이 4byte 정수형 값을 넘어가버릴 수 있게 됩니다.
moveDown 함수는 i번째 값과 그의 left Child값을 비교하여 만약 lef Child > i노드의 값이라면 j는 l값이 됩니다.
따라서 식 4에 대한 주파수 응답곡선과 Parameter Adaptation Algorithm (PAA)를 통해 모델링한 시스템의 주파수 응답곡선을 그려보면 거의 일치함을 확인할 수 있습니다.
Obstacle Course 문제와 똑같이 풀면 됩니다.
물론 음의 가중치가 있는 그래프에 사용 가능하며, 훗날 MCMF 문제를 풀 때 애용되는 알고리즘입니다.
위의 배열은 40까지 정렬이 완료된 상태입니다.
Infarction을 유발한 혈전이나 색전을 제거하여줍니다.
상위의 visited 배열을 준비해서 방문 안 한 정점이 나타나면 그 정점을 시작점으로 하여 벨만 포드를 한 번씩 돌려주면 그 컴포넌트 안에 존재하는 음의 싸이클은 찾을 수 있을 겁니다.
이상 Banker's Algorithm을 다룬 예제 였습니다.
시작점의 과거로 돌아갈 수 있는지를 묻는 문제입니다.
지금까지 기본적인 정렬들에 대해 알아봤는데요,
지금까지 ACLS의 ACS algorithm에 대해서 간단하게 알아봤습니다:)
따라서 prefix sum을 구한 후, 그 배열에 대고 구간 안에서 값이 같으면서 인덱스 차가 최대인 것을 찾아야 하는데 이는 4 문제와 동치입니다.
Boyer-Moore horspool, 짧게는 호스풀 알고리즘은 보이어-무어와 비슷합니다. 다만 good-suffix heuristic을 사용하지 않습니다.
문제는 N이 미친듯이 크기 때문에, 이분 매칭을 호프크로프트 카프 알고리즘으로 시행해야만 합니다.
강의 수업내용과 <알기쉬운 알고리즘>책을 바탕으로 작성했습니다.
Comments (9)








