상용 알고리즘 의 위조 코드

18767 단어 PAT 알고리즘
1. 분 치 전략
분 (Divide) 은 n 규모 의 문 제 를 k 개의 규모 가 작은 하위 문제 치료 (Conquer) 로 분해 하여 k 개의 키 문 제 를 각각 해결 한 다음 에 각 키 문제 의 해 제 를 합 쳐 원래 의 문 제 를 해결 하 는 분해 전략 은 아래 에서 위로 해결 하고 합병 하 는 것 이다.
Begin
          a[],    x,       i,     j
    i->0,j->a.length
  1.while(i<=j)    : 
    1.1    m =(i+j)/2;
    1.2 if(x==a[m]) return m;
    1.3 if(x<a[m]) j=m-1; else i=m+1;
  2.return -1; 
End 

2. 동적 계획
동적 계획 알고리즘 은 분 치 법 과 유사 하 다. 그 기본 사상 도 해결 해 야 할 문 제 를 몇 개의 키 문제 로 분해 하고 서브 문제 가 서로 독립 되 지 않 을 때 일부 상황 에서 서로 다른 서브 문제 의 수량 은 여러 가지 등급 만 있다. 즉, 분 치 법 으로 해결 할 때 일부 서브 문 제 는 반복 적 으로 계산 되 었 다.
  • 기본 요소 의 최 우수 서브 구조: 문제 의 최 적 화 는 그 서브 문제 의 최 적 화 를 포함한다.이런 성질 을 최 우선 자 구조 성질 중첩 자 문제 라 고 한다. 귀속 적 으로 문 제 를 풀 때 매번 발생 하 는 자 문 제 는 항상 새로운 문제 가 아니 라 일부 자 문 제 는 여러 차례 반복 적 으로 계산 된다.이런 성질 을 자 문제 의 중첩 성질 이 라 고 한다
  • 기본 적 인 절 차 는 최 적 화 된 성질 을 찾아내 고 그 구조 적 특징 을 묘사 하여 최 적 화 된 수 치 를 밑 에서 위로 계산 하 는 방식 으로 최 적 화 된 수 치 를 계산 할 때 얻 은 정 보 를 계산 하고 구조 가 최 적 화 된 것
  • /*0-1    */
    int knapSack(int W, int wt[], int val[], int n)
    {
       if (n == 0 || W == 0)
           return 0;
       if (wt[n-1] > W)
           return knapSack(W, wt, val, n-1); 
       else return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
                        knapSack(W, wt, val, n-1));
    }
    

    3. 욕심 산법
    말 그대로 욕심 산법 은 항상 현재 로 서 는 가장 좋 은 선택 을 한다.즉, 욕심 산법 은 전체적인 최 적 화 를 고려 하지 않 고 특정한 의미 에서 국 지적 으로 최 적 화 된 선택 일 뿐 입 니 다. 물론 욕심 산법 이 얻 은 최종 결과 도 전체적으로 가장 좋 기 를 바 랍 니 다.욕심 산법 은 모든 문제 에 대해 전체적인 최 적 화 를 얻 을 수 는 없 지만 많은 문제 에 대해 서 는 전체적인 최 적 화 를 이 룰 수 있다.예 를 들 어 단원 최 단 경로 문제, 최소 생 성 트 리 문제 등 일부 상황 에서 욕심 산법 이 전체적인 최 적 화 를 얻 지 못 하 더 라 도 그 최종 결 과 는 최 적 화 된 근사치 이다.
    욕심 산법 은 고려 해 야 할 부분 이다.
  • 후보 집 (C) 문제 풀이 가능 한 집합
  • 해 집 (S) 은 문제 의 완전한 해 를 만족 시 키 고 S 는 C 의 키 집합
  • 이다.
  • 실행 가능 한 해 함 수 는 S 가 문 제 를 구성 하 는 지 검증 하 는 데 사용 된다
  • 함수 선택 즉 욕심 전략 이자 욕심 산법 의 관건
  • 제약 함수 검 측 해 집 S 가 후보 대상 에 가입 하여 제약 을 만족 시 키 는 지
  • /*dijkstra        */
    Begin
        1    s={1},v={2...n},dist[i]=c[i][j];
        2
        2.1 u=min{dist[i][j]|i  v}
        2.2 s=sU{v},v=v-{u};
        2.3    v     i
        if(dist[u]+c[u][i]<dist[i][j]) dist[i]=dist[u]+c[u][j]
        3.  dist
    End
    

    4. 역 추적 법
    역 추적 법의 기본 적 인 방법 은 검색 이나 질서정연 하 게 조직 되 어 불필요 한 검색 을 피 할 수 있 는 궁 거 식 검색 법 이다.이런 방법 은 조합 수가 상당히 큰 문 제 를 푸 는 데 적용 된다.역 추적 법 은 문제 의 해 공간 트 리 에서 깊이 우선 전략 에 따라 뿌리 노드 에서 공간 트 리 를 검색 합 니 다.알고리즘 은 공간 트 리 의 임 의 한 점 을 검색 할 때 이 노드 에 문제 의 해 가 포함 되 어 있 는 지 여 부 를 판단 합 니 다.만약 에 포함 되 지 않 는 다 면 이 결점 이 뿌리 인 나무 에 대한 검색 을 뛰 어 넘 고 조상 들 의 결점 을 거 슬러 올라간다.그렇지 않 으 면 이 하위 트 리 에 들 어가 깊이 우선 정책 에 따라 계속 검색 합 니 다.
    기본 사상
  • 주어진 문제 에 대해 문제 의 해결 공간 을 정의 한다
  • 검색 하기 쉬 운 공간 구조 확인
  • 깊이 우선 순위 로 공간 을 검색 하고 검색 과정 에서 가지치기 함수 로 잘못된 검색 을 피한다
  • 가지치기 함수 (Pruning Function): 제약 조건 이나 목표 함수 의 경계, 즉 이 노드 에 문제 의 해 가 포함 되 어 있 는 지 여 부 를 판단 합 니 다.포함 되 지 않 을 것 이 라면 이 노드 를 뿌리 로 하 는 하위 트 리 에 대한 검색 을 건 너 뛰 는 것 이 바로 가지치기 입 니 다.
    /*0-1        */
    Begin
         Backtrakc(i)    i      
        1. if(i>n)      bestp,    
        2. if        cw+w[i]<c,     
           2.1 cw+=w[i];    cp+=v[i];
           2.2         Backtrack(i+1);
           2.3   ,cw-=w[i],cp=v[i]];
        3.   Bound(i+1)>bestp,     , Backtrack(i+1)
    End
    

    5. 분기 한계 법
    구 해 목표: 역 추적 법의 구 해 목 표 는 공간 트 리 에서 제약 조건 을 만족 시 키 는 모든 해 를 찾 는 것 이 고 분기 한계 법의 구 해 목 표 는 제약 조건 을 만족 시 키 는 해 를 찾 거나 제약 조건 을 만족 시 키 는 해 에서 특정한 의미 에서 가장 좋 은 검색 방식 의 차 이 를 찾 는 것 이다. 역 추적 법 은 깊이 우선 의 방식 으로 공간 트 리 를 검색 하 는 것 이다.한편, 분기 한계 법칙 은 너비 우선 또는 최소 소모 우선 방식 으로 공간 트 리 검색 방식 이 다 릅 니 다. 역 추적 법 은 깊이 우선 방식 으로 공간 트 리 를 검색 하고 분기 한계 법칙 은 너비 우선 또는 최소 소모 우선 방식 으로 공간 트 리 를 검색 합 니 다.
    기본 사상
    분지 한계 법 에서 모든 활 결점 은 단지 한 번 의 기회 만 이 확장 결점 이 된다.활성 점 이 확장 점 이 되면 모든 아들 의 결점 이 한꺼번에 생 긴 다.이 아들 들 의 결점 에서 풀 수 없 거나 가장 잘 풀 리 지 않 는 아들 의 결점 이 버 려 졌 고 나머지 아들 의 결점 은 활성 점 표 에 들 어간 후에 활성 점 표 에서 다음 결점 을 떼 어 내 현재 확장 점 이 되 었 으 며 상기 결점 확장 과정 을 반복 했다.이 과정 은 필요 한 해 나 활성 점 표를 찾 을 때 까지 계속 되 었 다.
    /*0-1        */
    /*           */
    Begin
        1                 down;         up;
        2.3. for(i=l;i<=n;i++)
           x[i]= 0;
        4. k=l;i=0; //  k      ,i  k-1       
        5. while (k>=l)
        5.1 x[k]=l;
        5.2 while (x[k]<=n)
        5.2.1     k    x[k]5.2.1.1        lb;
        5.2.1.2  lb<=up,  i,<x[k],k>lb        ;
        5.2.2 x[k]=x[k]+l;
        5.3   k==n      lb         ,
                          ;
        5.4   ,  k==n            lb     , 
        5.4.1 up=             lb ;
        5.4.25.5 i=     lb      x k]5.6 k=     lb      k ;k++;
    End
    

    좋은 웹페이지 즐겨찾기