다섯 역행 알고리즘

        검색 알고리즘을 역 추적하는 것은 우리의 목표를 달성하기 위해, 우수한 상태로 눌러 앞으로 검색, 또한 경험적으로 알려진 최적의 선택 방법입니다. 단계가 탐험 때, 원래의 선택이 목표를 달성하기 위해 또는 우수하지 않습니다 발견, 그것은에 스텝 돌아, 역 추적에 대한 반환 도보 기술에 대한이 막 다른 골목을 다시 선택하고 어떤 점 상태의 조건에서 만나 다시 "역 추적 점"이라고합니다.

        역 추적 방법에 의해 해결하고자하는 문제는 해당 선택에 트리 구조가 각 상태에 대응 설명 될 수있다. 모든 치환 문제 후, 예를 들면, 등은 [1, 2, 3]의 전체 배열마다,이 값이 1의 값을 선택할 수있는, 다음 1, 2, 3으로부터 선택되고, 2, 3, 이 과정은 트리로 그려집니다, 각 노드는 1, 2, 3 세 자식 노드가 있습니다. 전체 트리 구조를 통과한다면 노드 조건이 만족되지 않을 때 일반적으로 탐색 트리 깊이 우선 방식의, 즉 우선 탐색 방법은, 그 시간 복잡도는이며, 특정 조건을 통해 되돌아 오는 법이 결정되고, 지수 함수 경로를 통과 할 필요성을 절감, 나무 가지 치기 때문에, 노드, 그 다음 이송 시작에 다시 떨어질 것이다. 중복 값이없는 구성의 결과로서,이 상태에서는 다시 같은 검색 결과 (3)의 길이와 중복 경로뿐만 아니라 되돌아 동안 종료 조건을 뺄 수있다.

 

 

따라서, 사실, 의사 결정 트리 탐색을 문제를 해결하기 위해 되돌아. 고려해야 할 네 가지 요소가 있습니다 :

  • 현재 경로 : 이미 만들어진 선택을 의미합니다.
  • 선택 목록 : 모든 사용할 수있는 현재의 옵션을 의미합니다.
  • 돌아 가기 조건 : 이 유효한지 여부를 확인하려면 참조
  • 종료 조건 : 당신이 조건을 선택하지 마십시오 바닥에 도달하는 의사 결정 트리를 의미합니다.

코드 측은 알고리즘을 역 추적하는 것은 프레임 워크를 다음 의 핵심은이다  에 대한  재귀 호출 후 "메이크업의 선택", "선택 해제"로 재귀 호출하기 전에, 재귀 루프 내부.

결과 = [] 
DEF BackTrack은 (전류 경로 선택리스트) 
    경우는 종료 조건이 만족된다 
        result.add (경로) 
        

을위한 선택 에서 선택 목록 :
         IF 조건 백을 만족하는 : 
            선택할 
            BackTrack의가 (전류 경로 선택리스트) 
            선택 취소

 

첫째, 전체 배열 문제

(가), 예를 들면, [2]의 전류 경로는, 선택 번호가 레드 노드 상태 또는 완전 배열 [2,3]이지만 때 다음을 만족하는 상태, 즉 중복 없음 위로 만 [1,3] 검색 결과 3의 전체 길이 종료 조건.

다음과 같이 코드입니다 :

클래스 솔루션 {
 공개 : 
    벡터 <벡터 < INT >> 고해상도; 
    벡터 <벡터 < INT >> 교환하다 (벡터 < INT > & nums) { 
        벡터 < INT > TMP; 
        (TMP, nums) 철수; 
        반환 입술을; 
    } 
    공극 역 추적 (벡터 < INT > TMP 벡터 < INT > nums) 
    { 
        경우 (tmp.size () == nums.size ()) 
        { 
            res.push_back (TMP); 
            반환 ; 
        }
        위한 ( INT 난 = 0 ; I <nums.size을 (); I ++ ) 
        { 
            벡터 < INT > :: 반복자 ITER; 
            ITER = 표준 : 찾기 (tmp.begin () tmp.end () nums [I]);
            경우 (ITER == tmp.end ()) 
            { 
                tmp.push_back (nums [I]); 
                (TMP, nums) 철수; 
                tmp.pop_back (); 
            } 
        } 
    } 
};

 

        이 시점에서, 우리는 모든 치환 문제로 알고리즘을 역 추적의 기본 원리를 설명합니다. 물론, 전체 배열을 해결하기 위해이 알고리즘 때문에 벡터 시간 복잡도 O (N) 인을 사용하여 찾을 필요성이 매우 효율적이지 않습니다. 더 좋은 방법은 스위칭 소자에 의해 달성한다. 그러나 다시 틀에 맞춰, 그리고 곡물 철저한 트리 피할 수 없기 때문에, 적은 O (N!)의 시간 복잡도보다하지 않습니다 아무리 최적화 말할 수 있어야합니다. 또한, 알고리즘을 역 추적하는 순수 무작위 력 일반적 높이의 복잡성, 서브 문제 겹치는 최적화 동적 프로그래밍 달리 되돌아 알고리즘을 특징으로한다.

 

둘째, 괄호 생성 문제

        N 세대의 수는 괄호 안에 표시됩니다 대표, 당신은 함수를 작성, 브래킷과 효과의 모든 가능한 조합을 생성 할 수있다. 예를 들어, 결과를 생성하기 위해, 3 = 주어진 n은 같다 : "((()))", "(())", "(()) ()", "() (())", " () () "].

법률 괄호 조합 내 두 조건을 만족합니다 :

  • 왼쪽 괄호 법적 괄호의 숫자는 괄호의 오른쪽 숫자의 조합 동일해야합니다,이 분명하다.
  • 조합 생성 처리 합법적 브래킷 왼쪽 브래킷 특정 넘버 생성기는 넘버 이상인 오른쪽}를 생성한다. 예를 들어, 브래킷의 조합 ")) (("처음 몇 문자열은 오른쪽 괄호 괄호를 왼쪽보다, 괄호 조합이 명확하게 합법적 아닌 이상입니다.

 

        옵션 번호 [ '(', ')']이고; 되돌아 더 - 상기 네 개의 요소에 따라, 우리는 레드 노드는 현재 경로 "(("이며, 하나 하나 분석 되돌아 조건 : N 이하인 좌 괄호에서 덜 왼쪽에서 오른쪽 브래킷 괄호 번호 생성, 종료 조건 : 브래킷의 총 개수 * 2 코드는 다음과 같이 생성되는 N과 같다 :

클래스 솔루션 {
 공개 : 
    벡터 < 문자열 > 고해상도;
    INT는 왼쪽 = 0 ;
    INT의 오른쪽 = 0 ; 
    
    벡터 < 문자열 > generateParenthesis ( INT의 N) { 
        역 추적 ( "" , N);
        반환 입술을; 
    } 
    
    공극 역 추적 ( 문자열 TMP, INT N) 
    { 
        경우 (tmp.size () == N * 2 ) 
        { 
            res.push_back (TMP); 
            반환; 
        } 

        경우 (왼쪽 < N) 
        { 
            tmp.push_back ( ' ( ' ), 
            왼쪽 ++ ; 
            ) 역 추적 (TMP를 N; 
            tmp.pop_back ()을, 
            좌측 - ; 
        } 
        경우 (오른쪽 < 왼쪽) 
        { 
            tmp.push_back ( ' ) ' ); 
            바로 ++ ; 
            역 추적 (TMP, N); 
            tmp.pop_back (); 
            바로 - ; 
        } 
    }
};

 

추천

출처www.cnblogs.com/BobPong/p/12663204.html