私は一意の文字列のリストを持たせたいので、毎回新しい文字列を取得する必要があります。リストに追加する必要があります。リスト。これは不適格と思われる。JSのほとんどのエージェントセット構造
ただし、ハッシュ構造を使用してアイテムをキーとして保存すると、単純な配列よりもパフォーマンスを向上させる方法はありますか?
私は、JavaScriptで最もパフォーマンスの高いセットデータ構造が何であるか考えていると思います。
私は一意の文字列のリストを持たせたいので、毎回新しい文字列を取得する必要があります。リストに追加する必要があります。リスト。これは不適格と思われる。JSのほとんどのエージェントセット構造
ただし、ハッシュ構造を使用してアイテムをキーとして保存すると、単純な配列よりもパフォーマンスを向上させる方法はありますか?
私は、JavaScriptで最もパフォーマンスの高いセットデータ構造が何であるか考えていると思います。
はい、セットを使用すると、既存の値(配列のO(n)に対してO(1))をチェックするよりもはるかに高速になります。最近のブラウザで
var s = Set();
s.add(1); // s is (1)
s.add(2);
s.add(3);
s.add(1)
s.add(1)
// s is now (1, 2, 3)
(クローム38+、IE11 +)Set
型が定義され、それがここに文書化されていますhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
そうでない場合は、JavaScriptで、Object
値(ECMAScriptの中の基本的なタイプ)が内部的に実装されていますハッシュテーブルとして使用することができます。したがって、最も遅い概念の "HashSet
"構造は、無視された値型のハッシュテーブルの一般化として存在します。ここで
は(Set
が利用できなかった場合)、私はそれを行うだろう方法は次のとおりです。
function StringSet() {
this.values = {};
this.add = function(value) {
value = value.toUpperCase(); // use UpperCase for string normalization because of how casing rules work in different languages, especially Turkish
this.values[ value ] = true; // use bool values as stubs
};
this.contains = function(value) {
value = value.toUpperCase();
return value in this.values; // JavaScript has a fast `in` operator which runs in `O(1)` time
}
}
var foo = new StringSet();
foo.add("bar");
assert(foo.contains("bar"));
私はあなたのStringSetが大文字小文字を区別しないのに対し、ネイティブセットは大文字小文字を区別します。大文字と小文字を区別しないマッチングは確かに便利です。差異を強調したいだけです。 –
たぶん、[設定](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects /セット)? –