2017-09-24 3 views
1

JavaScriptオブジェクトを辞書として使用しており、大文字と小文字を区別しないようにする必要がありました。私はこれを実装するためにObject.defineProperty()を使用:JavaScriptオブジェクトキーを検索する時間の複雑さは何ですか?

Object.defineProperty(Object.prototype, "getKeyUpperCase", { 
    value: function(prop) { 
     for (var key in this) { 
      if (key.toUpperCase() === prop.toUpperCase()) { 
       return this[key]; 
      }; 
     }; 
    }, 
    enumerable: false 
}); 

JavaScriptでキーを経由してオブジェクトを検索する時の複雑さとは何ですか?私は約100万の鍵を保持する辞書を期待しています。

私には、最悪の場合はO(n)、最善のケースはO(1)、平均の場合はO(n/2)と思われます。これは正しいです?

オブジェクトのキーを配列(Object.Keys(dictionary).map(function(key) return key.toUpperCase()).sort())として取得して、キーが存在するかどうかを確認する方が効率的でしょうか?この操作の平均時間複雑度がO(log n)であるということを訂正しますか?辞書の

使い方は、この線に沿っている:

+0

すべてのキーを検索する必要はありません...単一キーのすべての可能性のあるケースをテストするだけです。つまり、this ['name'] 'vs' this ['Name'] 'vs 'this ['NAme']'と続きます。さらに、辞書の代わりに直接[Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を使用して、確実に確認することができます各キーセットは、設定時に常に小文字/大文字になります。 –

+0

ありがとうございます。私はそれを考えなかった。それは私がやったことよりも速いでしょうか?私は辞書がJavaScriptでどのように実装されているかわからないので、パフォーマンスを比較する方法がわかりません –

+0

テストするキーの長さによって異なります。キーの可能な各ケースを作成してからテストする必要があります。その数はかなり大きくなる可能性があります。 setterとgetterの両方で 'this [key.toLowerCase()] 'を使用しているだけで検索が行われないので、私は個人的にプロキシルート(サポートされているブラウザを使用している場合)に行きます。 –

答えて

1

まず、ビッグO記法に関するいくつかの考え:

この数学的なツールは「桁」の概念をつかむしようとします長期的なシナリオでは、サイズが大きくなるにつれて、定数はますます小さくなります。したがって、通常はbig-Oを計算することは定数を気にしません。

これがO(n/2)= O(n)の理由です。

したがって、線形ルックアップにはO(n)時間の複雑さがあります。ソートについて

のJavaScriptのソートアルゴリズムは、ブラウザに依存しているが、あなたはそのためのO(N Nをログ)複雑さをとることができます。通常、1つの検索のみをソートする価値はありませんが、1回だけソートできれば、それは価値があるかもしれません。ちなみに、並べ替えられたリストを検索する場合は、検索のスピードを上げるためにバイナリ検索を実装しようとする可能性があります。

関連する問題