4
有没有更快的方法来检查列表中的列表是否等效?
在这里,我有1:7四个不同分区(即{1},{2,3,4},{5,6}和{7})的整数,这些分区写在一个列表中,即list(1,c(2,3,4),c(5,6),7)。我将分区视为集合,这样一个分区内元素的不同排列应被视为同一分区。例如,list(1,c(2,3,4),c(5,6),7)和list(7,1,c(2,3,4),c(6,5))是等效的。 注意,列表中的元素没有重复,例如no list(c(1,2),c(2,1),c(1,2)),因为这个问题正在讨论整个集合的互斥分区。 我在列表中列出了一些不同的排列lst,如下所示 lst <- list(list(1,c(2,3,4),c(5,6),7), list(c(2,3,4),1,7,c(5,6)), list(1,c(2,3,4),7,c(6,5)), list(7,1,c(3,2,4),c(5,6))) 我想做的就是验证所有排列是否相等。如果是,那么我们得到结果TRUE。 到目前为止,我所做的是对每个分区中的元素进行排序,并setdiff()与之一起使用interset()并对其union()进行判断(请参见下面的代码) s <- Map(function(v) Map(sort,v),lst) equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0 但是,我估计每当分区大小扩大时,此方法都将很慢。有什么更快的方法可以做到吗?预先赞赏! 一些测试用例(小数据) # should return `TRUE` lst1 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,4),c(6,5))) # should return `TRUE` lst2 <- list(list(1:2, 3:4), list(3:4, 1:2)) # should return `FALSE` lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))