Java 为什么相乘的速度比平方根快很多倍?
我有几个问题用下面的算法来判断一个数是否是素数,我也知道用了可以得到更快的响应Java 为什么相乘的速度比平方根快很多倍?,java,algorithm,numbers,primes,sqrt,Java,Algorithm,Numbers,Primes,Sqrt,我有几个问题用下面的算法来判断一个数是否是素数,我也知道用了可以得到更快的响应 为什么计算i*sqrt(n)次更快。比sqrt(n)仅仅一次 为什么Math.sqrt()比我的sqrt()方法快 这些算法的复杂度是多少O(n),O(sqrt(n)),O(nlog(n)) 公共类主{ 公共静态void main(字符串[]args){ //案例1比较算法 long startTime=System.currentTimeMillis();//开始时间 对于(int i=2;i而言,对一个数字进行平
i*sqrt(n)
次更快。比sqrt(n)
仅仅一次Math.sqrt()
比我的sqrt()
方法快公共类主{
公共静态void main(字符串[]args){
//案例1比较算法
long startTime=System.currentTimeMillis();//开始时间
对于(int i=2;i而言,对一个数字进行平方运算实际上是一个整数运算,而sqrt是浮点运算。识别用于强制转换和计算的运行时分配您所观察到的结果并不令人惊讶
sqrt上的维基百科页面有一个关于计算的不错的部分
至于更快的方法,我相信您可以研究(次)线性运行时操作n^2
关于运行时,您可能会喜欢我编写的这段代码,它演示了在迭代过程中对函数进行的系统调用的数量,您可能会发现它,或者在java中类似的东西,在您思考这类东西时非常有用。gist.github.com/Krewn/1ea0c788ac7210efc475
编辑:这里是整数sqrt.运行时的一个很好的解释
编辑:在64 nm core2至--
如果可能,请在您的帖子中包含输出内容
与你的问题相关尽管以不同的方式接近素数
def getPrimes(n):
primes = [2]
# instantiates our list to a list of one element, 2
k = 3
while(len(primes) < n):
# python uses the prefix function len(var) for lists dictionaries and strings
k2 = 0
isprime=True
#Vacuously true assumption that every number is prime unless
while(primes[k2]**2<=k): # <> this is where you are substituting sqrt with sq <> #
if(k%primes[k2]==0):
isprime=False
break
k2+=1
if(isprime):primes.append(k)
k+=2
return(primes)
print (getPrimes(30))
def getPrimes(n):
素数=[2]
#将我们的列表实例化为一个元素的列表,2
k=3
而(len(primes) while(primes[k2]**21.为什么计算i*i,sqrt(n)次比只计算一次sqrt(n)更快?
看看下面的复杂性。计算平方根的额外成本
2.为什么Math.sqrt()比我的sqrt()方法快?
sqrt()委托调用StrictMath.sqrt,该调用在硬件或本机代码中完成
3.这些算法的复杂度是多少?
您描述的每个函数的复杂性
i=2..i*i1.显然不是真的,因为您声称在这两种情况下都计算sqrt(n)。这是一个微基准标记的示例;我看不到预热期,您是如何计算JIT的?2)因为Math.sqrt
通常会委托给一个硬件操作,该操作的速度比您可能编写的任何代码都要快。请注意,sqrt是大多数IEEE浮点硬件实现的内置函数。而sqrt的复杂度充其量相当于除法,本质上是复杂度的2-4倍关于乘法。
def getPrimes(n):
primes = [2]
# instantiates our list to a list of one element, 2
k = 3
while(len(primes) < n):
# python uses the prefix function len(var) for lists dictionaries and strings
k2 = 0
isprime=True
#Vacuously true assumption that every number is prime unless
while(primes[k2]**2<=k): # <> this is where you are substituting sqrt with sq <> #
if(k%primes[k2]==0):
isprime=False
break
k2+=1
if(isprime):primes.append(k)
k+=2
return(primes)
print (getPrimes(30))