基于百分比的可能排列算法

时间:2017-07-06 20:38:37

标签: javascript algorithm permutation

我希望找到7个字母集中以下6个字母的所有可能排列。 [a,b,c,d,e,f]

问题是每个字母对应一定百分比。每个7个字母集的总百分比需要为100%

答:0% <= a < 1%

B:1% <= b <= 5%

C:5% < c <= 25%

D:25% < d <= 50%

E:50% < e <= 75%

F:75% < f <= 100%

例如,这些是可能的集合:

  • [a,a,a,a,a,a,f]:所有A都可以是0%而F可以是100%
  • [d,d,b,a,a,a,a]:D各占47%。 B可以是5%,A可以弥补剩余的1%。

但这些是不可能的:[f,a,a,a,a,a,f][e,e,e,a,a,a,a],因为他们的总数超过100%。

我一直试图用javascript做这件事,但是没有多少运气。我能够使用这个小提琴生成所有可能的排列:https://jsfiddle.net/v4s6xk5x/。不幸的是,这并没有考虑百分比。

我真的只想要排列而不需要代码。但是任何语言的代码都会有所帮助,这样我才能理解发生了什么。

如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

递归解决方案的示例:

作为输入,你有:

size: 7
letters: [a,b,c,d,e,f]
minval: [0,1,5,25,50,75]
maxval: [1,5,25,50,75,100]

首先制作一个空集以及此集的最小值和最大值:

set: []
min: 0
max: 0

然后将此集传递给递归函数,该函数应该:

  • 迭代每一封信。
  • 检查设定的最小值+字母的最小值<= 100。
  • 如果是,请创建一个set,min和max的副本,其中包含字母和字母的最小值和最大值;否则,继续下一封信。
  • 如果设置副本的长度等于大小,并且其最大值> = 100,则这是有效集;打印或添加到输出。
  • 如果设置副本的长度小于size,则使用set_copy,min_copy和max_copy进行递归。

这适用于任何大小,任意数量的字母以及任何最小值和最大值,无论它们是否有序。

这会产生重复,例如:

[a,a,a,a,a,a,f]
[a,a,a,a,a,f,a]
[a,a,a,a,f,a,a]
...

如果您只想生成唯一的解决方案,请开始迭代上一个字母中添加到集合中的字母。

这是一个代码示例。它是上面列出的步骤的字面翻译,增加的特性是它只通过将先前添加的字母的索引传递给递归(变量prev)来生成唯一的解决方案,然后从那里开始迭代写到最后。如果您需要非唯一解决方案,请每次从0开始迭代。

检查最小值是< 100而不是<= 100,确保所有范围都排除低阈值并包含高阈值。

请注意,addLetter()作为参数接收的所有变量或var内的addLetter()声明的变量都是局部变量,并且每个递归都是分开的。

&#13;
&#13;
function rangeSet(size, letters, minval, maxval) {
    addLetter([], 0, 0, 0);

    function addLetter(set, min, max, prev) {
        for (var lt = prev; lt < letters.length; lt++) {
            if (min + minval[lt] < 100) {
                var set_copy = set.concat([letters[lt]]);
                var min_copy = min + minval[lt];
                var max_copy = max + maxval[lt];
                if (set_copy.length == size) {
                    if (max_copy >= 100) {
                        document.write(set_copy + "<br>");
                    }
                }
                else addLetter(set_copy, min_copy, max_copy, lt);
            }
        }
    }
}

rangeSet(7, ['a','b','c','d','e','f'], [0,1,5,25,50,75], [1,5,25,50,75,100]);
&#13;
&#13;
&#13;