比较两个列表并识别不常见元素的快速方法有谁知道比较两个列表并识别任何不同列表元素(即不常见元素)的快速方法?我可以使用两个嵌套循环来完成此操作,但就像 JSL 中的许多事情一样,我希望可能有一些晦涩的、更简单的方法。 DJ
当然,我的清单比这个大得多:
list1={"苹果","梨","橙子","猕猴桃","西瓜"};
list2={"苹果","梨","橙子","猕猴桃","草莓","西瓜"};
找到任何不同/不常见的元素,在本例中为“草莓”。
回复:比较两个列表(不常见元素)的快速方法?您必须针对不同的大小和不同的 JSL 循环方法对其进行基准测试。 我猜想集合中 2 到 10 个项目使用关联数组会更快。 在大小为 1 时,关联数组有点过分了,但它的构建速度仍然相当快……大约每秒一百万……
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 语句。
回复:比较两个列表(不常见元素)的快速方法?对此的简单问题是,使用关联数组与循环节省的时间几乎总是大于创建关联数组与列表所需的开销吗?
回复:比较两个列表(不常见元素)的快速方法?而且不常见的方法不需要先找到交集。 这只是区别。
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
uncommon1 = set1; uncommon1<<REMOVE></REMOVE>回复:比较两个列表(不常见元素)的快速方法?另外:如果集合的成员以从 1 开始的连续整数命名,则可以使用矩阵非常有效地解决此问题。 但是,正如命名集成员所呈现的那样,关联数组可能比排序更好,并且绝对比 N^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>
回复:比较两个列表(不常见元素)的快速方法?@多发性硬化症:
到目前为止,您提供的这个解决方案在很多方面对我都非常有帮助,我首先要感谢您。
我还想询问,当我们处理非常大的数据集(例如每个数据集有几百万个项目)时,这种方法将需要大量的内存,并且将元素插入到新表中似乎效率不高。 有没有更有效的方法来识别两个数据表中两列之间的不常见元素,即如果数据表 1 (dt1) 中的列 1 和数据表 2 (dt2) 中的列 1 有大量数字,我们可以将它们进行比较吗更有效的方法?
最好的
乌代
回复:比较两个列表(不常见元素)的快速方法?<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 ,不保存) ;