백트래킹(backtracking) , 퇴각 검색

2021. 5. 23. 13:01·알고리즘 공부/백트래킹

백트래킹은 한정 조건을 가진 문제를 풀려는 전략이다. "퇴각 검색" 이고도 불린다.

문제가 한정 조건을 가진 경우 원소의 순서는 해결 방법과 무관하다.

이런 문제는 변수 집합으로 이루어지는데, 한정 조건을 구성하려면 각각의 변수 값이 있어야 한다.

퇴각검색은 모든 조합을 시도해서 문제의 해를 찾는다.

이것이 장점이 될 수 있는 이유는 퇴각검색 구현 방법들이 많은 부분 조합들을 배체하기 때문이다.

 

구현

주요 개념은 해를 얻을 때까지 모든 가능성을 시도한다는 점이다.

모든 가능성은 하나의 트리처럼 구성할 수 있으며, 가지 중에 해결책이 있다.

트리를 검사하기 위해 깊이 우선 탐색(DFS)을 사용한다. 탐색 중에 오답을 만나면 이전 분기점으로 돌아간다.

시도해보지 않은 다른 해결 방법이 있다면 시도한다.

해결 방법이 더 없으면 더 이전의 분기점으로 돌아간다. 모든 트리의 노드를 검사해도 답을 못 찾을 경우, 이 문제의 해결책은 없는 것이다.

퇴각 검색은 보통 재귀함수로 구현된다. 재귀로 파생된 해결 방법은 하나 이상의 변수가 필요한데, 이것은 현재 심점에서 적용할 수 있는 변수값들을 알고 있다. 퇴각 검색은 깊이 우선 탐색과 대략 같으나 기억 공간은 덜 차지한다.

현재의 상태를 보관하고 바꾸는 동안만 차지한다.

탐색 속도를 높이기 위해, 재귀 호출을 하기 전에 시도할 값을 정하고(전진 탐색의 경우)을 벗어난 값을 지우는 알고리즘을 적용할 수 있다. 아니면 그 값을 제외한 다른 값들을 탐색할 수도 있다. 

깊이 우선 탐색(DFS)

휴리스틱

 

몇몇 휴리스틱은 처리 속도를 높이려고 쓰인다. 변수는 어떤 순서로도 처리할 수 있으므로, 보통 효율적인 방법은 가장 한정된 조건을 먼저 시도하는 것이다. 이런 가지치기는 탐색트리를 작게한다.(최소의 비용으로 최대의 결과를 얻는다.)

 

조건을 검사하려고 값을 선택할 때, 많은 구현 방법은 조건을 벗어난 값을 빼려고 전진 탐색을 쓴다. 이를 예상하려고 다음 방법을 쓸 수 있다.

1. 해결책이 가장 있을 만하거나,

2. 해결책이 가장 벗을 만한 것을 찾는다.

 

복잡한 퇴각 검색을 구현하려고 종종 경계값 검사 함수를 쓴다. 이 검사는 현재의 부분 해결책으로 답을 얻을 수 있는지 확인한다. 부분적인 해결책이 있는지 확인하는 경계값 검사는 나은 탐색 방법이 될 수 없다. 왜냐하면 탐색 중에 때때로, 가능한 모든 조건에 대한 경계 검사의 연산 비용을 최소로 해야 하는데, 그렇지 못하면 알고리즘의 효율성은 그다지 향강되지 안는다. 효율적인 경계 검사함수는 조건을 점점 느슨하게 하는 휴리스틱 함수처럼 만든다.

https://ko.wikipedia.org/wiki/%ED%9C%B4%EB%A6%AC%EC%8A%A4%ED%8B%B1_%EC%9D%B4%EB%A1%A0

 

휴리스틱 이론 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 휴리스틱(heuristics) 또는 발견법(發見法)이란 불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지

ko.wikipedia.org

퇴각 검색이 제한 조건이 많은 프로그래밍 언어에서 사용될 경우, 이런 조건들 때문에 오버헤드((overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.)가 발생한다. 자체적으로 제한 조건 해결자를 사용하여, 프로그램을 수정할 필요가 있다. 이런 언어일 경우, 간단한 깊이 우선 탐색은 쓸만한 방법이다.

 

덧붙여서 되돌리 때 복구할 값들을 최소로 유지하고자, 퇴각검색은 변수 이력을 갖는다. 이것은 변수 값이 바뀐 내역을 보관한다. 효율적인 퇴각 검색은 분기점이 없을 때의 값 변화에 대한 내역은 제거하려고 한다. 이는 분기점이 없는 조건을 하나의 연산으로 간주하고 이와 관련된 값 변화를 지워서 구현된다.

 

반응형

'알고리즘 공부 > 백트래킹' 카테고리의 다른 글

[백준] 9663번 N-Queen - 파이썬  (0) 2021.05.28
[백준] 14889번 스타트와 링크 - 파이썬  (0) 2021.05.26
[백준] 15652번 N과 M (4) - 파이썬  (0) 2021.05.26
[백준] 15651번 N과 M (3) - 파이썬  (0) 2021.05.26
[백준] 15649번 N과 M (1) - 파이썬  (0) 2021.05.22
'알고리즘 공부/백트래킹' 카테고리의 다른 글
  • [백준] 14889번 스타트와 링크 - 파이썬
  • [백준] 15652번 N과 M (4) - 파이썬
  • [백준] 15651번 N과 M (3) - 파이썬
  • [백준] 15649번 N과 M (1) - 파이썬
코딩 코딩 코오딩
코딩 코딩 코오딩
  • 코딩 코딩 코오딩
    코딩하는 누누
    코딩 코딩 코오딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (491)
      • 생산성 (2)
        • 인텔리제이 (2)
      • 프로젝트 기록 (14)
        • git (2)
        • spring (3)
        • TestCode (2)
        • spring security (3)
        • 기타 (2)
        • MySQL (0)
        • Cloud (2)
      • 회고 (4)
      • Spring (6)
      • JPA (0)
      • DB (4)
        • MySql (2)
        • Redis (1)
      • Java (7)
        • JSP (1)
      • 잡담 (1)
      • CS (30)
        • 컴퓨팅 사고 (0)
        • 배열 (4)
        • 알고리즘 (8)
        • 메모리 (7)
        • 자료구조 (9)
        • 암호학 (2)
      • opencv (14)
      • AI (56)
        • 머신러닝 (2)
        • 딥러닝 (7)
        • tensorflow (3)
        • 머신러닝(딥러닝) 정리 (21)
        • 강화학습 (7)
        • 논문 읽기 (1)
        • 잡동사니 (1)
        • python AI (13)
        • 선형대수 (1)
        • 확률론 (0)
      • 알고리즘 공부 (177)
        • 그래프 이론 (0)
        • 다익스트라 (4)
        • 위상정렬 (3)
        • 신장트리-크루스칼 알고리즘 (4)
        • 플로이드 워셜 (3)
        • 이진탐색 (9)
        • 백트래킹 (11)
        • 부르드포스 (9)
        • 다이나믹 프로그래밍 (20)
        • BFS & DFS (24)
        • 그리디 (6)
        • 구현 (15)
        • 정렬 (3)
        • 기타 (62)
        • 수학? (1)
      • 코딩 (173)
        • 파이썬(python) (15)
        • c언어 (13)
        • 프로그래머스 lv1 (46)
        • 프로그래머스 lv2 (41)
        • 백준 - c++ (49)
        • Softeer (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    코딩기초
    DFS
    C언어 기초
    코딩
    다이나믹 프로그래밍
    백준
    프로그래머스
    이미지처리
    왜곡보정
    정렬
    인접리스트
    인접행렬
    큐
    자료구조
    순차 탐색
    에라토슽네스의 체
    c언어
    if문
    캘리브레이션
    코딩기초스킬
    소수찾기
    코딩문제
    코딩테스트
    스택
    n진법 변환
    선택정렬
    그리디
    삽입 정렬
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩 코딩 코오딩
백트래킹(backtracking) , 퇴각 검색
상단으로

티스토리툴바