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


20

a1,…,an0laibi0lbimax(|a1−b1|,…,|an−bn|)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 i 가 b 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 k 는 k 개의 서브 시퀀스에 할당 된 값 입니다. 이제, w 1 , 비 감소를 달성하기 위해 . . . , w k , 우리는 w k 에서 뒤에서 시작 하여 앞으로 나아갑니다. 경우 승 K - 1 보다 큰 wmaxw1,w2,...,wkkw1,...,wkwkwk−1 , 우리는 단순히 w k - 1 : = w k를 설정 합니다. 더 작 으면 유지합니다. 그런 다음 w k - 2 와 w k - 1 등을 비교하는 과정을 진행합니다. 참고 임의 낮추는 것을 w I을 의 값 w는 I + 1 서브 시퀀스의 maximium 값이 할당되기 때문에, 절대 편차가 증가하지 승 내가 항상 할당 서브 시퀀스의 최대 값보다 낮은 w I + 1 .wkwk−1:=wkwk−2wk−1wiwi+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[i−1]ai최소값을 사용하는 것보다 범위 미만인 경우 선택 가능한 범위 내에 있습니다. 이것에 분산을 최소화 알려진 제약을 부여.bi

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


2

교수의 해법은 다음과 같습니다. "환원": 0 에서 l 까지의 각 에 대해 편차가 i 보다 작거나 같다는 것을 알고 있다면 해를 구해보십시오 . 해를 구할 수있는 첫 번째 i 는 최소 편차입니다. O ( n ) 시간 의 편차가 주어지면 해를 구할 수 있습니다 . 따라서 실행 시간은 O ( n l ) 입니다. 그런 다음 선형 검색을 사용하는 대신 이진 검색을 사용하여 솔루션이 가능한 최소 편차를 결정할 수 있습니다. 이렇게하면 실행 시간이 O로 줄어 듭니다 ( n log li0liiO(n)O(nl)O(nlog⁡l), 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 |ai−bi|≤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 bi≥ai−d,bj≤aj+d<ai−2d+d=ai−d≤bi).

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 ai−aj≤2d for all i≤j 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.