ホームページ ウェブフロントエンド jsチュートリアル JavaScript の uniq メソッド array_javascript ヒント

JavaScript の uniq メソッド array_javascript ヒント

May 16, 2016 pm 07:06 PM
javascript uniq 配列

プロトタイプ メソッドを Array ローカル オブジェクトに追加します。その目的は、配列エントリ内の重複エントリ (複数ある場合があります) を削除することです。戻り値は、削除された重複エントリを含む新しい配列です。

正式な説明:
入力
Array(size=N)
出力
Array1=重複と順序保持のない配列のサブセット、
重複なしを意味します。 a, b は Array1 に属し、a!=b
順序保持とは、Array の a の添字が Array の b の添字より小さい場合、Array1 の a の添字も b の添字よりも小さいことを意味します。配列内で
Array2=Array-Array1 とマークされ、順序を保持する
により新しい解決策が得られます。アイデアは非常に明確です。シーケンシャル トラバーサルは各要素にアクセスし、この要素の値がアクセスされている場合はそれを追加します。 Array2、そうでない場合は Array1 を追加します。現在の要素の値がアクセスされたかどうかを判断するために使用される方法は、アクセスされたすべての要素を順番に走査することです。
このアルゴリズムの複雑さは約 O(N^2) であることが簡単にわかります。

私は彼のアルゴリズム フレームワークに基づいて若干の改善を加えました。重要なのは、現在の要素の値が走査プロセス中に訪問されたかどうかを判断する方法にあります。元の配列の値の範囲が正の整数であり、範囲 (範囲=最大値-最小値) が大きすぎないという条件下では、単純な「バケット」アルゴリズムを使用できます。
範囲の長さのブール配列 b を用意し、すべて false に初期化します。元の配列の各値の値について、b[value]=true の場合、値がアクセスされて Array2 に配置されたことを意味します。それ以外の場合、値は Array1 に配置され、b[value]=true になります。
これは明らかに O(N) アルゴリズムであり、コストは追加の空間複雑さの範囲であり、元の配列値の範囲は正の整数である必要があります。
値の範囲が整数である場合に一般化することは難しくありません。実際には、バケット番号 value-min (配列) を正の整数に変換できる場合を調べるだけで済みます。

範囲が大きすぎることによるスペースの無駄を避けるために、ハッシュ アルゴリズムは「バケット」アルゴリズム、具体的には線形合同オープン ハッシュ法に基づいて改良されています。目的は、値の範囲を圧縮し、それを連続した正の整数の制御可能な小さなサブセットにマッピングすると同時に、異なる元のイメージが同じイメージに対応する確率を可能な限り小さくすることです。つまり、バケット間の負荷を次のようにする必要があります。可能な限りバランスをとります。
たとえば、これは実数範囲のハッシュ関数です:
key=hashFun(value)=Math.floor(value)*37�
これはまだ O(N) アルゴリズムです (明らかに、O(N) はすべての uniq アルゴリズムの複雑さの下限です)。利点は、スペースのオーバーヘッドを制御でき、対応するハッシュ関数を設計するだけで済むことです。



下はバケツ(バケット)演算法の实现:
var resultArr = [],
returnArr = [],
origLen = this.length,
結果Len;
var maxv=this[0],minv=this[0];
for (var i=1; i if(this[i]>maxv)maxv=this[i];
else if(this[i] }
var blen=maxv-minv 1;
var b=新しい 配列(ブレンド);
for(var i=0;i for (var i=0; i if (b[this[i]-minv]){
returnArr.push(this[i]); 
} else {
resultArr.push(this[i]);
b[this[i]-minv]=true;
}
}
resultLen = resultArr.length;
this.length = resultLen;
for (var i=0; i this[i] = resultArr[i];
}
return returnArr;
下は分散列(ハッシュ)算法の計算です
var shuffler = 37
var beta=0.007;
var origLen=this.length
var bucketSize=Math.ceil(origLen*beta);
var hashSet=new Array(bucketSize); 
var hashFun = function(value){
var key = (Math.floor(value)*shuffler)%bucketSize;
リターンキー;
}
//init hashSet
for(var i=0;i//
var ret=[],self=[];
var キー、値; 
var bucket,openLen;
var everConflict;
for(var i=0;ivalue=this[i];
キー=ハッシュファン(値);
バケット = ハッシュセット[キー];
openLen=bucket.length;//if(openLen>1)return;
everConflict=false; 
for(var j=0;j if(bucket[j]==value){
ret.push(value);
everConflict=true;
休憩;
}
}
if(!everConflict){
bucket.push(value);
self.push(value);
}
}
selfLen = self.length;
this.length = selfLen;
for (i=0; i this[i] = self[i];
}
//平均バケット サイズを計算します
var lens=[],sum=0;
for(var i=0;iaverage=sum/hashSet.length;//watch lens,average
return ret;


k*10000个0~k*100の随机整数测试計算時間(ms)
k 1 2 3 4 5
realazy 240 693 1399 2301 3807
バケット55 101 141 219 293
ハッシュ 214 411 654 844 1083
测试框架借鉴了http://realazy.org/lab/uniq.html
测试環境Firefox2.0.0.6/Ubuntu7.10/2.66 GHzP4/1024MBDDR 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? Apr 27, 2024 am 11:33 AM

foreach ループを使用して PHP 配列から重複要素を削除する方法は次のとおりです。配列を走査し、要素がすでに存在し、現在の位置が最初に出現しない場合は、要素を削除します。たとえば、データベース クエリの結果に重複レコードがある場合、このメソッドを使用してそれらを削除し、重複レコードのない結果を取得できます。

PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 May 03, 2024 pm 09:03 PM

PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する May 01, 2024 pm 12:30 PM

PHP で配列をディープ コピーする方法には、json_decode と json_encode を使用した JSON エンコードとデコードが含まれます。 array_map と clone を使用して、キーと値のディープ コピーを作成します。シリアル化と逆シリアル化には、serialize と unserialize を使用します。

PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで Apr 29, 2024 pm 09:12 PM

多次元配列のソートは、単一列のソートとネストされたソートに分類できます。単一列のソートでは、array_multisort() 関数を使用して列ごとにソートできますが、ネストされたソートでは、配列を走査してソートするための再帰関数が必要です。具体的な例としては、製品名による並べ替えや、売上数量や価格による化合物の並べ替えなどがあります。

PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する Apr 30, 2024 pm 03:42 PM

PHP で配列のディープ コピーを実行するためのベスト プラクティスは、 json_decode(json_encode($arr)) を使用して配列を JSON 文字列に変換し、それから配列に戻すことです。 unserialize(serialize($arr)) を使用して配列を文字列にシリアル化し、それを新しい配列に逆シリアル化します。 RecursiveIteratorIterator を使用して、多次元配列を再帰的に走査します。

データソートにおけるPHP配列グループ化機能の応用 データソートにおけるPHP配列グループ化機能の応用 May 04, 2024 pm 01:03 PM

PHP の array_group_by 関数は、キーまたはクロージャ関数に基づいて配列内の要素をグループ化し、キーがグループ名、値がグループに属する要素の配列である連想配列を返すことができます。

PHP 配列のマージおよび重複排除アルゴリズム: 並列ソリューション PHP 配列のマージおよび重複排除アルゴリズム: 並列ソリューション Apr 18, 2024 pm 02:30 PM

PHP 配列のマージおよび重複排除アルゴリズムは、元の配列を小さなブロックに分割して並列処理する並列ソリューションを提供し、メイン プロセスは重複排除するブロックの結果をマージします。アルゴリズムのステップ: 元の配列を均等に割り当てられた小さなブロックに分割します。重複排除のために各ブロックを並行して処理します。ブロックの結果をマージし、再度重複排除します。

重複要素の検索における PHP 配列グループ化関数の役割 重複要素の検索における PHP 配列グループ化関数の役割 May 05, 2024 am 09:21 AM

PHP の array_group() 関数を使用すると、指定したキーで配列をグループ化し、重複する要素を見つけることができます。この関数は次の手順で動作します。 key_callback を使用してグループ化キーを指定します。必要に応じて、value_callback を使用してグループ化値を決定します。グループ化された要素をカウントし、重複を特定します。したがって、array_group() 関数は、重複する要素を見つけて処理するのに非常に役立ちます。

See all articles