Ở đây tôi có các số nguyên 1:7
cho bốn phân vùng khác nhau, ví dụ: {1}, {2,3,4}, {5,6} và {7} và các phân vùng đó được ghi trong một danh sách, nghĩa là , list(1,c(2,3,4),c(5,6),7)
. Tôi coi các phân vùng là các tập hợp, sao cho các phần tử hoán vị khác nhau trong một phân vùng phải được công nhận là cùng một phân vùng. Ví dụ, list(1,c(2,3,4),c(5,6),7)
và list(7,1,c(2,3,4),c(6,5))
là tương đương.
Lưu ý rằng, không có sự lặp lại cho các thành phần trong danh sách, ví dụ, không list(c(1,2),c(2,1),c(1,2))
, vì vấn đề này đang thảo luận về các phân vùng độc quyền trên toàn bộ.
Tôi liệt kê một số hoán vị khác nhau vào danh sách lst
như dưới đây
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)))
và những gì tôi muốn làm là xác minh tất cả các hoán vị là tương đương. Nếu có, sau đó chúng tôi nhận được kết quả TRUE
.
Những gì tôi đã làm cho đến nay là để sắp xếp các yếu tố trong mỗi phân vùng, và được sử dụng setdiff()
với interset()
và union()
để đánh giá nó (xem mã của tôi dưới đây)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
Tuy nhiên, tôi đoán phương pháp này sẽ chậm bất cứ khi nào kích thước phân vùng tăng lên. Có cách tiếp cận nào nhanh hơn để làm cho nó? Đánh giá cao trước!
- một số trường hợp thử nghiệm (dữ liệu kích thước nhỏ)
# 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))
và cũng là trường hợp có kết quả FALSE
, có thể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
. Theo cách đó, khi một câu trả lời hoạt động trên một số, nhưng không phải tất cả, các trường hợp thử nghiệm, thật dễ dàng để chẩn đoán tại sao. Khi chỉ có một ví dụ duy nhất, bạn sẽ mất sắc thái trong kết quả kiểm tra. Thật tốt khi thêm các ví dụ mới thay vì thay đổi các ví dụ hiện có dưới những người đã làm việc với chúng.
lst
nó có khả năng dài, bạn có thể đạt được hiệu quả với các phương pháp khác. Ví dụ: kiểm tra đầu tiên length(unique(lengths(lst))) == 1
sẽ nhanh chóng quay trở lại FALSE
nếu bất kỳ danh sách bên trong nào có số phần tử sai ....
lst
, so sánh lst[[i]]
với lst[[1]]
, và cách mà bạn có thể dừng lại ngay sau khi bạn tìm thấy một không phù hợp, chứ không phải làm tất cả những so sánh. Nếu lst
dài và FALSE
s là phổ biến, điều này có thể đạt được hiệu quả lớn, nhưng có lẽ không có giá trị khác.
Map
cuộc gọi