JavaScript配列のuniq方法


Arayローカルオブジェクトにプロトタイプ方法を追加します。これは配列エントリの重複したエントリを削除するためのもので、戻り値は削除された重複エントリを含む新しい配列です。形式化の説明:input Aray(size=N)output Aray 1=Arayの重複しない保護順のサブセット、重複なしとは、任意のa、bに対してAray 1、a!=b保順とは、aがArayの下付きスケーリングがbより小さい場合、aがAray 1の下付きスケーリングもbより小さい。Arayの下付きAray 2=Aray Array 1、保順realzyは新しい解を与え、考え方は非常に明確である。順番に各要素にアクセスして、この元素の値がすでに訪問されている場合、Arayray 1に加入する。現在の要素の値がすでに訪問されているかどうかを判断する方法は、すでに訪問されたすべての要素を順次巡回することである。  このアルゴリズムの複雑さは約O(N^2)に見やすい。彼のアルゴリズムの枠組みの中で、現在の要素の値がすでに訪問されているかどうかを判断する過程を経ることによって、少し改善しました。元の配列値の範囲では正の整数であり、非常に悪い(range=max) value-min 大きな条件ではないので、簡単な「桶」アルゴリズムを採用することができます。長さrangeのbollan配列bを用意し、すべてfalseに初期化する。元の配列の各値valueに対して、b[value]=trueであれば、この値が訪問されたことを示し、Aray 2を入れます。さもなければ、Aray 1を入れて、同時にb[value]=trueをさせます。  これは明らかにO(N)のアルゴリズムであり,対価は余分な空間的複雑度rangeであり,元の配列値領域が正の整数であることが要求される。値域が整数の場合に普及するのは難しくないですが、実際には桶号value-min(Aray)を考察するだけで正の整数に転化することができます。rangeが大きすぎて空間の浪費を回避するために、「桶」アルゴリズムに基づいてハッシュアルゴリズムに改善し、具体的には線形同欠拡散法である。目的は、適切な圧縮を制御可能な小さな連続正の整数子集中に写像することであり、異なる原像に対応する同じ象の確率をできるだけ小さくすること、すなわち桶と桶の間にできるだけ負荷バランスを取ることを保証することである。  例えば、これは実数のハッシュ関数です。key=hashFun=Math.flor*37%91はまだO(N)のアルゴリズムです。(明らかにO(N)は全uniqアルゴリズムの複雑度下界です。利点は空間のオーバーヘッドを制御することができ、整数値以外の領域に適応できます。対応するハッシュ関数を設計するだけでいいです。以下は樽アルゴリズムの実装である。   var ルルーシュ = [],        returnarr = [],         origLen = this.length、       レスリングトン   var maxv=this[0]、minv=this[0]   for (var i=1; imaxv=this[i]       else if(this[i]1)return;ever Conflick=false;  for(var) j=0;j