Postgresql 简化SQL中的for循环函数
我已将以下函数翻译成PostgreSQL:Postgresql 简化SQL中的for循环函数,postgresql,math,Postgresql,Math,我已将以下函数翻译成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 blockPro
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
}
我希望简化函数
probBlock
的原因是,在PostgreSQL中的ErlangOfferedLoad(gos,c)
上运行一次,需要1分钟,这是完全不可接受的 我不认为可以将复杂度降低到O(1),但如果用C编写SQL函数,速度会快几个数量级。@LaurenzAlbe因为输入A和C都是标量,我只希望将多项式组合成一个或两个元素(可能像几何序列?),这样复杂度可以非常接近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
}