简化SQL中的循环功能

时间:2018-06-21 03:34:39

标签: 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 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分钟,这是完全不可接受的。

0 个答案:

没有答案