在这里,我有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)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
并之一,其结果应该是FALSE
,也许lst_false <- 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)))
FALSE
。这样,当答案适用于部分(而非全部)测试用例时,很容易诊断出原因。当只有一个示例时,您会在测试结果中失去细微差别。添加新示例而不是更改已经使用过这些示例的人员下的现有示例也很好。
lst
可能很长,则使用其他方法可能会提高效率。例如,如果任何内部列表中的元素数量错误,第一检查length(unique(lengths(lst))) == 1
将很快返回FALSE
....
lst
,比较lst[[i]]
来lst[[1]]
,而且这样你可以为你找到一个不匹配,而不是做所有的比较就立即停止。如果lst
long较长且FALSE
s很常见,这可能会带来很大的效率提高,但否则可能不值得。
Map
通话