首页 > 解决方案 > 简化 SQL 中的 for 循环函数

问题描述

我已将以下函数翻译成 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)

那么任何人都可以帮助我将复杂性从 降低O(n)O(1)尽可能(或尽可能降低,如果不可能达到O(1))以应用于 PostgreSQL 吗?

更多信息:

我主要在下面这个函数中调用上面的函数:

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中单次run onerlangbOfferedLoad(gos,c)需要1分钟,这是完全不能接受的。

标签: postgresqlmath

解决方案


推荐阅读