- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试实现 Bin Fu's approximate sum algorithm用真实的语言更好地了解它的工作原理。
In a nutshell ,这是一种算法,可以有效地计算 $(1+\epsilon)$-bounds 的值 $s(x)=\sum_{i=1}^n x_i$ 其中$x$ 是已排序 float 的 vector 。
但是,我一定做错了什么,因为运行算法会导致错误(我也不是很精通伪算法语言,并且数组绑定(bind)检查等一些东西似乎隐含在这段代码中)。
这是我到目前为止的非工作代码,欢迎任何有关该问题的提示/帮助——我是语言不可知论者,我只是使用 R,因为它是 1-index(算法是 1-索引)开源解释语言:
ApproxRegion<-function(x,n,b,delta){
if(x[n]<b) return(NULL)
if(x[n-1]<b) return(c(n,n))
if(x[1]>=b) reurn(c(1,n))
m1<-2
while(x[n-m1**2+1]>=b) m1<-m1**2
i<-1
m1<-m1
r1<-m1
while(m1>(1+delta)){
m1<-sqrt(m1)
if(x[n-floor(m1*r1)+1]>=b){
r1<-m1*r1
} else {
r1=r1
}
i=i+1
}
return(c(n-floor(r1*m1)+1,n))
}
ApproxSum<-function(x,n,epsilon){
if(x[n]==0) return(0)
delta<-3*epsilon/4
r1p<-n
s<-0
i<-1
b1<-x[n]/(1+delta)
while(b1>=((delta*x[n])/(3*n))){
Ri<-ApproxRegion(x=x,n=r1p,b=b1,delta=delta)
r1p<-Ri[1]-1
b1<-x[r1p]/(1+delta)
s1<-(Ri[2]-Ri[1]+1)*b1
s<-s+s1
i<-i+1
}
return(s)
}
n<-100;
x<-sort(runif(n));
ApproxSum(x=x,n=length(x),epsilon=1/10);
sum(x)
作者提到了一个c++版本,但我在网上找不到它(任何前面的帮助也很好)。
Modo:我把问题放在这里(而不是理论上的 CS stackexchange 站点)是因为它是关于实现问题的。随意移动。
原始代码有一个“毛茸茸”的退出条件(x[i]=$-\infty$ for $i\leq 0$)。按照 Martin Morgan 的建议,我用适当的中断替换了这种情况,产生了以下代码:
ApproxRegion<-function(x,b,delta,n){
if(n<=1) return(NULL)
if(x[n]<b) return(NULL)
if(x[n-1]<b) return(c(n,n))
if(x[1]>=b) return(c(1,n))
m<-2
xit<-0
while(!xit){
if(n-m**2+1<1) break
if(x[n-m**2+1]<b) break
m<-m**2
}
i<-1
r<-m
while(m>=(1+delta)){
m<-sqrt(m)
if(n-floor(m*r)+1>0){
if(x[n-floor(m*r)+1]>=b) r=m*r
}
i<-i+1
}
return(c(n-floor(m*r)+1,n))
}
ApproxSum<-function(x,n,epsilon){
if(x[n]==0) return(0)
delta=3*epsilon/4
rp<-n
s<-0
i<-1
b<-x[n]/(1+delta)
while(b>=delta*x[n]/(3*n)){
R<-ApproxRegion(x,b,delta,rp)
if(is.null(R)) break
if(R[1]<=1) break
rp<-R[1]-1
b<-x[rp]/(1+delta)
si<-(R[2]-R[1]+1)*b
s<-s+si
i<-i+1
}
return(s)
}
现在,它起作用了:
n<-100;
set.seed(123)
x<-sort(runif(n));
ApproxSum(x=x,n=length(x),epsilon=1/10);
sum(x)
最佳答案
作为部分答案...算法未明确处理边缘条件。例如在 ApproxRegion
需要注意 n = 0(返回值应该为 NULL?)或 1(c(n,n)?)否则第一个或第二个条件 x[n] < b
, x[n - 1] < b
不会按预期进行评估(例如,x[0] 返回 numeric(0))。同样,循环中的测试必须防范 m1**2 > n + 1
, 否则你将下标为负数。
我认为ApproxSum
中也有类似的问题,特别是当ApproxRegion
返回,例如 c(1, 1)
(因此 r1p == 0,b1 = integer())。看到更新的实现会很有趣。
关于c++ - 实现 Bin Fu 的近似求和算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127706/
所以我必须用以下方法来近似 Pi:4*(1-1/3+1/5-1/7+1/9-...)。它也应该基于迭代次数。所以函数应该是这样的: >>> piApprox(1) 4.0 >>> piApprox(1
输入:图 G 输出:多个独立集,使得一个节点对所有独立集的成员资格是唯一的。因此,节点与它自己的集合中的任何节点都没有连接。这是一个示例路径。 由于这里需要澄清,因此再次改写: 将给定的图划分为多个集
我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的准确度不太满意。输入格式为 s0.31,输出格式为 s15.16。 我在这里发布这个问题,以便
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
我的目标是近似二项式变量总和的分布。我使用以下纸张The Distribution of a Sum of Binomial Random Variables作者:肯·巴特勒和迈克尔·斯蒂芬斯。 我想
我知道有方法 approximate cubic Bezier curves ( this page 也是一个很好的引用),但是有没有更快的方法来逼近 N 次贝塞尔曲线?还是只能使用下面的概括? 来自
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它有助于我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注意
我是 C++ 和编码本身的初学者,所以请原谅任何词汇错误。我找不到这个具体问题,但在互联网上找到了类似的问题,但我仍然很难获得我需要的结果。 所以我使用莱布尼茨公式来近似 pi,即: pi = 4 ·
有多种方法可以通过显示名称查找联系人。例如这个答案Android - Find a contact by display name 但是我需要找到模糊匹配的联系人。例如如果找不到“Kim”,我需要返回
我一直在尝试使用以下代码使用级数表示来近似 e 以获得尽可能多的精度数字,但无论我计算多少项,精度数字的数量似乎都保持不变。即: 2.718281984329223632812500000000000
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
我做了很多随机的数学程序来帮助我完成作业(合成除法是最有趣的),现在我想反转一个激进的表达式。 例如,在我方便的 TI 计算器中我得到 .2360679775 好吧,我想将该数字转换为等效的无理数表达
我可以通过 CPU 分析器看到,compute_variances() 是我项目的瓶颈。 % cumulative self self total
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的可扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它
这是迄今为止我的代码, from math import * def main(): sides = eval(input("Enter the number of sides:"))
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它,
我是一名优秀的程序员,十分优秀!