여기에는 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))
동일하다.
이 문제가 전체 세트에 대한 배타적 파티션에 대해 논의하고 있기 때문에 list의 요소 (예 : 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
길이와 FALSE
의 공통점이며, 이것은 아마도 그렇지 않으면 가치가 큰 효율이 증가 될 수 있지만 수 있습니다.
Map
통화를 피할 수있을 것 같습니다