일련의 알고리즘 - 여러 알고리즘 중 가장 큰 서브 어레이 분석

문제 설명 :
        수익 극대화를 달성하기 위해 일정 기간을 찾기 위해, 일정 기간 내에서 역사적 주가 곡선을 주어.
    
이해 :
        최대 혜택을 찾으려면, 당신은 구매 및 판매에 가격 변동의 크기이다 고려, 따라서 더 적절한 매일 재고 문제에서 변화의 크기를 고려해야합니다. 따라서, 위의 문제가 약간 변형 될 수있다 : 매일 일정 기간 내에 축적량 변화의 크기 감안할 때, 수익을 극대화하기 위해, 구매 및 판매 할 수있는 적절한 시간을 찾을 수 있습니다. 따라서, 다음과 같이 입력 데이터를 변환하고, 전체 기간의 누적 최대 하위 범위, 즉 최대 서브 어레이를 찾으려고.
    
폭력 해결 방법 :
        먼저 주어진 어레이 (범위)에서 가능한 알았는데, 그 서브 어레이 (일부)의 수를 C (2, N)이고, 상기 최대 값을 찾기 위해 모든 서브 어레이의 통과를 완료하기 쉽다 이 점진적으로 최악의 시간 복잡도 (θ)]는 N- ( 2 ). 다음과 같은 의사 코드에 주어진; 가정 일일 변동 (첨자 A가 1 내지 N이다) 배열 (A)에 저장된 폭 A.length는이 최종 결과는 튜플 반환되는 요소들의 수를 나타낸다
        BRUTE_FORCE (A)
            I을 . (1) =
            SUM은 = -Infinity는
            I에 대한 <= A.length, Inc의입니다. 1
                J = I는이
                0 = last_sum
                <= A.length, INC가입니다 J 대한. 1
                    last_sum = A + [J]
                    last_sum> 합 경우
                        합 = last_sum
                        개시 전 =
                        = j 개의 끝
            창 (시작, 끝, 합계)


나누고 해결하기위한 방법을 정복 :
        만족스럽지 못한 방법의 복잡성의 진보적 인 시간. 때로는 더 나은 시간 복잡도를 얻을 수 분할 및 정복 전략을 사용하여 정렬 병합 유사합니다. 일반적으로 하위 문제로 나누어 포함 분할 및 정복 전략은, 하위 문제를 해결 하위 문제를 병합합니다. 실질적 개념을 도입 할 수있다 : 첫 번째는 여전히는 A 고려 후 전술 한 바와 같이, 데이터 입력 방식을 가정하고, [1 ... n]은 두 개의 실질적으로 동일한 사이즈의 왼쪽 부분 배열 [1 ... 미드] 및 우측으로 분할 [중간 + 1 ... N], 중간 = (1 + N) / 여기서내림 다음 이러한 두 개의 서브 - 어레이 중 하나의 최대 안전 서브 어레이는, 두 개의 서브 어레이에 걸쳐있을 수있다 이 세 가지 각각의 경우를 해결 중 가장 큰 하위 배열이고 반환 할 수 있습니다.
        이 경우는 (n)이 O이고, 그것은 전체 시간 복잡도 최악 미만 허용해야되도록 스팬 개의 서브 어레이의 경우에, 시간 복잡도를 해결할 수 있다면 동안 좌 / 우 서브 어레이 재귀 해결할 수 θ (N- (2) ). 단지 모든 최대 서브 어레이 [MID]를 순회하여 온, 및 A [중간 + 1] 서브 어레이에 포함 된 경우, 이러한 경우에만 θ (N- 해결하기 위해 필요한 것이 분명 2 ) 번. 두 개의 서브 - 어레이를 가로 지르는 최대 서브 - 어레이가 서브 어레이 각각에서 할 필요가 있다고 추측 할 수있는 두 왼쪽 / 오른쪽 두 개의 서브 - 어레이를 각각 A [미드] 및 A [중간 + 1]의 모든 서브 - 어레이를 포함하는 조성물에 그것은 가장 큰,이 경우 최대 하위 배열 조건이 만족되지 않기 때문에 상기 한 바와 같이, 당신은 항상 더 큰 하위 배열을 찾을 수 있습니다.
        아이디어에 따르면, 전역에만 O (n)의 시간을 필요로 두 개의 하위 배열의 사건을 해결하기 위해 추정하기 쉽습니다. 다음과 같이 의사 코드가 제공된다 :
        (1) 하위 프로세스 : 최대 부분 배열을 통해 두 개의 하위 배열을 식별
            FIND_CROSSING_MAX_SUBARRAY (A, 낮음, 중간, 높음)
                left_sum = -Infinity
                합 = 0
                I = 중간
                의한하는 dec 난> = 로우 1 개
                    합 + = A [i]를
                    합계> left_sum 경우
                        left_sum = 합
                        left_index = 난                 right_sum = 무한대                 합 = 0                 난 = 중간 + 1                 난 = 높은 <들면 1 개 씩 증분                     합계 + = A [i]는                     경우 합계> right_sum                         right_sum = 합                         right_index = 1이                 리턴 (left_index, right_index, left_sum + right_sum)         分治法找出最大子数组(2)主过程
                









        

            FIND_MAX_SUBARRAY (A, 낮은 높이)
                저 IF == 높은
                    수익 (로우, 하이, A [저])
                다른
                    ((+ 낮은 높이) / 2) = 중간 down_trunc
                    (left_start, left_end, left_sum) =
                        FIND_MAX_SUBARRAY (A 낮은 중간)
                    (right_start, right_end, right_sum) =
                        FIND_MAX_SUBARRAY (A, 미드 + 1, 높이)
                    (cross_start, cross_end, cross_sum) =
                        ) (A, 저, 중, 고 FIND_CROSSING_MAX_SUBARRAY이                     경우 left_sum> right_sum 및 left_sum> cross_sum                         창 (left_start , left_end, left_sum)
                    


                    IF right_sum 다른> left_sum 및 right_sum> cross_sum
                        창 (right_start, right_end, right_sum)
                    사람의
                        창 (cross_start, cross_end, cross_sum)이
        상기 알고리즘에 점근 시간 복잡도 (NLG (N)) Θ 것을 알 수있다.


: 방법은 문제의 크기를 줄이기 위해
        조사를 요구하는 서브 배열의 수, 따라서 그것의 더 나은 시간 복잡도를 줄이기 위해, 기존의 정보를 기반으로하는지 여부, 검색 과정에서를? 하나 개의 아이디어는 이전에 축적 된 검사 요소를 반복하지 않고, 오른쪽, 왼쪽에서 소자, 즉 축적에있어서, 상기 저장된 최대 서브 어레이의 누적 합이 재 축적 소자 후의 요소로부터, 원소의 첨가 후 음수이면 전체 어레이까지 탐색이 완료된다. 아이디어는 효과가 제공하는 다음과 같은 가정을 증명하는 것입니다 :

  1. 서브 어레이의 가장 큰 원천은 세 가지 종류로 나눌 수있다 어레이 서브 섹션들의 어레이를 가로 질러 통과 할 수없는의 일부를 횡단하고, 두 부분의 배열
  2. 오른쪽 누적 합이 부정 될 때까지 좌에서 축적 된 경우, 결과적인 어레이의 최대 하위 부분들의 배열이 현재 최대로 이송되어 있음을 가정 할 수있다
  3. 누적 금액이 마이너스 인 경우라고 가정 할 수 있고, 소자 또는 왼쪽 소자의 소자 불가능 시작 부분 배열에서 최대 전위

        가정 1은 자명하다.
        가정은 A가 [1] 먼저 [i]를 제외하고는 축적 발생하는 누적 (1 <= i가 = N < ) 다음 A [i]를 부정적 상수 및 A [1] +를 .. . + A [I-1] > = 0. 난 = 2 <경우 2 명확히 확립 현재 가정한다. A로부터 확장 [1]은 바로 시작하는으로부터 개발 [i]를 좌 : 난> 2가 A [1] ... A [i]는 것을 고려하면, 서브 어레이의 모든 세 가지로 나눌 수있다 및 [1] 및 중간 서브 어레이 [i]를 포함하지 않는]로부터 명백한 확장 A [i]를 최대 가능 좌측 서브 어레이이며, [1] 및 [I]의 중간 부를 포함하지 않는 경우 서브 어레이의 배열 자사 좌측 서브 어레이에 새로운 구성으로 배열의 중간 부분이 발생할 수 있으며, 최대이며, 왼쪽 부분이 0이보다 항상 크기 때문에 서브 어레이는 항상,이 중간 부분 배열 이상인 될 (2)이 경우도 상정 입증. 전체 가설 2에 그것은 사실이다.
        3, 최대 전위 명확 서브 어레이 A [I]에서 가능하며, 가정 시작하기 때문에 A [I] <0. 좌측 서브 어레이 A [I]의 최대 전위는 상기 A [j]가 시작된다고 가정하면 (1 <= J <I) . 분명하지 j는 1과 동일하기 때문에 A [1] + ... + A [I] <0, 즉 J> 1, A [J] + ... + A [I]가 , 네거티브되어야하기 때문에 A [1 ] + ... + A가 [J = 1] 커야보다 같거나 0 A [1] + ... + A가 [I] 반드시 마이너스이다. 그래서 함께, A [i]를 왼쪽에서 전위 서브 어레이 찾고 또는 A는 [i]를 의미한다.
        다음의 의사 - 코드는, 시간 복잡도는 Θ (N)이다. 모든 부정적인 경우에, 특별한 치료는 시간 복잡도에 영향을 미칠 수 없습니다.
        LINEAR_SEARCH_MAX_SUBARRAY (A)
            SUM = -Infinity
            시작 = 0
            끝 = 0

            cur_sum = 0
            cur_start_index = 1

            I = 1
            의 I <= A.length, INC 1 씩
                cur_sum + = A [i]를
                cur_sum는 <0 인 경우
                    cur_sum = 0
                    cur_start_index = I + 1
                밖의
                    합 <cur_sum의 경우,
                        합계 = cur_sum
                        = cur_start_index 시작
                        단부 = I

            반환 (시작, 끝, 합계)

추천

출처www.cnblogs.com/SyBlog/p/11371922.html