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


11

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

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

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

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

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


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

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

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

≤f

回答:


10

m

A[0..n−1]B[0..n−1]m=maxiB[i]+i

max=maxiA[i]max≤m

A[j]B[k]A[j]≤max−n

B[k]+k≤B[k]+(n−1)=A[j]+(n−1)≤(max−n)+(n−1)=max−1<max≤m.

A[j]A[j]≤max−n[max−n,max]

A[max−n,max]m


... mmm ...しかし、C [x] = C [x] +1のコストは?!?
— マルツィオデビアージ

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

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

1
f(x,i)xi≤n|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Ω(nlog⁡n)A[i]=B[j]f(A[i],j)f


1
Aにn-1個のゼロと1個のゼロがある場合はどうなりますか?すると答えは、nは1である
— グリゴリーYaroslavtsev

A

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