0

キーを持つオブジェクトの配列がありますPhoneNumber(他のキーと値のペアとともに)。この配列で探している電話番号の値があります。この配列で電話番号の線形検索を実行し、オブジェクトが見つかるとすぐにループを解除します (したがって、運が良けれ、配列全体をトラバースする必要はないかもしれません)。

ここでの最良のケースは、配列で電話番号を見つけた場合 (さらに検索しない場合) だけですが、それが見つからない可能性が高く、配列全体を無駄に走査します。

アップデート

これを提供しようと考えたのですが、検索スペース (オブジェクトの配列) には約 500 個の要素が含まれるため、この線形検索を具体的に見ることはパフォーマンスの問題ではないかもしれませんが、この検索と並行して実行される他の多くのタスクがあるため、できるだけ多くのマイクロ最適化を探しています。

更新 2 ( Elias Van Ootegemコメントに応えて)

私の配列には、JSON.stringify()(Uncaught TypeError: 循環構造を JSON に変換する) またはExt.JSON.encode()(Maximum call stack exceeded) のどちらも配列を JSON 文字列に変換できないような、その構造に不適切なものがあると思います。

しかし、とにかくこれをさらに速く行うには?

4

2 に答える 2

0

使い方次第です。

この配列を何度も使用する場合は、配列を使用する代わりにマップを使用する必要があります。{key: data} でハッシュを作成し、キーを指定してデータを取得します。(JavaScriptで配列をハッシュに変換します)

配列を 1 回しか使用しない場合、配列をマップに変換するプロセスは、検索自体よりも時間がかかります。最良の方法は、線形検索です。

両方のソリューションのコストは次のとおりです (n: 配列の長さ、および m、検索数を考慮して): 最初のソリューション: n*log(n) + m * log(n)

秒の解: n*m

于 2013-02-26T11:09:33.243 に答える
0

電話番号を (キーとして) 配列内のインデックスにマップするルックアップ オブジェクトを作成します。

var dataset = [{phone:'0123 456 689'},{phone:'0987 654 321'},...];
var lookup = {'0123 456 689':0,'0987 654 321':1,...};

// search like this...

var number = '0987 654 321';
var obj = dataset[lookup[number]];

しかし、線形検索は数千のエントリを持つユーザーでも十分に高速であるため、ほとんどのユースケースではおそらくやり過ぎです。

于 2013-02-26T11:09:42.063 に答える