최대화하는 방법


9

나는 항상 긴 줄로 줄어드는 많은 알고리즘 문제를 봅니다.

당신은이 정수 배열을h[1..n]0, 당신은 찾아야합니다 i,j 그런 최대화 (h[j]h[i])(ji)O(n) 시각.

분명히 O(n2) 시간 솔루션은 모든 쌍을 고려하는 것이지만 식을 최대화 할 수있는 방법이 있습니까? O(n) 의 속성에 대해 다른 것을 몰라도 h?

내가 생각한 한 가지 아이디어는 해결하는 것입니다. j다음을 찾아야합니다 i ...에서 1j1 그건 같다 argmaxi{(h[j]h[i])(ji)} 또는 argmaxi{h[j]jh[j]ih[i]j+h[i]i} 이후 j 고정되면 우리는 필요합니다 argmaxi{h[j]ijh[i]+ih[i]}.

그러나, 나는 제거 할 방법이 없다 j내부의 종속 용어. 어떤 도움?


의지 O(nlogn)해결책이 도움이 되겠습니까?
xskxzr

@xskxzr 확실하다면
AspiringMat

답변:


5

이것은 O(nlogn)해결책. O(n)Willard Zhan지적한 솔루션 은이 답변의 마지막에 추가됩니다.


O(nlogn) 해결책

확신을 위해 f(i,j)=(h[j]h[i])(ji).

밝히다 l1=1, li 가장 작은 지수가되도록 li>li1h[li]<h[li1]. 마찬가지로, 정의r1=n, ri 가장 큰 지수가 ri<ri1h[ri]>h[ri1]. 시퀀스l1,l2,...r1,r2, 계산하기 쉽다 O(n) 시각.

없는 경우 i<j 그런 h[i]<h[j] (즉 f(i,j)>0)는 사소합니다. 우리는 이제 사소한 경우에 중점을 둡니다. 이러한 경우 솔루션을 찾으려면 해당 쌍만 고려하면됩니다.

각각 i<j 그런 h[i]<h[j], 허락하다 u 가장 큰 지수가 lui, v 가장 작은 지수가되도록 rvj그런 다음 h[lu]h[i] (그렇지 않으면 lu+1i 의 정의에 의해 lu+1따라서 다음의 정의와 모순된다 u) 및 유사하게 h[rv]h[j]. 그 후

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
이것은 우리가 쌍만 고려하면된다는 것을 의미합니다 (lu,rv) 어디 lu<rv.

표시 v(u)=argmaxv: lu<rvf(lu,rv)우리는 다음과 같이 정리했다.

쌍 여기서 , 및 존재 위치를 같은 그런 및 또는되도록 및 최종 최적의 해결책이 될 수 없다.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

증명. 의 정의에 따라, 우리가 또는 v(u0)

(h[rv(u0)]h[lu0])(rv(u0)lu0)(h[rv]h[lu0])(rvlu0),
(h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)0.

경우 여기서 및 , 참고 및 , 또한 및 , u<u0v<v(u0)h[rv]h[rv(u0)]<0rvrv(u0)>0lu<lu0h[lu]>h[lu0]

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))> (h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0)).

이것은 또는

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)>0,
(h[rv(u0)]h[lu])(rv(u0)lu)>(h[rv]h[lu])(rvlu).

따라서 은 보다 훨씬 나은 솔루션 입니다. 다른 경우에 대한 증거는 비슷합니다. (lu,rv(u0))(lu,rv)

먼저 계산할 수 있습니다. 여기서 은 시퀀스 의 길이이며, 대한 중 최적 솔루션 을 재귀 적으로 계산합니다 및 및 대한 중 최적 솔루션 및 . 기본 정리로 인해 글로벌 최적 솔루션은 합니다.v(/2)l1,l2,o1(lu,rv)u=1,,/21v=v(/2),v(/2)+1,o2(lu,rv)u=/2+1,/2+2,v=1,,v(/2){(l/2,rv(/2)),o1,o2}


O(n) 솔루션

하자 경우 . 증명은 또한 및 의 경우 이면 . 이것은 행렬 이 완전 모노톤 행렬 임을 의미합니다. 여기서 는 시퀀스 의 길이입니다 (그래서 은 끝에서 번째 요소를 의미합니다. ) 그런 다음 SMAWK 알고리즘 을 적용하여 최소값 을 찾아 최대 값 를 찾을 수 있습니다 .f(lu,rv)=lurvu>u0v>v0f(lu0,rv0)f(lu0,rv)f(lu,rv0)>f(lu,rv)M[x,y]:=f(lx,rcy+1)cr1,r2,rcy+1yMf


1
증명 한 것은 는 모노톤 행렬이므로 나누기와 정복은 알고리즘을 제공합니다. 그러나 실제로 가 Monge 임을 증명할 수 있으므로 SMAWK 알고리즘 을 적용 할 수 있습니다. f(lu,rv)O(nlogn)f(lu,rv)O(n)
Willard Zhan 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.