postgresql - 简化 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分钟,这是完全不能接受的。
解决方案
推荐阅读
- reactjs - 为什么使用 create-react-app 时表单不提交?
- python - 烧瓶猜谜游戏没有正确响应
- python - 在 Django ORM 查询中转换日期时间对象
- mysql - 在 MySQLi 表中选择名称
- visual-studio-code - 在 VS Code 中,有没有办法以编程方式在 package.json 中设置语言的 filenamePatterns
- css - 在 CSS 动画期间让元素出现在与另一个相同的位置
- php - 如何在重置密码系统中更新用户 new_password?
- bash - bash:全局否定和多种模式的问题
- r - geom_col 值乱序
- apache - 为生产构建 Cordova 浏览器