【问题标题】:Creating a permutation of a length 40 vector of boolean values in R在 R 中创建长度为 40 的布尔值向量的排列
【发布时间】:2012-11-02 17:57:34
【问题描述】:

我正在尝试创建向量的独特排列

 c(rep(0,20),rep(1,20))

但组合包中的 permn 显示“向量中的错误....指定的向量大小太大”。

我还尝试了 this question 中的脚本 uniqueperm2 并再次收到“指定的向量太大”错误。

在我的理解 permn 将创建 40!排列。

我也许可以通过找出这个向量的唯一排列的数量来解决我正在研究的整体问题。

对于 R 来说,找到长度为 40 的向量的唯一排列的问题是否太大,谁能向我解释如何计算所列向量的唯一排列的数量?

【问题讨论】:

    标签: algorithm r permutation


    【解决方案1】:

    此向量的每个唯一排列对应于 {1, 2, ..., 40} 中大小为 20 的子集(即 1 的索引)。

    这些子集的数量是“40 选择 20”,即 40! /(20!x 20!)。根据谷歌计算器,这等于 137,846,528,820

    【讨论】:

      【解决方案2】:

      正如你已经被告知的,排列的数量可以计算为:

      R> choose(40,20)
      [1] 137846528820
      

      但是,R 目前可以处理的最长向量是 2^31 - 1 个元素长,即:

      R> 2^31 - 1
      [1] 2147483647
      

      这远小于您要生成的排列数。因此,如果您使用标准函数尝试此操作以生成这些排列combn(),则会遇到您遇到的错误和错误:

      R> combn(40, 20)
      Error in matrix(r, nrow = len.r, ncol = count) : 
        invalid 'ncol' value (too large or NA)
      In addition: Warning message:
      In combn(40, 20) : NAs introduced by coercion
      

      此时,您将不得不求助于编写代码以类似沐浴的方式生成排列,并研究 R 上的众多大数据包之一(请参阅High Performance Computing 任务视图)。

      或者,这将是我的建议,考虑一下您可能会用 1370 亿美元做什么! (美式)排列然后采取另一种方法。如果您可以每秒处理 1 个(即对花费 1 秒的排列做一些有意义的事情),那么您仍然可以在 4000 年的时间内处理结果!

      那么为什么你想要所有的排列呢?较小的随机集就足够了吗?

      【讨论】:

      • 这是一个处理从 20x20 正方形区域的左上角到右下角的路线数量的问题,没有回溯,一次移动 1 个单位。例如,我想生成路线 {1,22,...,441}。但由于数量如此之大,我会满足于只知道路线的数量。
      【解决方案3】:

      有(40 个选择 20 个)独特的排列(即,选择 40 个位置中的 20 个用于 0s,并使用另外 20 个用于 1s。)这仍然是一个很大的数字,但您可以尝试组合(40, 20)

      【讨论】:

      • 在我熟悉的任何 R 中都没有,除了目前可能有一些 R 开发。 R 中最长的向量目前是 2^31 - 1 个元素长。 combn(40,20) 将产生 choose(40,20) 组合(实际上它会产生一个总长度为 2 * choose(40,20) 的向量,因为它将结果存储为一个矩阵。这对于 R 的工具目前来说太大了。
      • @GavinSimpson:确实。我应该计算出实际值。不过,它只是巨大的。顺便说一句,如果 R 用 20 个数字做任何有意义的事情需要一秒钟的时间,我会感到惊讶,即使我听说 R 缺乏速度也是如此。如果你能在一微秒内对每个排列做一些有意义的事情——比如把它扔掉——那么你可以在几天内完成很多事情,而这根本不需要任何并行化。 (哦,它是 0.138 yanqui 万亿。fwiw)
      • @rico 感谢您指出我数不清。现在修好了。至于其他部分;是的,有一些方法可以解决这个问题,并行处理会有所帮助,磁盘存储选项也会有所帮助。假设一个非平凡的计算,我对每个排列的时间持保守态度。 R 通常很快;不过,有时用户友好性会受到影响。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多