Ici, j'ai des entiers 1:7
pour quatre partitions différentes, à savoir {1}, {2,3,4}, {5,6} et {7} et ces partitions sont écrites dans une liste, c'est-à-dire list(1,c(2,3,4),c(5,6),7)
. Je traite les partitions comme des ensembles, de sorte que différentes permutations d'éléments au sein d'une partition doivent être reconnues comme identiques. Par exemple, list(1,c(2,3,4),c(5,6),7)
et list(7,1,c(2,3,4),c(6,5))
sont équivalents.
Notez qu'il n'y a pas de répétition pour les éléments de la liste, par exemple, non list(c(1,2),c(2,1),c(1,2))
, car ce problème traite des partitions exclusives sur l'ensemble.
J'ai énuméré certaines des différentes permutations dans la liste lst
ci-dessous
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)))
et ce que je veux faire est de vérifier que toutes les permutations sont équivalentes. Si oui, alors nous obtenons un résultat TRUE
.
Ce que j'ai fait jusqu'à présent, c'est trier les éléments dans chaque partition, et les utiliser setdiff()
avec interset()
et union()
pour les juger (voir mon code ci-dessous)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Cependant, je suppose que cette méthode serait lente chaque fois que la taille de la partition augmente. Existe-t-il une approche plus rapide pour y parvenir? Apprécié à l'avance!
- certains cas de test (données de petite taille)
# 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))
et aussi un où le résultat devrait être FALSE
, peutlst_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 cette façon, lorsqu'une réponse fonctionne sur certains cas de test, mais pas sur tous, il est facile de diagnostiquer pourquoi. Lorsqu'il n'y a qu'un seul exemple, vous perdez des nuances dans les résultats du test. Il est également agréable d'ajouter de nouveaux exemples plutôt que de modifier des exemples existants sous des personnes qui ont déjà travaillé dessus.
lst
est potentiellement longue, vous pourriez gagner en efficacité avec d'autres approches. Par exemple, un premier chèque qui length(unique(lengths(lst))) == 1
reviendrait très rapidement FALSE
si l'une des listes internes avait le mauvais nombre d'éléments ....
lst
, en le comparant lst[[i]]
à lst[[1]]
, et de cette façon, vous pouvez vous arrêter dès que vous constatez un décalage, plutôt que de faire toutes les comparaisons. Si lst
est long et FALSE
s sont communs, cela pourrait être un gros gain d'efficacité, mais probablement pas la peine autrement.
Map
appels multiples