이동 된 최대 값을 찾기위한 선형 시간 알고리즘


11

음이 아닌 정수를 포함 하는 배열 이 주어 졌다고 가정합니다 (반드시 구별되지는 않음).A[1..n]

증가하지 않는 순서로 를 하자 . 를 계산하려고합니다 BA

m=maxi[n]B[i]+i.

확실한 해결책은 A를 정렬 A 다음 m 을 계산하는 것 입니다m . 최악의 경우 O (n \ lg n) 시간에 실행되는 알고리즘을 제공합니다 O(nlgn).

더 잘할 수 있습니까? 선형 시간으로 m 을 계산할 수 있습니까 ?


내 주요 질문은 위의 질문입니다. 그러나 다음과 같은 문제의 일반화에 대해 아는 것이 흥미로울 것입니다.

하자 B 될 일부 비교 오라클에 따라 정렬 \ 당량f를 오라클 주어진 기능. \ leqf에 대한 A 와 oracles가 주어지면 m = \ max_ {i \ in [n]} f (B [i], i) 계산에 필요한 시간에 대해 무엇을 말할 수 있습니까?AfAfm=maxi[n]f(B[i],i)

여전히 O (n \ lg n) 시간으로 m 을 계산할 수 있습니다 . 그러나이 일반화 된 사례에 대해 초 선형 하한을 증명할 수 있습니까?O(nlgn)

대답이 '예'이면 가 정수의 일반적인 순서이고 가 "좋은"함수 (모노톤, 다항식, 선형 등) 라고 가정하면 하한값은 유지 됩니까?f

답변:


10

선형 시간으로 을 계산할 수 있습니다 .m

간단히하기 위해 배열이 0 기반이라고 가정합니다 : , . 를 계산하려고합니다 .A[0..n1]B[0..n1]m=maxiB[i]+i

하자 . 분명히 입니다.max=maxiA[i]maxm

하자 될 정렬 한 후. 만약 우리가 A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

그러므로 우리는 무시해 때 . 범위의 숫자 만 고려하면됩니다 .A[j]A[j]maxn[maxn,max]

계수 정렬을 사용하여 선형 시간으로 범위에있는 의 숫자를 정렬 하고 정렬 된 목록을 사용하여 을 계산할 수 있습니다.A[maxn,max]m


... mmm ... 그러나 C [x] = C [x] +1의 비용은 얼마입니까?!
Marzio De Biasi

1
답변에 문제가 있습니까? 그것은 나에게 괜찮아 보이기 때문에 : 당신은 우리가 값을 가진 배열 요소에 대해서만 관심을 가지 므로 카운트 정렬을 사용할 수 있습니다. 이것은 항상모든 대해 . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov

감사합니다 @Marzio. :) 명확성을 위해 답변을 약간 수정했습니다. 편집 내용을 롤백하거나 추가로 편집하십시오.
Kaveh

1
이 솔루션은 모든 및 에 대해 에서도 작동하는 것 같습니다 . . f(x,i)xin|f(x,i)x|=O(n)
Kaveh

@Kaveh : 편집은 괜찮습니다! -S : 나는 빨리 답을 쓰고 난 확실히 그 correcteness의 아니었다
MARZIO 드 BIASI을

-1

어레이의 경우 다른 정수로 구성하고 에 인접 엔트리 사이의 거리 때문에 최소 인 ; 상황이 명확하지 않아도 더 흥미 롭습니다.Am=max(A)+1B1

더 일반적인 질문으로, 때 가 "관심있는" 상황을 상상해보십시오 . 알기 전에 모든 대해 를 쿼리하도록하는 적대적인 인수를 구성하는 것이 가능 하므로 를 정렬해야 합니다. 비교 가 필요한 답을 찾으십시오 . ( 를 쿼리하여 선형 시간이 아닌 상수로 인지 테스트 할 수 있기 때문에 약간의 문제가있을 수 있습니다 .) 는 (고도) 다항식입니다.f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
A에 n-1 개의 0과 하나의 0이 있으면 어떻게됩니까? 그러면 대답은 1이 아니라 n입니다.
Grigory Yaroslavtsev

안녕 유발. 반복되는 숫자가있을 수 있습니다 . Grigory가 말했듯이 솔루션이 작동하지 않는 것 같습니다. A
Kaveh

나는 하한 인수에 대한 당신의 생각을 본다고 생각합니다 : 주어진 우리는 시간 의 문제를 해결하는 알고리즘에 의해 에 만들어진 쿼리 쌍을 사용하여 빠르게 계산할 수 있습니다 . 알고리즘이 에 대해 를 쿼리 하도록 할 수 있지만 다른 쌍을 쿼리하지는 않습니다. 그러나 다른 쌍에 대해 를 구별 가능한 값으로 설정하여 해당 쌍을 버릴 수 있습니다. ABfo(nlgn)f(B[i],i)f
Kaveh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.