2012-05-21 2 views
0

실행 시간을 O (n * logn)으로 만들기 위해 나누기 및 정복 방법을 사용하여 다음 알고리즘을 구현하려고합니다. 나누기 및 정복을 사용하여 간단한 알고리즘 구현

는 i와 j를 찾아되도록 1 < = J를 참조 A_1, A_2, ... a_n 및 번호 (k)의 시퀀스를 감안 - I < = K A_I + a_j을 극대화. 시퀀스 102081710,11 및 K = 2의 예

는 최대 값 = 8 + 7

I가 구현 15 어떤 종류의 나누기와 정복 방법이지만, 각 나누기 간격을 가로 지르는 값을 확인하는 방법을 알아 내려고 애 쓰고 있습니다.

int MaxInterval(int array[], int left, int right, int k) 
{ 
    int BestSum = 0; 
    int sumL = 0; 
    int sum = 0; 
    int sumR = 0; 
    int sumMid = 0; 
    int count = 0; 
    if(right - left <= 2*k-3) // 
    { 
     //elaborate straightforward search right way 
     for(int i = left; i <= right; i++) 
     { 
      sum = 0; 
      count = k; 
      for(int j = i+1; j <= right; j++) 
      { 
       if(count == 0) break; 
       sum = array[i] + array [j]; 
       if(sum > BestSum) BestSum = sum; 
       count--; 
      } 

     } 
     return BestSum; 
    } 
    int mid = (right + left)/2; 
    sumL = MaxInterval(array, left, mid, k); 
    sumR = MaxInterval(array, mid + 1, right, k); 
    sumMid = MaxInterval(array, max(left, mid - k + 2), min(right, mid + k - 1), k); 
    return max(max(sumL, sumR), sumMid); 
} 

내가 좀 무슨 권리 트랙이, 난 그냥 간격이 가로 질러 갈 수의 검사 합계를 통합하는 방법을 알아 내기 위해 사투를 벌인거야 오전 생각 : 여기에 지금까지 무엇을 가지고 O (n^2) 복잡도를 산출 할 수있는 brute-force 방법을 사용하지 않아도된다.

나는 이것을 계속할 수있는 방법에 대한 조언이나 조언이 있으면 크게 환영 할 것입니다. 또한, 배열에 짝수 개의 정수가 있다는 가정하에 현재 작업 중입니다. 고마워.

+2

이 문제는 공간 복잡성 O (k)가 허용되는 경우 O (N) 시간에 해결 될 수 있습니다. http://home.tiac.net/~cri/2001/slidingmin.html을보십시오 (그리고 StackOverflow에서 슬라이딩 윈도우 최소에 대한 몇 가지 주제가 있습니다) – MBo

+0

머리를 주셔서 감사합니다. 나는 여전히 어떻게 작동 하는지를보기 위해 divide-and-conquer 메서드를 사용하여 이것을 구현하고 싶다. – Tesla

답변

1

의사 코드의 몇 가지 단서. n = 8, k = 2의 예 -이 코드는 [0..3], a [4..7] 및 a [2..5]에서 최상의 결과를 검색합니다. 추가 배열을 제거했습니다.

int MaxInterval(int array[], int left, int right, int k) 
{ 
    if(right - left <= 2*k-1) // 
    { 
     //elaborate straightforward search right way 
     return BestSum; 
    } 
    sumL = MaxInterval(array, left, mid, k); 
    sumR = MaxInterval(array, mid + 1, right, k); 
    sumMid = MaxInterval(array, max(left, mid - k + 1), min(right, mid + k), k); 
    return max(sumL, sumR, sumMid); 
} 
+0

if 문에서 "<="대신 "right-left <2 * k - 3"이되어서는 안됩니다. k = 3이므로 [0..3]을 검사하면 k의 최대 값과 반대로 4 개의 요소를 검사하게됩니까? – Tesla

+0

경계에 남겨진 k-1 요소와 국경에 k-1 요소를 점검해야합니다. 2k-2 개의 엘리먼트는 [l..l + 2 * k-3]의 범위를 차지한다. k = 3 인 경우 4 원소를 확인해야합니다. – MBo

+0

오케이, 이제 알겠습니다. 그래서 간단한, 거의 짐승 같은 수표 만 구현하면됩니까? 왼쪽부터 시작해서, 오른쪽으로 k 원소를 합하고, 왼쪽으로 +1, 오른쪽으로 k 원소 합계 등을 합계를 비교하면서 계속합니다. – Tesla

관련 문제