Hier habe ich ganze Zahlen 1:7
für vier verschiedene Partitionen, dh {1}, {2,3,4}, {5,6} und {7}, und diese Partitionen werden in eine Liste geschrieben, dh , list(1,c(2,3,4),c(5,6),7)
. Ich behandle die Partitionen als Mengen, so dass unterschiedliche Permutationen von Elementen innerhalb einer Partition als dieselbe erkannt werden sollten. Zum Beispiel list(1,c(2,3,4),c(5,6),7)
und list(7,1,c(2,3,4),c(6,5))
sind gleichwertig.
Beachten Sie, dass Elemente in der Liste nicht wiederholt werden , z. B. nein list(c(1,2),c(2,1),c(1,2))
, da bei diesem Problem exklusive Partitionen über den gesamten Satz diskutiert werden.
Ich habe einige der verschiedenen Permutationen lst
wie folgt in die Liste aufgenommen
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)))
und was ich tun möchte, ist zu überprüfen, ob alle Permutationen gleichwertig sind. Wenn ja, dann erhalten wir Ergebnis TRUE
.
Was ich bisher getan haben , ist die Elemente innerhalb jeder Partition zu sortieren, und verwendet setdiff()
mit interset()
und union()
es zu beurteilen (siehe meinen Code unten)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Ich denke jedoch, dass diese Methode langsam ist, wenn die Partitionsgröße vergrößert wird. Gibt es einen schnelleren Ansatz, um es zu schaffen? Im Voraus geschätzt!
- einige Testfälle (kleine Daten)
# 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))
und einen, bei dem das Ergebnis FALSE
vielleicht sein solltelst_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
. Auf diese Weise ist es einfach zu diagnostizieren, warum eine Antwort auf einige, aber nicht alle Testfälle funktioniert. Wenn es nur ein einziges Beispiel gibt, verlieren Sie Nuancen in den Testergebnissen. Es ist auch schön, neue Beispiele hinzuzufügen, anstatt vorhandene Beispiele unter Personen zu ändern, die bereits daran gearbeitet haben.
lst
möglicherweise lang ist, können Sie mit anderen Ansätzen an Effizienz gewinnen. ZB eine erste Überprüfung, length(unique(lengths(lst))) == 1
die sehr schnell zurückkehren würde, FALSE
wenn eine der inneren Listen die falsche Anzahl von Elementen enthält ...
lst
, vergleichen lst[[i]]
zu lst[[1]]
, und auf diese Weise können Sie so schnell stoppen , wie Sie eine fehlende Übereinstimmung finden, anstatt alle Vergleiche zu tun. Wenn lst
es lang ist und FALSE
s üblich sind, könnte dies ein großer Effizienzgewinn sein, aber es lohnt sich wahrscheinlich nicht anders.
Map
Anrufe vermeiden