Di sini saya memiliki bilangan bulat 1:7untuk empat partisi yang berbeda, yaitu {1}, {2,3,4}, {5,6}, dan {7} dan partisi tersebut ditulis dalam daftar, yaitu list(1,c(2,3,4),c(5,6),7),. Saya memperlakukan partisi sebagai set, sehingga permutasi elemen yang berbeda dalam satu partisi harus diakui sebagai yang sama. Misalnya, list(1,c(2,3,4),c(5,6),7)dan list(7,1,c(2,3,4),c(6,5))setara.
Perhatikan bahwa, tidak ada pengulangan untuk elemen dalam daftar, misalnya, tidak list(c(1,2),c(2,1),c(1,2)), karena masalah ini membahas partisi eksklusif di seluruh set.
Saya mendaftarkan beberapa permutasi yang berbeda ke dalam daftar lstseperti di bawah ini
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)))
dan yang ingin saya lakukan adalah memverifikasi semua permutasi setara. Jika ya, maka kami mendapatkan hasil TRUE.
Apa yang saya lakukan sejauh ini adalah menyortir elemen-elemen di dalam setiap partisi, dan menggunakannya setdiff()dengan interset()dan union()menilainya (lihat kode saya di bawah)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Namun, saya kira metode ini akan lambat setiap kali ukuran partisi naik. Apakah ada pendekatan yang lebih cepat untuk membuatnya? Dihargai di muka!
- beberapa test case (data ukuran kecil)
# 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))dan juga di mana hasilnya seharusnya FALSE, mungkinlst_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. Dengan begitu, ketika jawaban berhasil pada beberapa, tetapi tidak semua, menguji kasus, mudah untuk mendiagnosis sebabnya. Ketika hanya ada satu contoh, Anda kehilangan nuansa dalam hasil tes. Lebih baik menambahkan contoh baru daripada mengubah contoh yang ada di bawah orang yang telah mengerjakannya.
lstberpotensi panjang, Anda mungkin mendapatkan efisiensi dengan pendekatan lain. Misalnya, cek pertama yang length(unique(lengths(lst))) == 1akan kembali dengan sangat cepat FALSEjika ada daftar bagian dalam yang memiliki jumlah elemen yang salah ....
lst, membandingkan lst[[i]]untuk lst[[1]], dan dengan cara itu Anda dapat berhenti segera setelah Anda menemukan ketidakcocokan, daripada melakukan semua perbandingan. Jika lstpanjang dan FALSEumum, ini bisa menjadi keuntungan efisiensi yang besar, tetapi mungkin tidak sepadan dengan itu.
Mappanggilan