形如{ {1,2},{3,5},{4,2},{1,2},......}这样的数组,如何快速去除重复项?今天群友讨论很热烈,其中我能看懂的方案有下面两种:
第一种方案:将嵌套数组转换为字符串,去除重复,再转换为表。
第二种方案:将数组导入内存数据库,查询不重复值,导出为表。
下面是测试代码:
import console;
console.log("构建一个二维数组。第1维40000个元素,第2维2个元素,是0-99的随机整数。。。")
var tab={}
for (i=1;40000){
table.push(tab,{math.random(0,99),math.random(0,99) })
}
console.log("数组构建完毕!")
console.log("第一种方法:将嵌套数组转换为字符串,去除重复,再转换为表。。。")
var tick=time.tick()
var tab1=table.map(tab,λ(v) table.tostring(v) )
var tab2=table.unique(tab1)
var tab3=table.map(tab2,λ(v) eval(v) )
console.log("第一种方法去重完毕!用时"++(time.tick()-tick)++"ms,得到"++#tab3++"个不重复元素。")
//console.dump(tab3)
console.log("第二种方法:将数组导入内存数据库,查询不重复值,导出为表。。。")
import sqlite
var tick=time.tick()
var db=sqlite(":memory:")
db.exec("CREATE TABLE test( fa INTEGER, fb INTEGER );")
for (i=1;40000) db.exec("INSERT INTO test VALUES (?,?)",tab[i])//不知道有没有更快的导入方式?
var tab4=db.getTable("SELECT distinct * FROM test ")
console.log("第二种方法去重完毕!用时"++(time.tick()-tick)++"ms,得到"++#tab4++"个不重复元素。")
//console.dump(tab4)
console.pause(true);
测试结果是:
第一种方法用时312ms,得到9808个不重复元素。
第二种方法用时843ms,得到9808个不重复元素。
两种方法结果一致,代表都是可行的。第一种方法快一些,但第二种方法通用一些。
我对数据库不是很熟悉,第二种方法可能还能加速,欢迎讨论。