Tutaj mam liczby całkowite 1:7
dla czterech różnych partycji, tj. {1}, {2,3,4}, {5,6} i {7}, a te partycje są zapisane na liście, tj list(1,c(2,3,4),c(5,6),7)
. Traktuję partycje jak zestawy, tak że różne permutacje elementów w obrębie jednej partycji powinny być rozpoznawane jako ta sama. Na przykład list(1,c(2,3,4),c(5,6),7)
i list(7,1,c(2,3,4),c(6,5))
są równoważne.
Zauważ, że nie ma powtórzeń dla elementów na liście, np. Nie list(c(1,2),c(2,1),c(1,2))
, ponieważ problemem jest omawianie wyłącznych partycji w całym zestawie.
Wymieniłem niektóre z różnych permutacji na liście, lst
jak poniżej
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)))
i chcę sprawdzić, czy wszystkie permutacje są równoważne. Jeśli tak, to otrzymamy wynik TRUE
.
Co zrobiłem tak daleko jest do sortowania elementów w każdej partycji, a używany setdiff()
z interset()
i union()
aby ją ocenić (patrz mój kod poniżej)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Jednak myślę, że ta metoda byłaby wolna, ilekroć rozmiar partycji zostanie zwiększony. Czy jest jakieś szybsze podejście, aby to zrobić? Doceniany z góry!
- niektóre przypadki testowe (dane o małym rozmiarze)
# 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))
a także taki, w którym wynik powinien być FALSE
, być możelst_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
. W ten sposób, gdy odpowiedź działa na niektórych, ale nie wszystkich przypadkach testowych, łatwo zdiagnozować dlaczego. Gdy jest tylko jeden przykład, tracisz niuans w wynikach testu. Przyjemnie jest też dodawać nowe przykłady, zamiast zmieniać istniejące przykłady pod osobami, które już nad nimi pracowały.
lst
jest potencjalnie długa, możesz zyskać na wydajności przy innych podejściach. Np. Pierwsza kontrola, length(unique(lengths(lst))) == 1
która bardzo szybko powróciłaby, FALSE
gdyby którakolwiek z wewnętrznych list zawierała nieprawidłową liczbę elementów ....
lst
porównując lst[[i]]
do lst[[1]]
, i w ten sposób można zatrzymać jak najszybciej znaleźć niedopasowania, zamiast robić wszystkich porównań. Jeśli lst
jest długi, a FALSE
s są powszechne, może to być duży wzrost wydajności, ale prawdopodobnie nie jest tego wart.
Map
połączeń