Kadane 알고리즘
Kadane 알고리즘
“Kadane 알고리즘”은 연속된 부분 수열의 최대 합(Subarray Sum) 을
가장 효율적으로 구할 수 있는 알고리즘이다.
예를 들어 이런 문제가 있다.
“정수 배열이 주어졌을 때, 연속된 부분 구간의 합 중 최대값을 구하시오.”
예시로 이해하기
다음 수열을 보자.
[2, 3, -6, 1, 3, -1, 2, 4]
이 중 연속된 일부 구간을 골라 합이 최대가 되는 경우를 찾고 싶다.
눈으로 보면,
[3, -6, 1, 3, -1, 2, 4] 같은 구간을 여러 개 살펴보게 될 것이다.
하지만 이런 걸 전부 시도하면 너무 오래 걸린다. (최악의 경우 )
그래서 Kadane 알고리즘은 “한 번의 순회”만으로 최대 합을 찾아낼 수 있다!
아이디어: “지금까지의 최대 부분합만 기억하자”
이전까지의 구간 합이 양수라면 지금 원소에 더하는 게 이득이다.
반대로 음수라면 굳이 더할 필요 없이 새로 시작하는 게 낫다.
즉, 현재 원소 a[i]에서의 “최대 연속 부분합”은 다음 중 큰 값이다.
현재 원소 a[i]이를 점화식으로 표현하면 다음과 같다.
알고리즘 동작 예시
이때 dp[i]들 중 가장 큰 값은 9
즉, 연속 부분합 최대값은 9이다.
코드 예시 (Java)
public class Kadane {
public static long maxSubArraySum(int[] arr) {
long maxSum = arr[0];
long current = arr[0];
for (int i = 1; i < arr.length; i++) {
// 이전 합 + 현재 값 vs 현재 값 중 큰 쪽 선택
current = Math.max(arr[i], current + arr[i]);
maxSum = Math.max(maxSum, current);
}
return maxSum;
}
public static void main(String[] args) {
int[] seq = {2, 3, -6, 1, 3, -1, 2, 4};
System.out.println(maxSubArraySum(seq)); // 9
}
}시간 복잡도 분석
- 한 번의 반복문으로 모든 원소를 한 번씩만 확인
- 각 단계에서
max()연산만 수행
함께 읽으면 좋은 글
Manacher 알고리즘
팰린드롬은 문자열을 앞에서 읽으나 뒤에서 읽으나 동일한 형태로 읽히는 문자열을 의미한다. 예를 들어 아래와 같다. 그렇다면 임의의 문자열에서 가장 긴 팰린드롬을 구하려면 어떻게 해야할까? BANANA 라는 문자열을 생각해보자. 여기서 가장 긴 팰린드롬은 ANANA가 될 것이다.
[컴퓨터비전] 12. 장면 이해
1981년 노벨의학상은 Hubel과 Wiesel의 시각 신경망 연구에 수여됨 이들은 고양이의 시각 피질에 마이크로 전극을 삽입하여, 특정 에지 방향에 반응하는 뉴런이 존재함을 발견 이는 시각 피질이 에지 정보를 추출하는 구조로 되어 있음을 의미 깡충 거미는 네 쌍의 눈으로…
[컴퓨터비전] 11. 3차원 비전
본질 영상은 명암값에서 조명, 그림자 등의 외부 요인을 제거하고 물체의 고유한 성질만을 표현한 영상 사람은 외관과 본질을 구별할 수 있지만 컴퓨터는 일반적으로 외관만을 인식 본질 영상의 주요 예: Barrow(1978)가 본질 영상의 개념을 제안했지만, 명암 영상에서 본질…
[컴퓨터비전] 10. 모션
현실 세계는 정적인 이미지보다 움직이는 장면이 훨씬 많음 움직임은 두 가지로 나뉨: 움직임 분석을 통해 동작 인식, 물체 추적, 장면 이해 등 다양한 작업이 가능 대표적인 응용: 광류: 연속된 영상 프레임 사이에서 화소의 움직임을 추정하는 기법 기본 가정: 밝기 불변 가정…