Aquí tengo los números enteros 1:7
de cuatro particiones diferentes, es decir, {1}, {2,3,4}, {5,6} y {7} y esas particiones están inscritos en una lista, es decir, list(1,c(2,3,4),c(5,6),7)
. Trato las particiones como conjuntos, de modo que la permutación diferente de elementos dentro de una partición se reconozca como la misma. Por ejemplo, list(1,c(2,3,4),c(5,6),7)
y list(7,1,c(2,3,4),c(6,5))
son equivalentes.
Tenga en cuenta que no hay repetición de elementos en la lista, por ejemplo, no list(c(1,2),c(2,1),c(1,2))
, ya que este problema está discutiendo particiones exclusivas en todo el conjunto.
Enumeré algunas de las diferentes permutaciones en la lista a lst
continuación
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)))
y lo que quiero hacer es verificar que todas las permutaciones sean equivalentes. En caso afirmativo, obtenemos el resultado TRUE
.
Lo que hice hasta ahora es para ordenar los elementos dentro de cada partición, y se utiliza setdiff()
con interset()
y union()
para juzgarlo (ver mi código de abajo)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Sin embargo, supongo que este método sería lento siempre que el tamaño de la partición aumente. ¿Hay algún enfoque más rápido para hacerlo? Apreciado de antemano!
- algunos casos de prueba (datos de tamaño pequeño)
# 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))
y también uno donde el resultado debería ser FALSE
, tal vezlst_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
. De esa manera, cuando una respuesta funciona en algunos casos de prueba, pero no en todos, es fácil diagnosticar por qué. Cuando solo hay un solo ejemplo, pierdes matices en los resultados de la prueba. También es bueno agregar nuevos ejemplos en lugar de cambiar los ejemplos existentes en personas que ya han trabajado en ellos.
lst
es potencialmente larga, podría ganar eficiencia con otros enfoques. Por ejemplo, una primera verificación que length(unique(lengths(lst))) == 1
regresaría muy rápidamente FALSE
si alguna de las listas internas tiene el número incorrecto de elementos ...
lst
, al comparar lst[[i]]
a lst[[1]]
, y de esa manera se puede parar tan pronto como se encuentra una falta de coincidencia, en lugar de hacer todas las comparaciones. Si lst
es largo y FALSE
s son comunes, esto podría ser una gran ganancia de eficiencia, pero probablemente no valga la pena de otra manera.
Map
llamadas múltiples