0

R で 1 から 15 までの 15 個の数値の順列を計算する必要があります。

library(combinat)
#With 1 to 3
permn(3)
#With 1 to 10
options(max.print=factorial(10))
permn(10)

順列の量を考慮すると、上記の permn(10) のコードはわずか 5 分しかかからず、必要なものだけを提供してくれます (とにかく速度には関心がありません)。

ただし、これを 15 個の数字 (1 ~ 15) で行う必要があります。残念ながら、私が試してみるとRはエラーを返します:

permn(15)
  Error in vector("list", gamma(n + 1)) : 
  vector size specified is too large

EDIT これは段階的に行うことができますか? これを使用してデータセットを並べ替えてから計算を行うので、これを段階的に行うことができます。たとえば、最初の 300,000 順列を実行し、計算を適用してから、次の 300,000 順列を実行します。つまり、x 順列を計算します。次に、ループで最初の順列に従ってデータセットの列を並べ替え、計算を行い、2 番目の順列についても同じことを行います。

これを回避する方法を知っていますか?代わりに C コードを使用する価値はありますか? いくつかの例 (例: 12 ) を見つけましたが、C がどのように機能するかわかりません。Rで動作させることができません(おそらく、Cコードが何をしているのか理解していないためです)。

Rccp、Rtoolsをインストールし、単純なcppFunctionの例を試してみましたが、うまくいきましたが、文字列の順列をどこにも取得できませんでした(上記のリンクにコードを含めようとすると、 sourceCpp(code でエラーエラーが発生します) = code, env = env, rebuild = rebuild, showOutput = showOutput, : . 正確には、C コードを理解していないため、実行したコードを表示するのはおそらく無意味です (ほとんどの場合、間違っています)。

Rから上記の(または可能であればより良い)Cコードを実行する方法を教えてくれる人はいますか、Rでそれを回避する方法はありますか?

どうもありがとう

注: 順列の数を変更し、文字列から数値に移動したため、これを再投稿しました。また、何をする必要があるかについての詳細も追加しました。

4

1 に答える 1

3

本当の問題はそれ15!=1,307,674,368,000です。これは、メモリに保存するどころか、繰り返し処理するにはリストが多すぎます。

permn(15)議論のために、 の各反復に の1 回の反復と同じ時間がかかり、後者は合計で 5 分かかると仮定するとpermn(10)、計算時間は 3.4 年になります。

これは組み合わせ爆発と呼ばれます。

于 2013-03-20T17:13:54.007 に答える