욕심 많은 알고리즘을 사용하여 주어진 것과 가장 가까운 비 감소 시퀀스를 찾는 방법은 무엇입니까?


20

a1,,an0laibi0lbimax(|a1b1|,,|anbn|)biO(nl4)

나는 솔직히이 질문을 해결하기 시작하는 방법을 전혀 모른다. 그것은 역동적 인 프로그래밍 질문처럼 보이지만 교수는 욕심 많은 알고리즘을 사용 하여이 문제를 해결해야한다고 말했습니다. 누군가가 작은 힌트를 주면서 올바른 방향으로 나를 가리킬 수 있다면 대단히 감사하겠습니다.

답변:


9

다음 관찰로 시작하겠습니다.

하자 나타내고 시퀀스의 최대 1 , . . . , a n , 및 m i n 이 최소값을 나타내 도록하자 . 경우 1 =가 있어요 X를 다음 선택 b를 1 = B (2) = . . . = b n = ( m a x + m i n ) / 2 가 최적입니다.maxa1,...,anmina1=maxb1=b2=...=bn=(max+min)/2

왜 그런가요? 시퀀스가 최대 값으로 시작하기 때문에 크게 선택 하고 시퀀스의 최소값에서 큰 편차를 겪거나 (이후의 b ib 1 보다 크거나 같아야하므로 ) b 1 작게 선택합니다 m a x 로의 편차를 겪는다 . 평균은 최대 편차를 최소화합니다.b1bib1b1max

이제이 관측 값을 일반화하여 일반 시퀀스 . 예를 들어, 우리는 각각의 시퀀스를 서브 시퀀스로 분할하여 각각이 서브 시퀀스의 최대 값으로 시작되도록 할 수 있습니다.a1,...,an

예 : ( 2 ) , ( 6 , 4 , 1 , 5 , 2 ) , ( 8 , 7 , 5 , 1 ) .(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)

이 파티션을 감안할 때, 우리는 이제 별도로 각이 서브 시퀀스를 해결하고의 할당받을 수 있습니다 그러나 비 감소 조건을 위반할 수의를. 이것은 최적의 손실없이 수정 될 수 있습니다.bi

마지막 하위 시퀀스에는 항상 전체 시퀀스 의 최대 가 포함 됩니다 (그렇지 않으면 이후에 다른 하위 시퀀스가 ​​있음). w 1 , w 2 ,로 하자 . . . , w kk 개의 서브 시퀀스에 할당 된 값 입니다. 이제, w 1 , 비 감소를 달성하기 위해 . . . , w k , 우리는 w k 에서 뒤에서 시작 하여 앞으로 나아갑니다. 경우 K - 1 보다 큰 wmaxw1,w2,...,wkkw1,...,wkwkwk1 , 우리는 단순히 w k - 1 : = w k를 설정 합니다. 더 작 으면 유지합니다. 그런 다음 w k - 2 w k - 1 등을 비교하는 과정을 진행합니다. 참고 임의 낮추는 것을 w I을 의 값 w는 I + 1 서브 시퀀스의 maximium 값이 할당되기 때문에, 절대 편차가 증가하지내가 항상 할당 서브 시퀀스의 최대 값보다 낮은 w I + 1 .wkwk1:=wkwk2wk1wiwi+1wiwi+1

이 알고리즘은 정확해야한다고 생각합니다. 실행 시간과 관련하여 핵심 단계는 하위 시퀀스에 대해 증가하는 최대 값을 계산하는 것이며, 이는 ? 내가 어디에 기여 하는지 확실하지 않습니다 .O(n)l


2

나는 당신이 준 힌트를 통해 일하면서 크게 크게 생각할 것입니다. 이 먼저 시도해야한다는 원래 힌트로 이동합시다 . 그 시간이있는 욕심 많은 알고리즘을 생각할 수 있습니다.O(nl)

시간 복잡도 의 부분은 각 값 0 의 각 발생 횟수 목록을 유지할 수 있음을 의미합니다 . l . 즉, 세트 에서 각 l 의 개수를 추적하는 Count = C 0 , , C l 세트를 작성하기 만하면 됩니다. 입력 순서를 한 번 스캔하여 초기화 목록을 작성할 수 있습니다.l0..lCount=C0,,Cll

이 목록을 로 스캔 하여 최대 값과 최소값을 얻을 수 있습니다. b 의 전체 목록을 이 중간 점 으로 채우 려면 분산이 단순히이 값과 최대 / 분의 차이 일 것입니다. 이것은 기본적으로 최악의 시나리오 입니다. b w 라고합시다 .O(l)bbw

그래서 당신의 방식으로 작동 왼쪽에서합니다. Count 에서이 elemeent를 삭제 하고 O ( l ) 에서 b [ i + 1 ] b [ n ] 의 최소 ​​/ 최대 값을 얻을 수 있습니다 . 이제 우리는 탐욕 스러울 수 있습니다. 우리는 b i > b w를 선택하지 않기 때문에 나머지 전체 목록을 강제로 (비 감소 요구 사항을 충족시키기 위해) 강제로 분산을 증가 시키므로. 우리가 선택할 수있는 최소값은 b [ i - 1 ] 입니다. 만약 biCountb[i+1]b[n]O(l)bi>bwb[i1]ai최소값을 사용하는 것보다 범위 미만인 경우 선택 가능한 범위 내에 있습니다. 이것에 분산을 최소화 알려진 제약을 부여.bi

이것은 단지 아이디어 일 것입니다. 아마 운이 좋으며 올바른 방향으로 당신을 가리 킵니다. 이 알고리즘은 작동하지 않을 수도 있지만 (몇 가지 간단한 테스트에서는 가능) 주어진 힌트와 일치하므로 도움이 될 수 있습니다. 는 것을 쉽게 알 수있다 올바른 경우 확실히 일부 캔가 삭제 될 O ( 로그 리터 ) 에 대한 더욱, 나는 확실하지 않다.O(l)O(logl)


2

교수의 해법은 다음과 같습니다. "환원": 0 에서 l 까지의 각 에 대해 편차가 i 보다 작거나 같다는 것을 알고 있다면 해를 구해보십시오 . 해를 구할 수있는 첫 번째 i 는 최소 편차입니다. O ( n ) 시간 의 편차가 주어지면 해를 구할 수 있습니다 . 따라서 실행 시간은 O ( n l ) 입니다. 그런 다음 선형 검색을 사용하는 대신 이진 검색을 사용하여 솔루션이 가능한 최소 편차를 결정할 수 있습니다. 이렇게하면 실행 시간이 O로 줄어 듭니다 ( n log li0liiO(n)O(nl)O(nlogl), which satisfies the requirement of O(nl4).


4
So the O(nl4) was a trick... But I am more intrigued by the "We can find a solution given the deviation in O(n) time" .. how is that not the interesting part?
jmad

@jmad Given i, for each j, take bj as the lowest value which is at least as big as all previous bk, and which is no more than i away from aj. If we can't find such a value, what does it mean? It means that a previous bt is more than i bigger than aj. So a previous at is more than 2i bigger than aj. So that value of i wasn't possible. If you get through the n values without getting stuck like this, you have found a solution for i without backtracking, in time O(n).
jwg

O (n log l) would have been a strong hint that you need to do some binary search over the range 0 to l.
gnasher729

0

I think this should be doable in O (n).

Take the similar problem: Given ai, 1 ≤ i ≤ n, and d ≥ 0, find bi in non-descending order such that |aibi|d for all i, or show that it isn't possible. This can be done in O (n), and using binary search the original problem is solved in O (n log l).

Now if there are i ≤ j such that a_i - a_j > 2d, then there is no solution (because biaid,bjaj+d<ai2d+d=aidbi).

But if a_i - a_j ≤ 2d for all i ≤ j then I think a solution will always be found. So all we have to do is find m = max (a_i - a_j) for all i ≤ j, and choose d = floor ((m+1) / 2). That maximum can be found in O (n).


Intriguing idea! I can believe something like this might work, but it seems like there's a big gap at the end of your answer and I'm having a hard time filling in the details. Do you have a proof that if aiaj2d for all ij then a solution always exists? More importantly, how do we find it? The original question says we must find the bi's. Even if we assume a solution exists, I'm having difficulty seeing how to find the corresponding bi's. Can you elaborate on that?
D.W.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.