使用堆算法生成排列

2023-12-21

我正在尝试使用我在维基百科中找到的堆算法生成数组的所有排列。

这是我到目前为止所尝试的:

n <- 3
A <- c(1, 2, 3)
perm <- function(n, A) {
  if (n == 1)
    print(perm)
  for (i in length(A))
    perm(n, A - 1) 
  if (A %% 2 == 1) {
    swap(A[i], A[n - 1])
  } else {
    swap(A[0], A[n - 1])
  } 
}
perm(3, A)

输出未显示,如果能得到一些帮助就太好了。


9除了一些名称误用之外,所提供的代码还存在四个基本问题:

  1. 维基百科中 Heap 算法的实现假设0-based索引,而 R 的向量是1-based. So A[0]需要翻译成A[1](即数组中的第一个元素),而A[n-1]需要翻译成A[n](这是最后一个元素n-前缀A).

  2. 令人惊讶的是,该代码并不遵循维基百科代码的迭代结构。剥离其本质,正确的代码是(更改为基于 1 的索引):

    define heap(A, n):
      if n == 1: process A
      else:
        for i from 1 to n - 1:    ## Note the n - 1
          heap(A, n - 1)          ## Recurse
          swap A[n] with ...      ## Swap
        end for
        heap(A, n - 1)            ## Recurse
      end if
    

    这个循环的重要方面是交换完成了之间递归,无论是之前还是之后。所以有n递归调用(假设n > 1) 但只有n - 1互换。结果是两个连续排列之间恰好有一次交换,这就是 Heap 算法满足的“格雷码”要求的本质。

  3. 各种伪代码实现(以及 Python 中的具体实现)假设数组参数实际上是通过引用传递的,因此递归调用中的交换对调用者是可见的。但是 R 传递数组value,因此每个递归调用都有自己的数组实例,并且修改不会反映在调用者的数组中。

  4. 交换的计算如下:

    • If n甚至,A[n]被交换为A[1].
    • If n是奇数,A[n]被交换为A[i].

    (请记住,循环限制是n - 1, not n, and n总是大于 1。所以A[n]永远不会与自身交换。)

    提供的代码将其倒退。

为了解决在每次递归调用时复制数组的问题,我们可以使用包含数组的闭包;递归调用的唯一参数是前缀长度。但请注意,在闭包环境中修改数组需要我们使用<<-操作员。

heap_perm <- function(A) {
  h <- function(n) {
    if (n == 1) {
      print(A)
    } else {
      h(n - 1)
      for (i in 1:(n - 1)) {
        if (n %% 2 == 1) pivot <- 1 else pivot <- i
        tmp <- A[n]; A[n] <<- A[pivot]; A[pivot] <<- tmp
        h(n - 1)
      }
    }
  }
  
  h(length(A))
}

在测试 Heap 算法的实现时,使用至少 4 个元素的向量非常重要。 (一个好的测试会使用更大的向量,但四个是一个好的开始。)在检查输出时,您需要检查:

  • 产生正确的排列数(在 4 个元素的向量的情况下为 24);
  • 每个生成的排列都是唯一的;
  • 两个连续的排列仅在一次交换中不同。

验证所有这三个条件将避免堆算法实现中最常见的错误。

以下是上述 R 程序的测试输出:

> heap_perm(0:3)
[1] 0 1 2 3
[1] 1 0 2 3
[1] 2 0 1 3
[1] 0 2 1 3
[1] 1 2 0 3
[1] 2 1 0 3
[1] 3 1 0 2
[1] 1 3 0 2
[1] 0 3 1 2
[1] 3 0 1 2
[1] 1 0 3 2
[1] 0 1 3 2
[1] 0 2 3 1
[1] 2 0 3 1
[1] 3 0 2 1
[1] 0 3 2 1
[1] 2 3 0 1
[1] 3 2 0 1
[1] 3 2 1 0
[1] 2 3 1 0
[1] 1 3 2 0
[1] 3 1 2 0
[1] 2 1 3 0
[1] 1 2 3 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用堆算法生成排列 的相关文章

  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • mclapply 用户时间大于已用时间

    我正在尝试使用mclapply的功能parallel封装在R 该函数通过计算对数似然距离将值分配给序列矩阵 这是一个 CPU 密集型操作 所结果的system time价值观令人困惑 gt system time mclapply work
  • 按绝对值排序

    有谁知道如何按绝对值对 R 中的向量进行排序 所以 2 3 1 gt 1 2 3 etc 如果我在 python 中这样做 我会创建一对每个值及其符号 按绝对值对对列表进行排序 然后重新应用符号 但我对 R 很陌生 所以不知道如何执行此操作
  • 使用 SparkR 1.5 从 RStudio 中的 hdfs 读取大文件(纯文本、xml、json、csv)的选项

    我是 Spark 新手 想知道除了下面的选项之外是否还有其他选项可以使用 SparkR 从 RStudio 读取存储在 hdfs 中的数据 或者我是否正确使用它们 数据可以是任何类型 纯文本 csv json xml 或任何包含关系表的数据
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 在 R 中修改传单弹出窗口

    我想修改 R 中传单弹出窗口的外观 帮助文件指出 in the popupOptions 函数需要 传递给底层 Javascript 对象构造函数的额外选项 In 这个例子 https rstudio github io leaflet p
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 当子集长度为零时,如何简洁地处理子集?

    从向量中排除元素x x lt c 1 4 3 2 我们可以减去位置向量 excl lt c 2 3 x excl 1 1 2 这也是动态工作的 excl lt which x which max x gt quantile x 25 1 2
  • 如何在multilist中设置xlim?

    以下代码创建 3 个向量 并将它们显示为交错直方图 a lt c 1 2 3 b lt c 1 1 2 c lt c 1 1 1 l lt list a b c multhist l col c red green blue xlim c
  • 分割单个 SpatialPolygons 对象的多边形部分

    在 R 中 我有一个SpatialPolygons包含数百个多边形的对象 即多个多边形 我想分割这个SpatialPolygons对象放入列表中Polygons 即孔应保持连接到父多边形 知道如何做到这一点吗 EDITED 使用以下提供的示
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi
  • for 循环与 cor.test 在许多类别上

    我正在尝试在 R 中编写一个循环 它将循环遍历 3 个不同的物种 以计算两个连续变量 Redness 和 VarNormAbund 之间的相关性 我的循环正在运行 但 3 个物种中每一个的输出都是相同的 这让我认为循环卡在第一个物种上 co
  • 如何制作一连串的ggplots并在它们之间绘制箭头?

    对于一个项目 我需要绘制一些图并在它们之间放置箭头作为序列的指示 我想知道我是否可以用 ggplot 来做到这一点 是否可以使用 ggplot2 绘制一个干净的大箭头并将其添加到最终的多重图中 作为示例 我使用此代码来绘制绘图 librar
  • 求解非线性方程组

    我正在尝试求解以下四个方程组 我尝试过使用 rootSolve 包 但似乎我无法通过这种方式找到解决方案 我正在使用的代码如下 model lt function x F1 lt sqrt x 1 2 x 3 2 1 F2 lt sqrt
  • 如何处理包内部的 R 数据?

    我正在开发的 R 包需要多个 R 数据对象 例如预先计算的模型和参数 目前 我将包的 数据 目录中的每个对象放在单独的 RData 文件中 使用该包时 用户可以使用 数据 功能将这些对象附加到他们的环境中 我想要的行为是 在加载包时 数据对
  • 替换rmarkdown/knitr/pdf中字幕的自动编号

    我正在使用 Rmarkdown 生成 PDF 文档 我想在其中手动定义图号 下面是一个块的示例 r chunk26 fig cap Fig 5 3 My figure caption plot 1 1 我使用特殊的编号来遵循文档的章节 问题
  • 当在另一行中找到元素逗号分隔时合并行

    您好 我有一个数据框 例如 species family Events groups 1 SP1 A 10 22 G1 2 SP1 B 7 G2 3 SP1 C D 4 5 6 1 3 G3 G4 G5 G6 4 SP2 A 22 10 G
  • R Shiny - 使用 DataTable 移动列名称

    我有一个非常复杂的闪亮代码 其中有几个面板和这些面板内的几个表格 启动应用程序时 列名称与列值正确对齐 但是 一旦我更改应用程序表格下的页码 列名称就会移动到左侧 而值仍保留在中间 如何强制应用程序使列名称与列值对齐 一个可重现的例子 li
  • Django模型递归关系

    为什么要创建递归关系 aField models ForeignKey self 这和上面的一样吗 class aClass models Model aField models ForeignKey aClass 当您希望父节点和子节点具

随机推荐

  • 创建效果 上滑时顶部图片被内容覆盖

    I have to create an effect like in the images but I don t know how to do it and also don t know how to call this effect
  • SQL 语句中文字前面的冒号是什么意思?

    使用 在变量之前 例如 userId在这段代码中 public function removeUser userId command Yii app gt db gt createCommand command gt delete tbl
  • AX 形式的图像

    在 Dynamics AX 中 我们在自定义表单中出于各种目的使用大量图像和图标 目前 我们必须在每台客户端计算机上单独安装图像 图标包才能使一切正常工作 有没有一种方法 或最佳实践 来处理 Dynamics 中的图像和图标 这样就不需要在
  • 使用StreamWriter实现滚动日志,并从顶部删除

    我的 C winforms 4 0 应用程序一直使用线程安全的流编写器来执行内部调试日志记录信息 当我的应用程序打开时 它会删除该文件并重新创建它 当应用程序关闭时 它会保存文件 我想做的是修改我的应用程序 以便它进行附加而不是替换 这是一
  • Grails 2.x schema-export 或类似命令能否为给定数据源的模式更新生成 DDL?

    Grails schema export 在生成 DDL 来为特定数据库创建数据库模式方面做得很好 然而我想做的是让 grails 只输出用于更新已创建模式的 DDL 而不是从头开始创建它的 DDL 我认为这应该是可能的 因为 grails
  • 如何获取 PDF 格式的 UITableView 快照

    我有一个UITableView其中填充了一些数据 但由于它包含的数据的单元格数量多于屏幕的可视区域 我只能获取它的快照 我想知道是否有其他方法可以获取整个表格视图pdf快照 这是我尝试过的谢谢 IBAction clickMe id sen
  • 如何对关系代数中不存在的事物进行建模或查询[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想查询所有从未租过的公寓的id 我尝试过这样的事情 a id apartments a id from date Exists end d
  • Linux /proc/kallsyms 文件,内核在哪里保存核心符号列表?

    要显示符号 proc kallsyms 对于模块符号 内核循环遍历以modules内核变量 并迭代每个模块的符号表 但对于 核心 内核内置符号 它使用了一堆内核变量 如以下函数所示 static unsigned long kallsyms
  • 如何使用otool

    苹果建议我使用 strings 或 otool 来检测代码中的私有API isinf 我完全是新手 所以如何使用这些工具有任何帮助 打开终端 Ctrl 空格 gt 输入 终端 并打印示例 otool MVv yourlib a 求助 oto
  • 致命错误:未找到“TCPDF”类

    我正在生成 PDF 文件 但遇到了麻烦 谁能告诉我这个错误的解决方案 下面是我为此使用的代码 我为此包含了 tcpdf 但有一个致命错误 表明 tcpdf 文件不可用 或者我们可以说找不到
  • 创建一个类,使用 es6 类语法创建 Function 对象作为实例

    是否可以创建一个类 用其原型上的方法实例化函数 我正在尝试将代码从原型结构转换为使用 es6 类语法 这是一个人为的 过于简化的起点示例 function createFun init function fun newDats this d
  • 高级项目的语言好用吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这是我大学的最后一个学期 我必须在十二月做一个大型演讲 我计划设计一种小型语言 它不仅可以工作 而且还具有一些漂亮的功能 有没有人有任何有趣的语法想法
  • 我应该如何在 jQuery 文件上传插件中实现客户端加密?

    我正在尝试在 jQuery 文件上传插件中实现客户端加密 我试图遵循我发现的一些信息 迭代文件数组 将每个项目替换为代表加密文件的 Blob 加密完成后 调用回调 但我目前正在挣扎 var encryptFiles function fil
  • laravel查询php如何获取范围内的最大值

    hello how do i get the max value of scores where column ID range starts at 3 5 example table 我想获得分数的最大值 其中列ID范围为3 5 请帮忙
  • 替换 ASP.NET vNext 中的 HttpHandler

    我读到 HttpHandlers 不是 ASP NET 5 vNext 的一部分 是否有可以使用的替代品 其工作原理相同 我正在寻找一种可以根据实体的 id 加载图像的解决方案 如果该图像不存在 则应显示 非图像 图像 这与 http 处理
  • 在 sp_execute_external_script 中使用时出现 pyodbc.OperationalError

    我的 Python 代码在从 PyCharm 运行时运行良好 但是当我使用 SQL Server 运行相同的代码时sp execute external script 我收到错误 知道这是怎么回事吗 Python代码 import pyod
  • YCM 找不到我的标头?

    我有以下文件夹结构 include ctset hashtable h set h src hashtable hashtable c And in hashtable c包括 include ctset hashtable h 但 YCM
  • CSS - 浮动到最大宽度

    所以我在半弹性容器中制作一排物品 左侧有一个个人资料图像 然后内容浮动到其右侧 两者都向左浮动 我想做的是使内容浮动为最大可能宽度而不是最小可能宽度 作为浮动原因 CSS container max width 800px min widt
  • 保存身份验证令牌的最佳方法?

    我一直致力于用 C 实现 api 实施进展顺利 但我确实遇到了一个问题 当我的图书馆对 api 进行授权时 我有一个 auth token 我用它来对 Web 服务进行后续查询 令牌需要在程序运行之间保留 因为它对用户来说保持不变 尽管我确
  • 使用堆算法生成排列

    我正在尝试使用我在维基百科中找到的堆算法生成数组的所有排列 这是我到目前为止所尝试的 n lt 3 A lt c 1 2 3 perm lt function n A if n 1 print perm for i in length A