私はnレコード数(キー、値)を持っているとします。データ取得時のループとバイナリ検索のパフォーマンス
今度は値を取得するためにx個のキーを探したいと思います。
xが小さいと、バイナリ検索がすべてのレコードをループして正しいキーを探すよりも効率的です。 BinarySearchはJava 8の配列の一部です。検索を実行する前に配列が既にソートされていると仮定すると、
だから私の時間計算量はO(XログN)である+ O(X)
は説明:
- Oは(Nをログ)バイナリサーチ の複雑さであります
- O(X)は、価値を得ることの複雑さです。
- O(XログN)私はXが大きすぎる(近いNの値)になった場合、
のためにしかし、いくつかのポイントを見てみたいレコードの数に会費、それはと思われますちょうど私の記録のすべてを1つのループを実行し、その後、私は値を出すために必要なすべてのキーと比較すると、より効率的である...この解決のために
for(Record record : records){
//Since the columns that I look for start with a specific prefix.
//This one is one of the factor that makes me confused
//when checking the performance.
if(record.key.startWith(key-family){
switch(record.key){
case key 0:
getvalue
break;
.......
case key x:
getvalue
break;
}
}
}
、私の複雑さはO(N)+ですO(NX)
は説明:
- Oは(N)はforループ
- O(NXの複雑さ)switch文の複雑さとなっ値OUT(最悪の場合)までですループが行われます。
レコードのキーの出現が一様ではないとすれば、一部のレコードコレクションでは、キーファミリから始まるキーの数が大幅に異なり、他のレコードコレクションと比較されます。
私の質問は以下のとおりです。
どのように我々はXが大きすぎると、バイナリ検索ソリューションとなって非効率性をするときに定義する必要がありますか?
私はあなたから学ぶことができるものはありますか? :)
ありがとうございます。
を限り私が知っていると理解して、あなたの配列は、時間の複雑さのためにソートされている場合バイナリ検索はO(log n)です。これは常に配列をループするよりも優れています。 –
"これは常に配列をループするよりも優れています。" Big-oh表記は漸近的な境界です。線形探索が二分探索よりも速い「n」の値が存在してもよい。 –
あなたは自分自身で、 'n'に近いなら' x'をループする必要があるので、2つのループ - > O(n^2) – A4L