シフトした最大値を見つけるための線形時間アルゴリズム


11

非負の整数を含む配列が与えられていると仮定します(必ずしも区別されない)。A[1..n]

してみましょうあること、Aは非増加順にソート。私たちは、計算したい メートル= 最大I [ N ] B [ I ] + I BA

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

明らかな解決策は、を並べ替えてからmを計算することです。これにより、最悪の場合に時間O n lg n で実行されるアルゴリズムが得られます。AmO(nlgn)

もっと良くすることは可能ですか?線形時間でを計算できますか?m


私の主な質問は上記のものです。しかし、次の問題の一般化について知ることは興味深いでしょう。

LET Aは、いくつかの比較オラクルに従ってソート 及びfは、Oracleによって与えられる機能。与えられたAと神託のためF、我々は計算するのに必要な時間について何を言うことができるメートル= 最大I [ N ] F B [ I ] I BAfAfm=maxi[n]f(B[i],i)

それでも、O n lg n 時間でを計算できます。しかし、この一般化されたケースの超線形下限を証明できますか?mO(nlgn)

f

回答:


10

m

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のコストは?!?
マルツィオデビアージ

1
[Mn,M]|f(B[i],i)B[i]|=O(n)i

@Marzioに感謝します。:)わかりやすくするために、回答を少し編集しました。編集をロールバックするか、さらに編集してください。
カベ

1
f(x,i)xin|f(x,i)x|=O(n)

@Kaveh:編集は大丈夫です!私はすぐに答えを書いて、私はそのcorrectenessの確認さえありませんでした:-S
マルツィオ・デ・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個のゼロと1個のゼロがある場合はどうなりますか?すると答えは、nは1である
グリゴリーYaroslavtsev

A

ABfo(nlgn)f(B[i],i)f
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.