N个数字与保留顺序的组合

时间:2015-10-20 06:32:49

标签: math combinations

在组合问题中,我们都知道我们可以2n方式将2n!项放在一起。但现在说我有两套物品:

Set A = {a_1, a_2, ...., a_n}, A.length = n
Set B = {b_1, b_2, ...., b_n}, B.length = n

我的问题是:您可以通过多少种方式将这些2n项放在一起,以保持其相对顺序,例如a_i a_(i-1)不能放在b_i之前,b_(i-1)不能放在b_i之前,a_i可以放在A=〈a_1, a_2, a_3 〉 B=〈b_1, b_2, b_3 〉 之前。

示例:

a_1 a_2 b_1 a_3 b_2 b_3
b_1 a_1 a_2 b_2 b_3 a_3

法律格式:

a_1 b_2 a_2 b_1 a_3 b_3 (b_2 visited before b_1).

非法格式:

$scope.savebutton = function() {
  angular.forEach($scope.textboxes, function(text) {

    if (text != undefined && text.length != 0) {
      inputs = [];
      angular.forEach($scope.textboxes, function(t) {
        inputs.push(t);
      });
    }
  });
  var textfield = {
    id: "1",
    Name: "textbox"
  }


  $scope.form = {};
  $scope.form.fields = [];

  $scope.form.fields.push(textfield);
  console.log(angular.toJson($scope.form));
  ngDialog.closeAll();
};

2 个答案:

答案 0 :(得分:2)

您不是在搜索组合,而是搜索排列,更具体地说是重复排列。为什么?从第一组中选择元素的n位置后,只有一种方法可以将元素从集合中放入这些位置(因为它们必须按顺序排列)。同样的推理适用于第二组。因此,您的问题等同于此问题:找到长度2n的二进制字数,n个零和n个。这是在任何离散数学课程中学到的东西,答案是(2n)! / (n! * n!)

n = 2的示例:A = {a_1,a_2},B = {b_1,b_2}。可能的排列是:

(a_1,b_1,b_2,a_2),

(a_1,a_2,b_1,b_2),

(a_1,b_1,a_2,b_2),

(b_1,a_1,a_2,b_2),

(b_1,b_1,a_1,1_2),

(b_1,a_1,b_2,a_2)

当然符合公式(4!)/(2!* 2!)= 6.

一个提示:以编程方式为大n计算此数字时,请注意处理溢出。首先计算分子然后除以分母并不是一个好习惯,因为因为阶乘增长很快所以很有可能出现溢出。

答案 1 :(得分:1)

请注意,这个答案是不正确的,因为您必须使用字符串中两个集合中的所有内容,并且如果您在序列末尾选择数字,则字符串中的数字将会出现顺序您无法自由选择所有剩余的数字。

每当您从任一组中选择一个时,它会将您的选项限制为第二组中右侧的选项,或者选择最后一个选项右侧的选项

您首先从两个选项中选择1t - 2个选项    这使你从你选择的集合中的另一个集合+ n-1中得到n = 2n-1,你可以选择下一个选择。 < - 无法从此套装中选择任何内容。您只能从任一组中选择下一个    然后2n-2为第3,依此类推    2 *(2N-1)的(2N-2)(2N-3).... 1

答案是2 *(2n-1)!

我累了,如果我这么久就很高兴被证明是错的。