나는 이것이 O (n log n) 일 수 있다고 믿습니다.
먼저 B
배열을 정렬하고 A
배열에 동일한 순열을 적용하고 순열을 기억하십시오. 이것은 O (n log n) 부분입니다. 우리는 모든 i에 대해 합을 구하기 때문에 A와 B 배열에 동일한 순열을 적용해도 최소값은 변하지 않습니다.
정렬 된 B
배열의 나머지 알고리즘은 실제로 O (n)입니다.
각 k에 대해 배열을 정의하십시오. C k [| i] - | B [i] - B [k] |
이
(참고 :. 우리는 실제로 우리는 단지 쉽게 추론에 대한 개념으로 사용할 것입니다 ... C K을 구성하지 않습니다)
을 양 우리 (K 이상) 최소화하기 위해 노력하고 있음을 관찰입니다 A [i] * Ck [i]의 합. 이제 가서 그 이름을 들어 보겠습니다 :
정의 : S K = Σ A [I] * C K C를 무엇 특정 k에 대한
이제 [I], K 어떻게 생겼어?
우물, C k [k] = 0, 명백하게.흥미롭게
자세히는 B의 배열이 정렬되어 있기 때문에, 우리는 절대 값의 부호를 제거 할 수
- C K [내가] = B [K] - B [I] 0 대 < = 1 < K
- C K [내가] = 0의 I = K
- C K [I] = B [I] - K < 대 B [K], I < N
두 가지를 더 정의 해 봅시다.
정의 : T K = Σ A [I] 0 < 대 = 1 < K
정의 : U K = Σ A [i]를 K <의 I < N
(즉, T k은 A의 첫 k-1 요소의 합계입니다. U k은 A의 첫 번째 k 요소를 제외한 모든 요소의 합계입니다.
,363,210
키 관찰 : S K 주어 T K 및 U K, 우리는 상수 S에게 K + 1, T K + 1 및 U K + 1을 계산할 수 시각. 방법?
T와 U는 쉽습니다.
질문은 어떻게 되나요? S k ~ S k +1 1?
우리가 C K + 1에 갈 때 C K 어떻게되는지 생각해 보자. 우리는 0에서 k까지의 C의 모든 원소에 B [k + 1] -B [k]를 덧붙이고 k의 모든 원소에서 k + 1에서 n까지 같은 양을 뺍니다 (이것을 증명하십시오). 즉, 우리가 K * T를 추가 할 필요 수단 - U를 (B [K + 1] B [K]) 및 감산 K * - S 에서 얻는 (B [K + 1] [K]가 B) k ~ S k + 1.
대수적으로 ... S k의 처음 k 항은 A [i] * (B [k] - B [i])의 0에서 k-1까지의 합계입니다. (- B [I] B [K + 1])
차이 사이 S K의
제 K 약관 + 1한다 k-1 A [i]는 *의 0부터 합인 이들은 (A [i] * (B [k] - B [i]) - (A [i] *)의 0에서 k- A [i] * (B [k + 1] - B [k])의 0에서 k-1의 합을 얻기 위해 A [i] 항을 분해하고 B [i] 항을 제거한다. 단지 T k * (B [k + 1] - B [k])이다.
S- k-의 마지막 n-k-1 항에 대해서도 마찬가지입니다.
우리는 선형 시간 S 0, T 0 및 U 0을 계산할 수 있고, 우리가 일정 시간 내에 S를 S K에서 K + 1 갈 수 있기 때문에, 우리는 계산할 수 모든 시간은 선형 시간으로 S k입니다. 그렇게하십시오, 가장 작은 것을 기억하십시오, 그리고 당신은 끝났습니다.
를 사용하여 정렬 순열의 역은 원래의 배열에 대한 k
를 얻을 수 있습니다.
@Dukeline입니다 : 나는 그가 단지 절대 값을 의미 가정합니다. – Nemo