整数要素のシーケンスS
が与えられた場合、次のようなインデックス i とインデックス j (両方を含む) の間のシーケンスの最小要素を見つける関数が必要です。n
min(i,j)
- 初期化には時間がかかり
O(n)
ます。 - メモリ空間
O(n)
; min(i,j)
かかりますO(log(n))
。
このためのアルゴリズムを提案してください。
整数要素のシーケンスS
が与えられた場合、次のようなインデックス i とインデックス j (両方を含む) の間のシーケンスの最小要素を見つける関数が必要です。n
min(i,j)
O(n)
ます。O(n)
;min(i,j)
かかりますO(log(n))
。このためのアルゴリズムを提案してください。
Segmenttree は、すべての要件を満たすため、必要なものです。
これに加えて、ツリーは動的であり、O(log n) での更新をサポートできます。これは、O(log n) の要素 i の要素を変更しても、最小値を取得できることを意味します。
セグメント ツリーはまさに必要なものです (時間内に構築できO(n)
、1 つのクエリに時間がかかりますO(log n)
)。これに関する記事は次のとおりです: http://wcipeg.com/wiki/Segment_tree。初期化に時間を使用し、クエリごとに時間
を使用するアルゴリズムがありますが、セグメント ツリーの方がはるかに単純であるため、適切な選択になる可能性があります。O(n)
O(1)
この TopCoder チュートリアル: An < O(n), O(1) > approachでは、問題についてより詳細に説明しています。表記法では、アプローチがセットアップに f(n) の複雑さを要し、クエリに g(n) の複雑さを要することを意味します。
また、この記事でもアルゴリズムを噛み砕いています: Range Minimum Query <O(n), O(1)> approach (from tree to limited RMQ)。
彼らがあなたの質問を明確にしてくれることを願っています:)