2 つのリストを比較し、一般的ではない要素を特定する簡単な方法2 つのリストを比較し、異なるリスト要素 (つまり、一般的ではない要素) を識別する簡単な方法を知っている人はいますか?2 つのネストされたループを使用してこれを行うことができますが、JSL の他の多くのことと同様に、何かあいまいで簡単な方法があるかもしれないと期待していました。 DJ
もちろん、私のリストはこれよりもはるかに大きくなります。
list1={"リンゴ"、"ナシ"、"オレンジ"、"キウイ"、"スイカ"};
list2={"リンゴ"、"ナシ"、"オレンジ"、"キウイ"、"イチゴ"、"スイカ"};
異なる/珍しい要素 (この場合は「イチゴ」) を見つけます。
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?さまざまなサイズやさまざまな JSL ループのアプローチについてベンチマークを行う必要があります。 セット内の項目が 2 ~ 10 個の場合、連想配列を使用した方が高速になると思います。 サイズ 1 では、連想配列は過剰ですが、それでもかなり高速に構築されます...1 秒あたり約 100 万...
start = tickseconds();
for(i=1,i<=1e6,i++,
a=associativearray({"a","b"});
b=associativearray({"a","b"});
c=associativearray({"a","b"});
d=associativearray({"a","b"});
e=associativearray({"a","b"});
);
stop=tickseconds();
aatime=(stop-start);
write("\!ntime for 5,000,000 associative arrays:",aatime);
start = tickseconds();
for(i=1,i<=1e6,i++,
a=1;
b=2;
c=3;
d=4;
e=5;
);
stop=tickseconds();
satime=(stop-start);
write("\!ntime for 5,000,000 simple assingments:",satime);
write("\!nsimple/associative=", satime/aatime);
/*:
time for 5,000,000 associative arrays:5.8166666666657
time for 5,000,000 simple assingments:0.283333333325572
simple/associative=0.0487106017178716
おそらく、作成する連想配列ごとに 20 ~ 30 個を超える単純な JSL ステートメントを実行することはできません。
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?これに対する簡単な質問ですが、連想配列とループを使用して節約される時間は、連想配列とリストの作成にかかるオーバーヘッドよりも常に大きくなりますか?
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?また、この一般的な方法では、最初に交差点を見つける必要はありません。 それはただの違いです。
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
uncommon1 = set1; uncommon1<<REMOVE></REMOVE>Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?また、セットのメンバーに 1 から始まる連続した整数で名前が付けられている場合、この問題は行列を使用すると非常に効率的に実行できます。 ただし、名前付きセット メンバーで示されているように、連想配列はおそらく並べ替えよりも優れており、ネストされたループの N^2 ペアよりも明らかに優れています。
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
set3=associativearray({"apple","pear","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
"common (intersection) items:"
{"apple", "kiwi", "orange", "watermelon"}
"all (union) items"
{"apple", "grape", "kiwi", "orange", "pear", "strawberry", "watermelon"}
set1HasSet3 << Contains(set3) = 0;
set2HasSet3 << Contains(set3) = 1;
連想配列は、特に数百万の値をループする JSL スクリプトを作成する場合と比較して、数百万の値に非常に適しています。
スクリプト インデックスには、セットとして使用される連想配列の詳細が含まれます。 珍しいアイテムは次のとおりです。
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?@MS :
あなたが提供してくれたこのソリューションは、これまでさまざまな面で私にとって非常に役に立ちました。まず最初に感謝したいと思います。
また、非常に大きなデータセット(たとえば、それぞれ数百万のアイテム)を扱う場合、このアプローチは大量のメモリを必要とし、新しいテーブルに要素を挿入するのは効率的ではないようです。 2 つのデータ テーブルの 2 つの列の間で珍しい要素を識別するより効果的な方法はありますか。つまり、データ テーブル 1 (dt1) の列 1 とデータ テーブル 2 (dt2) の列 1 に大きな数値リストがある場合、それらを比較できますか?より効果的な方法は?
最高
ウデイ
Re: 2 つのリスト (珍しい要素) を簡単に比較する方法はありますか?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />それも知りたいです。 一般的な項目は Intersect() (下記を参照) で見つけることができますが、一般的ではない項目に対応する関数はわかりません。
データ テーブルにはリストよりも多くのオプションがあります。 以下のスクリプトは、一時データテーブルを介して珍しい要素を識別します。 長いリストをループするよりも速いかもしれませんが、比較したことはありません
リスト1 = { "りんご" 、 "梨" 、 "オレンジ" 、 "キウイ" 、 "スイカ" 、 "マンゴー" } ;
リスト2 = { "りんご" 、 "梨" 、 "キウイ" 、 "オレンジ" 、 "いちご" 、 "スイカ" 、 "メロン" } ;
dt =新しいテーブル( 「温度」 、
新しい列( 「グラム」 、キャラクター、設定値(リスト1 ||リスト2 ) ) 、
新しい列( 「nr」 、数値、式( 1 ) 、評価式) 、
見えない
) ;
要約する( g =による( dt :グラム) 、 n =カウント( dt :番号) ) ;
一般的ではない= g [ロック(リストとして( n ) 、 1 )] ;
一般=連想配列(リスト1 ) <<交差する(連想配列(リスト2 ) ) <<キーを取得する;
見せる(一般、一般的ではない) ;
近い( dt 、保存しない) ;