2012-02-27 7 views
0

など。配列:{1,5、2、3、2、10}log(n)時間内にアレイのどの範囲で最大値を見つけるか?

範囲:0-1答え:5 範囲:2-4回答:3 範囲:0-5回答:10 等

+4

を。並べ替えられていないシーケンスで最大値を見つけるには、各値を少なくとも1回は調べなければなりません。これはアルゴリズムO(n)を作る。 – sbi

+0

@sbi:配列を前処理して、検索ツリー/テーブル/を構築しないと、サブレンジを検索するよりもすばやく最大のサブレンジを得ることができます。おそらく、それは質問が何を求めているかですが、それはちょっと狭いです。 –

+1

@Mike:それは本当ですが、私はそのような野獣を「並べ替えられていない配列」と呼んでいません。私はこの抜け穴を故意に残しました、あなたは知っていますか? ':)' – sbi

答えて

11

配列がソートされていない場合は、あなたが求めていることをする方法がありません。 にあなたは少なくとも必要最大値を見つけるには

はO(nはを)取る範囲ですべての要素を点検します。

データの前処理を許可すると簡単です。あなたは答えを使ってn ルックアップテーブルを構築することができます。次に、一定の時間内に任意の範囲の最大値を見つけることができます。

4

これは不可能です。すべての要素を訪問する必要があります。

あなたの配列が先験的にソートされている場合は、O(1)操作です。

0

@Daniel Talamas私が正しくあなたを理解している場合、あなたはこの欲しかっ:あなたがすることはできません

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 
int maxlement(int range1,int range2) { 
std::vector<int> v{ 1, 5, 2, 3, 2, 10 }; 
std::vector<int>::iterator result; 

result = std::max_element(v.begin()+range1, v.begin()+range2+1); 
int dist = std::distance(v.begin(), result); 
return v[dist]; 

} 
int main() { 
int range1,range2; 
cout<<"From "; 
cin>>range1; 
cout<<"To "; 
cin>>range2; 
cout<<"Max Element Is "<<maxlement(range1,range2); 
return 0; 
} 
+1

線形ではなく対数でのみ、時間。 –

関連する問題