Qui ho numeri interi 1:7
per quattro diverse partizioni, ad esempio {1}, {2,3,4}, {5,6} e {7} e quelle partizioni sono scritte in un elenco, ad es list(1,c(2,3,4),c(5,6),7)
. Tratto le partizioni come set, in modo tale che la diversa permutazione degli elementi all'interno di una partizione debba essere riconosciuta come la stessa. Ad esempio, list(1,c(2,3,4),c(5,6),7)
e list(7,1,c(2,3,4),c(6,5))
sono equivalenti.
Si noti che non vi è alcuna ripetizione per gli elementi nell'elenco, ad esempio no list(c(1,2),c(2,1),c(1,2))
, poiché questo problema sta discutendo le partizioni esclusive sull'intero set.
Ho elencato alcune delle diverse permutazioni nell'elenco lst
come di seguito
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)))
e quello che voglio fare è verificare che tutte le permutazioni siano equivalenti. Se sì, otteniamo il risultato TRUE
.
Quello che ho fatto finora è stato quello di ordinare gli elementi all'interno di ogni partizione, e usato setdiff()
con interset()
e union()
giudicarlo (vedi il mio codice di seguito)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Tuttavia, suppongo che questo metodo sarebbe lento ogni volta che la dimensione della partizione aumenta. Esiste un approccio più rapido per farlo? Apprezzato in anticipo!
- alcuni casi di test (dati di piccole dimensioni)
# 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))
e anche uno in cui il risultato dovrebbe essere FALSE
, forselst_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
. In questo modo, quando una risposta funziona su alcuni, ma non su tutti, casi di test, è facile diagnosticare il perché. Quando c'è un solo esempio, perdi sfumature nei risultati del test. È anche bello aggiungere nuovi esempi piuttosto che cambiare quelli esistenti sotto persone che hanno già lavorato su di essi.
lst
è potenzialmente lunga, potresti ottenere efficienza con altri approcci. Ad esempio, un primo controllo che length(unique(lengths(lst))) == 1
tornerebbe molto rapidamente FALSE
se una delle liste interne avesse un numero errato di elementi ....
lst
, il confronto lst[[i]]
a lst[[1]]
, e in questo modo ci si può fermare al più presto a trovare un disallineamento, piuttosto che fare tutti i confronti. Se lst
long e FALSE
s sono comuni, questo potrebbe essere un grande guadagno di efficienza, ma probabilmente non ne vale la pena altrimenti.
Map
chiamate multiple