알고리즘 도론 연습 제4장 제1절: 최대 서브 그룹의 귀속 실현
크로스오버의 가장 큰 자수조를 구하는 사고방식은 [i,mid]와 [mid+1,i]의 상황을 보고 이 두 가지 상황의 최대치와 경계를 구하고 최대치를 화합하면 크로스오버의 가장 큰 자수조와 좌우의 경계치를 찾을 수 있다.다음은 크로스오버의 가장 큰 하위 그룹을 구하는 C 언어의 실현이다.
int *findMaxCrossingSubarray(int arr[], int low, int mid, int high)
{
int *a = calloc(3, sizeof(int));
int leftSum = INT_MIN;
int leftMaxIndex = low;
int sum = 0;
for (int i = mid; i >= low; i--)
{
sum += arr[i];
if (sum > leftSum)
{
leftSum = sum;
leftMaxIndex = i;
}
}
int rightSum = INT_MIN;
int rightMaxIndex = high;
sum = 0;
for (int i = mid + 1; i <= high; i++)
{
sum += arr[i];
if (sum > rightSum)
{
rightSum = sum;
rightMaxIndex = i;
}
}
a[0] = leftMaxIndex;
a[1] = rightMaxIndex;
a[2] = leftSum + rightSum;
return a;
}
쉽게 누락되는 곳: 순환할 때 i의 경계 조건.다음 코드는 완전한 C 언어 반복 구현입니다.
//
#include
#include
#include
int *findMaxCrossingSubarray(int arr[], int low, int mid, int high); //
int *findMaximumSubarray(int arr[], int low, int high); //
int main()
{
int arr[16] = {13, -3, -25, 1, -3, 16, 23, 18, -20, -7, -12, -50, -22, 15, -4, 7};
int *result = findMaximumSubarray(arr, 0, 15);
printf(" %d", result[0]);
printf(" %d", result[1]);
printf(" %d", result[2]);
free(result);
return 0;
}
//
int *findMaxCrossingSubarray(int arr[], int low, int mid, int high)
{
int *a = calloc(3, sizeof(int));
int leftSum = INT_MIN;
int leftMaxIndex = low;
int sum = 0;
for (int i = mid; i >= low; i--)
{
sum += arr[i];
if (sum > leftSum)
{
leftSum = sum;
leftMaxIndex = i;
}
}
int rightSum = INT_MIN;
int rightMaxIndex = high;
sum = 0;
for (int i = mid + 1; i <= high; i++)
{
sum += arr[i];
if (sum > rightSum)
{
rightSum = sum;
rightMaxIndex = i;
}
}
a[0] = leftMaxIndex;
a[1] = rightMaxIndex;
a[2] = leftSum + rightSum;
return a;
}
int *findMaximumSubarray(int arr[], int low, int high)
{
int *a = calloc(3, sizeof(int));
if (high == low)
{
a[0] = low;
a[1] = high;
a[2] = arr[low];
return a;
}
int mid = (low + high) / 2;
int *leftResult = findMaximumSubarray(arr, low, mid);
int *rightResult = findMaximumSubarray(arr, mid + 1, high);
int *midResult = findMaxCrossingSubarray(arr, low, mid, high);
if (leftResult[2] >= midResult[2] && leftResult[2] >= rightResult[2])
{
free(rightResult);
free(midResult);
return leftResult;
}
else if (rightResult[2] >= midResult[2] && rightResult[2] >= leftResult[2])
{
free(leftResult);
free(midResult);
return rightResult;
}
else
{
free(leftResult);
free(rightResult);
return midResult;
}
}
복잡도는 O(nlgn)로 끝났습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.