私が知っているように、Javascriptのオブジェクトはハッシュ(連想配列)のように機能します。したがって、このようなオブジェクトのキーで値を取得する場合、のキーの数にobj['a']
関係なく、時間計算量は常にO(1)になると思いますobj
。しかし、インタビュアーがこれについて私に挑戦しました。
彼は私に質問をしました:find the intersection between two unsorted arrays (no duplicate)
。
私の解決策は、最初の配列を調べてすべての要素のハッシュを作成し、2番目の配列の要素がハッシュにある場合は2番目の配列をループして、それを出力にプッシュすることです。
コードはこれが好きです:
function findIntersection(ary1, ary2) {
var hash = {};
var output = [];
ary1.forEach((v) => {
hash[v] = true;
});
ary2.forEach((v) => {
if (hash[v]) {
output.push(v);
}
});
return output;
}
複雑さはO(m+n)
、mとnは入力配列の長さであると説明しました。しかし、インタビュアーはこれに同意していないようでした。彼はhash[v]
、値がO(1)であることを確認してください、Javascriptがどのように達成するかを教えてくださいと尋ね続けましたhash[v]
。
hash[v]
O(1)ではないの時間計算量ですか?そうでない場合は、正しいハッシュ構造を使用して線形時間計算量を実現するためにコードを書き直す方法は?
これは、私のJavascript学習のまさに基礎に当たりました。
これはJavascriptに関するものではなく、一般的な「ハッシュマップ」に関するものです。
それらはいわゆる疑似定数と呼ばれます。これは、数値が少ない場合、ほとんどの場合、一定の時間で値を返すことを意味しますが、それは保証されていません。
2つの文字列が同じハッシュを持っている場合はどうなりますか?それからそれらは一箇所に保存され、あなたはあなたの価値を見つけるためにそれらを通して直線的に行かなければなりません。したがって、運が悪ければ、同じハッシュを持つハッシュマップを持つすべてのキーを持つことができます=結果はO(n)です。
また、数を増やすと衝突の確率が高くなるため、多くの数の場合、O(n)になります。
解決策について-私はあなたが持っているものが妥当な量の値に最適だと思います(数百万、おそらく数十億以下ですが、いくつかの超高数値ではありません)。アルゴリズムが正しく機能しているこれらの境界について言及するのは良いことです。
重複を見つけるために、線形時間で実行されるアルゴリズムはないと思います。あなたはそれをn log n
分類して通過することによってそれを行うことができます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加