我已将以下函数转换为PostgreSQL:
function probBlock(A,C){
var invB=1.0;
var C=Math.floor(C);
var count=0.0;
for (k=1;k<=C;k++){
count++;
invB=1.0+(count*invB)/A;
}
var blockProb=1.0/invB;
return blockProb
}
但是我需要在代码中经常调用此函数,我希望简化此类for循环函数以减少其时间复杂度。当我尝试以数学方式简化它时,我发现它可能需要包含Gamma函数。我不熟悉Gamma函数的编码方式,也不知道如何在PostgreSQL中实现它。
我知道invB
一词在故事的最后就等于1+(C-1)/A+(C-1)(C-2)/A^2+...+(C-1)!/A^(C-1))
,但我现在无法将其解决为简单的f(A,C)
。
那么有人可以帮助我将PostgreSQL的复杂度从O(n)
降低到O(1)
(如果无法达到O(1)
的话,可以尽量降低复杂度)
更多信息:
我主要在以下函数中调用上述函数:
function erlangbOfferedLoad(gos,c) {
var a=c;
var check=probBlock(a,c);
while (check>gos) {
a=a/2;
check=probBlock(a,c);
}
while (check<gos) {
a=a*2;
check=probBlock(a,c);
}
var fraction=1e-7;
var step=a;
var gosCalc=probBlock(a,c);
var diffError=gos-gosCalc;
if (diffError<0){
step=a/2;
a=a/2;
}
while (Math.abs(diffError)>(gos*fraction)){
step=step*0.75;
var prevA=a;
a=a+(step*(diffError>0))-(step*(diffError<0));
if (a<0){
a=prevA/2;
}
gosCalc=probBlock(a,c);
diffError=gos-gosCalc;
}
return a
}
我希望简化功能probBlock
的原因是,对于在PostgreSQL中erlangbOfferedLoad(gos,c)
上的单次运行,将花费我1分钟,这是完全不可接受的。