4
リスト内のリストが同等であるかどうかを確認するより速い方法はありますか?
ここでは1:7、4つの異なるパーティション、つまり{1}、{2,3,4}、{5,6}、および{7}の整数があり、それらのパーティションはリストに書き込まれlist(1,c(2,3,4),c(5,6),7)ます。1つのパーティション内の要素の異なる順列が同じものとして認識されるように、パーティションをセットとして扱います。たとえば、list(1,c(2,3,4),c(5,6),7)とlist(7,1,c(2,3,4),c(6,5))同等です。 この問題はセット全体の排他的パーティションについて説明しているため、リスト内の要素(noなど)の繰り返しはありません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)))