Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中求解(m选择x)=n的有效算法_Python_Algorithm_Permutation - Fatal编程技术网

python中求解(m选择x)=n的有效算法

python中求解(m选择x)=n的有效算法,python,algorithm,permutation,Python,Algorithm,Permutation,给定 m:要设计的海报数量 n:可用颜色的总数 解决 x:每张海报的颜色数量,以便每张海报具有独特的颜色组合 以等式为准 (n选择x)=m 我已经用python编写了上述问题,下面给出了源代码 factorial = [] def generateList(n): factorial.append(1) factorial.append(1) for i in range(2,n+1): factorial.append(i * factorial[i

给定

m:要设计的海报数量
n:可用颜色的总数

解决

x:每张海报的颜色数量,以便每张海报具有独特的颜色组合

以等式为准

(n选择x)=m

我已经用python编写了上述问题,下面给出了源代码

factorial = []

def generateList(n):
    factorial.append(1)
    factorial.append(1)

    for i in range(2,n+1):
        factorial.append(i * factorial[i-1])

def calculateFac(n,i):
    return int((factorial[n]) / (factorial[i] * factorial[n-i]))

def ColorChoice(m,n):
    for i in range(1,int(n/2)+1):
        if m == calculateFac(n,i):
            return i
    return -1

def checkChoose(m,n):
    generateList(n)
    return ColorChoice(m,n)

print (checkChoose(35,7))
上面的解决方案将只适用于小整数,但我需要一个解决方案来适用于较大的数字,例如,当n=47129212243960时

有什么有效的方法来解决这个问题吗?

因为
(n选择x)==(n选择(n-x))
,而且似乎你想找到最小的
x
,我们可以在
0
n/2
之间搜索
x
。另外,对于任意的
n
m
,可能不存在这样的
x
,但可能您想要的是最小的
x
,如果存在的话,使得
(n选择x)>=m
,也就是说,最小的
x
保证您可以制作
m
独特的颜色组合——使用该
x
您甚至可以制作超过
m
独特的颜色组合

有一个简单的O(n)解决方案,使用
(n choose(x+1))/(n choose x)==(n-x)/(x+1)
,可以通过按阶乘展开“choose”表达式,并将其取消

def x(m,n):
    n_choose_x = 1
    for x in xrange(1, n/2 + 1):
        n_choose_x = n_choose_x * (n+1-x) / x
        if n_choose_x >= m:
            return x
    return -1

print(x(70,8))
print(x(71,8))
print(x(57,8))
print(x(56,8))
print(x(55,8))
print("")
print(x(9999999, 47129212243960))
print(x(99999999471292122439609999999, 47129212243960))
print(x(99999999947129212243960999999471292122439609999999, 47129212243960))
这张照片是:

4
-1
4
3
3

1
3
4

如果你可以做一个阶乘的近似值(不需要精确的值),你可以使用。(n选择x)是0,1或者至少是n,所以如果n是47129212243960,那么你至少要设计47万亿张海报。你的问题中有错误吗,或者这只是一个理论难题?你应该使用整数除法。此外,数学模块中还有一个有效的阶乘函数。但是,直接计算(n choose r)序列比通过阶乘(每次使用
math.factorial
计算或使用存储在列表中的值)循环速度更快。此外,如果
ColorChoice
函数没有得到精确匹配,它将无法找到
i
。这就是你真正想要的吗?如果没有,请考虑将<<代码>=< /代码>改为<代码> > <代码>。有一些想法。感谢您提供简单的解决方案。n\u choose\u x>=m应该是n\u choose\u x==m。因为如果我们使用m=221和n=11的情况,那么n_choose_x>=m条件将不起作用@Amit m=221和n=12如此整洁-太棒了!