Здесь у меня есть целые числа 1:7
для четырех различных разделов, т.е. {1}, {2,3,4}, {5,6} и {7} и эти разделы написаны в списке, то есть list(1,c(2,3,4),c(5,6),7)
. Я рассматриваю разделы как наборы, так что различные перестановки элементов в одном разделе должны распознаваться как один и тот же. Например, list(1,c(2,3,4),c(5,6),7)
и list(7,1,c(2,3,4),c(6,5))
эквивалентны.
Обратите внимание, что нет повторения для элементов в списке, например, нет list(c(1,2),c(2,1),c(1,2))
, так как эта проблема обсуждает исключительные разделы по всему набору.
Я перечислил некоторые из различных перестановок в списке, lst
как показано ниже
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)))
и я хочу убедиться, что все перестановки эквивалентны. Если да, то мы получим результат TRUE
.
То , что я сделал до сих пор является для сортировки элементов в пределах каждого раздела, и используются setdiff()
с interset()
и union()
судить о нем (см моего кода ниже)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Тем не менее, я думаю, что этот метод будет медленным, когда размер раздела увеличивается. Есть ли более быстрый подход, чтобы сделать это? Ценим заранее!
- некоторые тестовые случаи (данные небольшого размера)
# 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))
а также тот, где должен быть результат FALSE
, может бытьlst_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
. Таким образом, когда ответ работает на некоторых, но не на всех тестовых случаях, легко определить причину. Когда есть только один пример, вы теряете нюанс в результатах теста. Также приятно добавлять новые примеры, а не изменять существующие примеры под людьми, которые уже работали над ними.
lst
потенциально велика , вы могли бы повысить эффективность с другими подходами. Например, первая проверка, length(unique(lengths(lst))) == 1
которая очень быстро вернулась FALSE
бы, если бы у любого из внутренних списков было неправильное число элементов ....
lst
, по сравнению lst[[i]]
с lst[[1]]
, и таким образом вы можете остановиться , как только вы нашли несоответствие, а не делать все сравнения. Если lst
это long и FALSE
s распространены, это может привести к значительному увеличению эффективности, но, вероятно, не стоит этого.
Map
звонков