我有一个长度未知的正整数向量。我们用元素a [1],a [2],...
称它为矢量a我想对向量b执行计算,其中对于所有i,0< = b [i]< = a [i]。
以下不起作用:
for(b in 0:a)
{
# calculations
}
我想出的最好的是:
probabilities <- function(a,p)
{
k <- a
k[1] <- 1
h <- rep(0,sum(a)+1)
for(i in 2:length(a))
{
k[i] <- k[i-1]*(a[i-1]+1)
}
for(i in 0:prod(a+1))
{
b <- a
for(j in 1:length(a))
{
b[j] <- (floor(i/k[j]) %% (a[j]+1))
}
t <- 1
for(j in 1:length(a))
{
t <- t * choose(a[j],b[j])*(p[j])^(b[j])*(1-p[j])^(a[j]-b[j])
}
h[sum(b)+1] <- h[sum(b)+1] + t
}
return(h)
}
在我的功能中间是我创建b的地方。我首先将b设置为等于a(因此它的大小相同)。然后,我用不同的元素替换b的所有元素,这些元素非常难以计算。这似乎是一种效率低下的解决方案。它有效,但随着数字变大,速度相当慢。关于如何减少处理时间的任何想法?从本质上讲,这对b的作用是第一次通过,b全部为零。然后,它是1,0,0,0,......第一个元素继续递增,直到达到[1],然后b [2]递增,b [1]设置为0.然后b [1]启动再次递增。
我知道数学是合理的,我只是不相信它是有效的。我研究组合学已有几年了,但从未研究过计算复杂性理论,因此提出一种快速算法有点超出了我的知识范畴。任何想法都会有所帮助!