Qui ho numeri interi 1:7per 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 lstcome 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))) == 1tornerebbe molto rapidamente FALSEse 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 lstlong e FALSEs sono comuni, questo potrebbe essere un grande guadagno di efficienza, ma probabilmente non ne vale la pena altrimenti.
Mapchiamate multiple