ここでは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)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
、もう1つは結果が必要なものですFALSE
。おそらく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
ます。そうすることで、すべてではなく一部のテストケースで回答が機能する場合、その理由を簡単に診断できます。例が1つしかない場合、テスト結果のニュアンスが失われます。また、すでに取り組んでいる人のもとで既存の例を変更するのではなく、新しい例を追加するのも良いことです。
lst
が潜在的に長い場合は、他の方法で効率を上げることができます。たとえば、内部リストのいずれかの要素の数が間違っている場合length(unique(lengths(lst))) == 1
に非常に迅速に返される最初のチェックFALSE
...
lst
場合は、一度に1つの項目をと比較lst[[i]]
してと比較しlst[[1]]
、すべての比較を行うのではなく、不一致を見つけたらすぐに停止することができます。場合lst
の長さで、FALSE
Sは共通であり、これは、そうでない場合は、大きな効率ゲインが、それはおそらく価値がない可能性があります。
Map
呼び出しを回避できると思います