今日、私の友人は私にこの質問をしてくれました:JSは複数の配列の重複データを見つけます
注記:
1.複数の配列に2つ以上の複製データがある限り、より正確に言うと、このデータは私が必要とするものです
2.単一の配列のデータに重複した値はありません(もちろん、1つがある場合はそれを推測できます)
3。時間のかかる問題、これは非常に重要です
ソースコード:
<!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>複数の配列で重複したデータを取得</title> </head> <body> <script = "text/javascript"> //時間nate-usetime 1、date2){var3 = date2.get1.get-2.get時間差のミリ秒//差額の日数を計算するvar days = math.floor(date3/(24*3600*1000))// var leave1 = date3%(24*3600*1000)//残りのミリ秒後のvar hours hours = math.floor(leave10*1000)/hoursmalisecond/hoursma Minutes = math.floor(reave2/(60*1000))//残りのミリ秒後のvar分数var var leaves3 = reave2%(60*1000)//残りのミリ秒後、var seconds = math.round(leaf3/1000)return "time:"+days+""+hours+" "+leave3%1000; //+" '' "; } // minとmaxの間の数で構成されるデータを返します。長さはmax-min+1(データは固定されていますが、順序はランダムです)関数getarr(min、max){var arr = []; var numtopush = min; for(var i = 0; i <max-min+1; i ++){var len = arr.length; if(len == 0){arr.push(numtopush ++); } else {var randindex = math.floor(math.random()*len); arr.push(numtopush ++); // ARRの特定の1つは、最後のTMP = arr [randindex]と交換varを交換します。 arr [randindex] = arr [len]; arr [len] = tmp; }} return arr; } // minとmaxの間の数で構成されるデータを返します。それらの数はnum(ランダムデータ)function randomarr(min、max、num){var arr = []; for(var i = 0; i <num; i ++){var randomnumber = math.floor(math.random()*(max-min)+min); var inarr = false; for(var i = 0; i <arr.length; i ++){if(arr [i] == randomnumber){inarr = true; num--;壊す; }} if(!inarr){arr.push(randomnumber); }} return arr; } //複製データ関数を取得getDumplicate(){var num = arguments.length; if(num <2){return [];}; var obj = {ret:[]、//同じデータコンテナを保存:[] //別のデータ} for(var i = 0; i <3; i ++){// console.log(arguments [i]); var arr = arguments [i]; obj = deal(arr、obj); } objを返します。 } //単一の配列を処理し、コンテナ内のデータと比較し、重複したデータを取得します(問題:コンテナ内のデータ量が多すぎるとデータが多すぎます)function deal(arr、obj){var len = obj.container.length; if(len == 0){obj.container = arr; } else {var arrlen = arr.length; for(var j = 0; j <arrlen; j ++){//配列を送信すると、各要素はコンテナーvar conlen = obj.container.lengthと比較されます。 var intocontainer = false; for(var i = 0; i <conlen; i ++){var convalue = obj.container [i]; if(arr [j] == convalue){// ret ret obj.ret.push(arr [j]); intocontainer = true; }} if(intocontainer &&!inarr(arr [j]、obj.container)){obj.container.push(arr [j]); //コンテナへの繰り返しなし}}} objを返します。 } //このデータが既に配列機能に存在するかどうかを検出inarr(obj、arr){var exist = false; var len = arr.length; for(var i = 0; i <len; i ++){if(arr [i] == obj){exist = true; }} returnが存在します。 } // -------------------------测试--------------------------------------------------------------------- new date(); var arr_a = getarr(1,20); var arr_b = getarr(18,35); var arr_c = getarr(34,50); var dumpdata = getDumplicate(arr_a、arr_b、arr_c); console.log(dumpdata.ret); //console.log(dumpdata.container); console.log(usetime(date、new date())); console.log("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- usetime(new date());結果:
より多くのデータをテストします:3つの配列がランダムに生成され、合計3Wのデータが生成されます
結果:
5Wデータの5つの配列:(データ分布:1W/配列)
10Wデータの5つの配列:(データ分布:5W、4W、3W、2W、1W)
10アレイ10Wデータ:(データ分布:1W/配列)
100アレイ100Wデータ:(データ分布:1W/配列)
結論は:
1.どのくらいの時間を費やすかはあなたのアルゴリズムによって異なります
2。合計データが変更されていない場合:できるだけ多くの配列を用意してみてください。単一の配列にあまり多くのデータがあるべきではありません。もちろん、一般化することはできません。
3.このテストでは、1Wのデータの単一配列は問題ありません。5Wデータは死にません。10WデータはHua tuoに連絡してください
質問:
1.アルゴリズムは一時的に記述されます(実際、アルゴリズム^_^はありません)、改善する必要があります
2。テストコードでは、非重複データを保存するためにアレイコンテナが使用されます。
その後、問題は次のとおりです。データが多すぎると、コンテナ内にデータが多すぎると...そして...あなたが知っていることです。
3.テストデータはランダムに生成され、数値のみが生成されます。別のオブジェクトの場合は、個別にテストしてください(主にテストデータの生成が困難であるため(⊙o⊙)…)
4.テストされていない多次元配列(テストパフォーマンスは良くない可能性があります0_0)
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。