Burada 1:7
dört farklı bölüm için tamsayılarım var , yani {1}, {2,3,4}, {5,6} ve {7} ve bu bölümler bir listede yazılıyor, yani list(1,c(2,3,4),c(5,6),7)
. Bölümleri kümeler olarak ele alıyorum, böylece bir bölüm içindeki öğelerin farklı permütasyonları aynı bölüm olarak tanınmalıdır. Örneğin list(1,c(2,3,4),c(5,6),7)
ve list(7,1,c(2,3,4),c(6,5))
eşdeğerdir.
Unutmayın, listedeki elemanlar için tekrar yoktur , örneğin, hayır list(c(1,2),c(2,1),c(1,2))
, çünkü bu sorun tüm set üzerindeki özel bölümleri tartışmaktadır.
Listedeki farklı permütasyonlardan bazılarını lst
aşağıdaki gibi listeledim
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)))
ve tüm permütasyonların eşdeğer olduğunu doğrulamak istiyorum. Evet ise, sonuç alırız TRUE
.
Şimdiye kadar yaptığım her bölüm içindeki öğeleri sıralamak ve onunla setdiff()
birlikte kullanmak interset()
ve union()
yargılamaktır (aşağıdaki koduma bakın)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Ancak, bölüm boyutu ölçeklendiğinde bu yöntemin yavaş olacağını düşünüyorum. Bunu yapmak için daha hızlı bir yaklaşım var mı? Şimdiden takdir!
- bazı test durumları (küçük boyutlu veriler)
# 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))
sonuç olması gereken yerde de bir ve FALSE
belkilst_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
. Bu şekilde, bir yanıt, hepsi olmasa da bazı test vakalarında işe yaradığında, nedenini teşhis etmek kolaydır. Sadece tek bir örnek olduğunda, test sonuçlarında nüans kaybedersiniz. Ayrıca, daha önce üzerinde çalışmış olan kişilerin altındaki mevcut örnekleri değiştirmek yerine yeni örnekler eklemek de güzel.
lst
potansiyel olarak uzunsa, diğer yaklaşımlarla verimlilik kazanabilirsiniz. Örneğin, iç listelerden herhangi biri yanlış sayıda öğeye sahipse length(unique(lengths(lst))) == 1
çok hızlı bir şekilde geri dönecek ilk kontrol FALSE
....
lst
, karşılaştırmak lst[[i]]
isteyebilirsiniz lst[[1]]
ve bu şekilde tüm karşılaştırmaları yapmak yerine bir uyumsuzluk bulur bulmaz durdurabilirsiniz. Eğer lst
uzun ve FALSE
s yaygındır, bu muhtemelen aksi takdirde değmez büyük bir verimlilik artışı olabilir, ama.
Map
çağrıyı önleyebilirsiniz