본문 바로가기
Code/ALGORITHM

억지기법과 완전 탐색

by jaeaemin 2022. 10. 2.

억지 기법 ( brute-foce ) 란 ? 

  • 매우 광범위한 문제에 적용 가능한 알고리즘 설계 기법 중 하나
  • 입력의 크기가 작은 경우 충분히 빠를 수 있고, 점근적으로 더 효율적인 알고리즘 보다 실제 빠른 경우도 존재
  • 효율적인 알고리즘 설계와 분석을 위해 이론적 기반이 됨
  • 정렬, 탐색, 기하학적 문제, 완전 탐색, 그래프 탐색 등에 사용 가능 

 

[1] brute-force를 사용한 선택 정렬 

: 입력 리스트에서 가장 작은 항목을 매번 루프마다 찾고, 이를 꺼내 정렬된 리스트에 순서대로 삽입한다.

▶ 이를 개선 시키면, 새로운 리스트에 저장하는 것이 아니라 정렬되지 않은 최근 포인트에 접근하여 교환하는 것도 가능 ( 제자리 정렬 ) 

 

 

선택 정렬 알고리즘 

def selection_sort(A):
	n = len(A)
    for i in range(n-1):
    	least = i
        for j in range(i+1, n);
        	if(A[j] < A[least]):
            	least = j
        A[i], A[least] = A[least], A[i]
        printSet(A, i+1);
< 복잡도 >
[1] 입력의 크기 :  N ( 리스트 크기 ) 
[2] 기본 연산 : 비교 연산 or 대입 연산
[3] 입력 구성에 따른 차이 : 항상 일정한 횟수의 비교 연산 필요
==> 복잡도 :  [ n(n-1) ] / 2.   : O(n^2)

 

 

 

[2] 순차 탐색 알고리즘 

: brute-force를 사용한 순차 탐색은 key를 list를 순회하면서 찾게 된다. 

 

def seq_search(A, key):
    for i in range(len(A)):
    	if A[i] == key:
        	return i
    return -1
< 복잡도 > 
최선 : O(1)
최악 : O(n)
평균 :  (n+1) / 2 => O(n)

 

 

 

[3] 문자열 매칭 

Q. 길이가 n인 입력 문자열 T와 길이가 m인 패턴 문자열 P가 존재할 때, T에서 가장 먼저 나타나는 P의 위치를 찾아라 

def string_match(T, P):
	n = len(T)
    m = len(P)
    for i in ragne(n-m+1):
    	j = 0
        while j < m and P[j] == T[i+j]:
        	j = j+1
        if j == m :
        	return i
    return -1
<복잡도>
최선의 경우 : O(m).    : 첫 위치에서 매칭 성공 ( 패턴 수 : m )
최악의 경우 : O(mn) 

 

 

 

[4] 최근접 쌍의 거리 

 

 

brute-froce 전략 : 

가능한 모든 점의 쌍 (pi, pj)에 대해 거리를 계산하고, 가장 짧은 것을 찾는다.

 

def closest_pair(p):
    n = len(p)
    mindist = float("inf")
    for i in ragne(n-1):
    	for j in range(i+1, n):
        	dist = distance(p[i]. p[j])
            if dist < midist:
            	midist = dist 
     return mindist

<복잡도>

 

 

 

완전 탐색 

: 순열이나, 조합, 모든 붑분 집합을 찾는 과정을 포함하는 문제에 적용함 

 

 

 

[5] 그래프 탐색 

 

[1] 깊이 우선 탐색 (DFS) 

def dfs(graph, start, visited):
   if start not in visited:
    	visited.add(start)
        print(start, end=' ')
        nbr = graph[start] - visited
        for v in nbr:
        	dfs(graph, v, visited)
정점 수 n , 간선 수 e 인 CASE : 
- 인접 리스트 표현 : O(n+e) --> 회소 그래프에서 유리 
- 인접 행렬 표현 : O(n^2)

 

 

[2] 너비 우선 탐색 (BFS)

파이썬의 Queue 모듈 사용 

import queue
def bfs(graph, start):
    visited = { start } 
    que = queue.Queue()
    que.put(start)
    while not que.empty():
    	v = que.get()
        print(v, end='')
        nbr = graph[v] - visited
        for u in nbr:
            visited.add(u)
            que.put(u)
복잡도
- 인접 리스트 표현 : O(n+e)
- 인접 행렬 표현 : O(n^2)

 

반응형

'Code > ALGORITHM' 카테고리의 다른 글

최단 경로 알고리즘 (2)  (0) 2021.09.06
최단 경로 알고리즘  (0) 2021.09.01
다이나믹 프로그래밍  (0) 2021.08.12
정렬  (0) 2021.08.05
탐색  (0) 2021.08.04