Di sini saya memiliki bilangan bulat 1:7
untuk 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 lst
seperti 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.
lst
berpotensi panjang, Anda mungkin mendapatkan efisiensi dengan pendekatan lain. Misalnya, cek pertama yang length(unique(lengths(lst))) == 1
akan kembali dengan sangat cepat FALSE
jika 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 lst
panjang dan FALSE
umum, ini bisa menjadi keuntungan efisiensi yang besar, tetapi mungkin tidak sepadan dengan itu.
Map
panggilan