2010-12-30 10 views
2

は今、私は次のJavaScript辞書にJavascriptの辞書のパフォーマンスの問題

var a = {}; 
a['SVG343'] = 1942; 
a['UAL534'] = 2153; 

を持っている右のこれらの数字は時間を表し、そしてキーはユニークなIDです。ユニークなので、私はidsをキーにしたいと思っていました。私の問題は、対応するIDを見つける時間が与えられています。私は正しい時間を見つけて現在のキーを使ってIDを取得するまで、どのようにこれを行うつもりでしたか?

しかし、私はパフォーマンスについて心配しています。私の質問は、辞書(O(n))の各エントリを他の方法よりも大幅に遅くしていますか?

var indexByTimes = {}; 
for (var prop in a) { 
    if (a.hasOwnProperty(prop)) { 
     indexByTimes[a[prop]] = prop; 
    } 
} 

と複数の時間値のため、IDの配列を使用します:

for (var prop in a) { 
    if (a.hasOwnProperty(prop)) { 
     if (indexByTimes.hasOwnProperty(a[prop])) { 
      indexByTimes[a[prop]].push(prop); 
     } else { 
      indexByTimes[a[prop]] = [prop]; 
     } 
    } 
} 

次に、あなたが時間に対応するすべてのIDにアクセスすることができますが、回からインデックスを構築することができ

+2

を使用するのが好ましいだろうvarがaが{} =;'あなたがここに – sjngm

+0

@sjngmを配列を使用していないとして、おかげで固定 – Albinoswordfish

+1

も倍ですユニーク?そうでない場合、より多くの時間価値がある場合、どのIDを選択しますか? –

答えて

4

O(1)中のindexByTimes['1942']で1942年。

+0

ありがとうございます! 'indexByTimes ['1942']'の代わりに 'indexByTimes [1942]'を意味しますか? – Albinoswordfish

+0

@Albinoswordfish:いいえ、私は実際には 'indexByTimes ['1942']'を意味しました。しかし、どちらも機能するはずです([プロパティ名は内部的に文字列に変換されます](http://bclary.com/2004/11/07/#a-11.2.1))。 – Gumbo

0

辞書のすべてのキーを反復するのはO(n)です。したがって、を繰り返しても、O(n)になります。ただし、すべてのキーを繰り返して値を調べると(for(var key in a) { x += a[key]; })、O(n*log(n))です。だから、最初の行は `のいずれかである必要がありa.items()かかわら繰り返すか、単にリスト