当前位置: 首页 > 知识库问答 >
问题:

求解 nPr(排列)的算法。对于傻瓜

爱刚捷
2023-03-14

是的,我听过RTFM。或者,在这种情况下,RTFSO。如果它出现在“npr”或“排列”的搜索结果中,我会阅读它。虽然我已经实现了Heap的算法,但我不能从那里(所有排列)跳到nPr(一个更大的集合n中长度为r的所有排列)。

一个实际的算法(伪代码也可以)比一个不包括实际代码的冗长解释更受欢迎。如果你想教我理论,好吧,我很乐意从中学习,但我也想要附带的代码。如果你能把Heap的术语放进去,太好了;否则,我会蒙混过关。

我没有任何代码可以向您展示(除非您想看到Heap在VBScript中实现(这是我在工作中必须使用的全部)),因为正如我所说,我不知道从哪里去获取set n的每个r长度子集。

如果我缺乏对nPr的描述,这里有一个非常简单的例子来说明我想要做什么:

鉴于设置...

A, B, C

...我想找到每一个两个字符的排列,像这样:

A B
A C
B C

这个例子过于简单化了,因为我真正想要推导的是一个广义的解决方案,它将一个集合(数组)和每个排列中应该包含的项目数作为调用参数。

嗯…现在我已经把这些都写出来了,我觉得我只需要知道如何从集合n中导出长度为r的所有子集,因为我可以使用堆来找到这些子集的排列。

仅供参考:我今年就50岁了;这不是作业。

共有1个答案

温镜
2023-03-14

递归相对简单:

  • 对于集合中的每个元素,是否使用它
  • 对于这两个变量,与集合的其余部分递归
  • 当结果完成或剩余集为空时停止
  • 对于性能,避免使用启动/位置索引进行实际设置操作

在JavaScript中:

function nPr(set, n) {
  nPrImpl(set, 0, new Array(n), 0);
}

function nPrImpl(set, pos, result, resultPos) {

  // result complete
  if (resultPos == result.length) {
    window.console.log(result);
    return;
  } 

  // No more characters available
  if (pos >= set.length) {
    return;
  }

  // With set[pos]
  result[resultPos] = set[pos];
  nPrImpl(set, pos + 1, result, resultPos + 1);

  // Without
  nPrImpl(set, pos + 1, result, resultPos);
}

// Test:
nPr(['A', 'B', 'C'], 2);

输出:

["A", "B"]
["A", "C"]
["B", "C"]

演示:https://tidejnet.appspot.com/v3/#id=8ht8adf3rlyi

 类似资料:
  • 本文向大家介绍C程序找到nCr和nPr.排列组合,包括了C程序找到nCr和nPr.排列组合的使用技巧和注意事项,需要的朋友参考一下 在C编程语言中,nCr被称为组合。nCr是从n个对象集中选择r个对象,其中对象的顺序无关紧要。 nPr称为置换。nPr是一组“ n”个对象中“ r”个对象的排列,其顺序或顺序应相同。 排列和组合公式 在C语言中找到给定数字的排列和组合的公式如下- nCr = n!/(

  • JavaScript中有一些看起来像却又不是数组的对象,唤作类数组。 本文旨在探究类数组的确切含义和高效的使用方式。 类数组 一个类数组对象: 具有:指向对象元素的数字索引下标以及 length 属性告诉我们对象的元素个数 不具有:诸如 push 、 forEach 以及 indexOf 等数组对象具有的方法 两个典型的类数组的例子是:DOM方法 document.getElementsByCla

  • 有一个集合,例如(1,4,2,5,7,6,9,8,3)。我们通过以下方式计算它的(FD):。inputArray是原始集。例如大小写为(1,4,2,5,7,6,9,8,3)。first差异是从inputArray创建的,方法如下:(inputArray的第二个元素)-(inputArray的第一个元素)等等。 所以给定集合的FD是(3,-2,3,2,-1,3,-1,-5)。任务是找到给定集合的多个

  • 本文向大家介绍C#算法之全排列递归算法实例讲解,包括了C#算法之全排列递归算法实例讲解的使用技巧和注意事项,需要的朋友参考一下 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列; 全排列:当n==m时,称为全排列; 比如:集合{ 1,2,3}的全排列为: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致; 算

  • 本文向大家介绍PHP排序算法系列之归并排序详解,包括了PHP排序算法系列之归并排序详解的使用技巧和注意事项,需要的朋友参考一下 归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有

  • 本文向大家介绍python快排算法详解,包括了python快排算法详解的使用技巧和注意事项,需要的朋友参考一下 快排是python经典算法之一。 1、下面讲解的是什么是快排和快排的图示。 2、快排是一种解决排序问题的运算方法。 3、快排的原理:在数组中任意选择一个数字作为基准,用数组的数据和基准数据进行比较,比基准数字打的数字的基准数字的右边,比基准数字小的数字在基准数字的左边, 第一次排序之后分