当前位置: 首页 > 面试题库 >

为什么相乘比平方根快很多倍?

翁烨霖
2023-03-14
问题内容

我对以下算法有一些疑问,可以判断数字是否为质数,我也知道使用Eratosthenes筛子可以更快地响应。

  1. 为什么计算速度更快i i * sqrt (n)。比sqrt (n)只有一次?
  2. 为什么Math.sqrt()比我的sqrt()方法快?
  3. 这些算法O(n),O(sqrt(n)),O(n log(n))的复杂度是多少?
        public class Main {

    public static void main(String[] args) {

    // Case 1 comparing Algorithms
    long startTime = System.currentTimeMillis(); // Start Time
    for (int i = 2; i <= 100000; ++i) {
        if (isPrime1(i))
            continue;
    }
    long stopTime = System.currentTimeMillis(); // End Time
    System.out.printf("Duracion: %4d ms. while (i*i <= N) Algorithm\n",
            stopTime - startTime);

    // Case 2 comparing Algorithms
    startTime = System.currentTimeMillis();
    for (int i = 2; i <= 100000; ++i) {
        if (isPrime2(i))
            continue;
    }
    stopTime = System.currentTimeMillis();
    System.out.printf("Duracion: %4d ms. while (i <= sqrt(N)) Algorithm\n",
            stopTime - startTime);

    // Case 3 comparing Algorithms
    startTime = System.currentTimeMillis();
    for (int i = 2; i <= 100000; ++i) {
        if (isPrime3(i))
            continue;
    }
    stopTime = System.currentTimeMillis();
    System.out.printf(
              "Duracion: %4d ms. s = sqrt(N) while (i <= s) Algorithm\n",
              stopTime - startTime);

    // Case 4 comparing Algorithms
    startTime = System.currentTimeMillis();
    for (int i = 2; i <= 100000; ++i) {
        if (isPrime4(i))
            continue;
    }
    stopTime = System.currentTimeMillis();
    System.out.printf(
              "Duracion: %4d ms. s = Math.sqrt(N) while (i <= s) Algorithm\n",
              stopTime - startTime);
    }

    public static boolean isPrime1(int n) {
        for (long i = 2; i * i <= n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    public static boolean isPrime2(int n) {
        for (long i = 2; i <= sqrt(n); i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    public static boolean isPrime3(int n) {
        double s = sqrt(n);
        for (long i = 2; i <= s; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    public static boolean isPrime4(int n) {
        // Proving wich if faster between my sqrt method or Java's sqrt
        double s = Math.sqrt(n);
        for (long i = 2; i <= s; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }

    public static double abs(double n) {
        return n < 0 ? -n : n;
    }

    public static double sqrt(double n) {
        // Newton's method, from book Algorithms 4th edition by Robert Sedgwick
        // and Kevin Wayne
        if (n < 0)
            return Double.NaN;

        double err = 1e-15;
        double p = n;

        while (abs(p - n / p) > err * n)
            p = (p + n / p) / 2.0;

        return p;
    }
    }

这也是我的代码的链接:http :
//ideone.com/Fapj1P


问题答案:

1. Why is faster to compute i*i, sqrt (n) times. than sqrt (n) just one time ? 查看下面的复杂性。计算平方根的额外费用。

2. Why Math.sqrt() is faster than my sqrt() method ?
Math.sqrt()委托对StrictMath.sqrt的调用以硬件或本机代码完成。

3. What is the complexity of these algorithms?
您描述的每个功能的复杂性

i=2 .. i*i<n O(平方(n))

i=2 .. sqrt(n) O(sqrt(n)* log(n))

i=2 .. sqrt (by Newton's method) O(sqrt(n))+ O(log(n))

i=2 .. sqrt (by Math.sqrt) O(平方(n))

牛顿方法的复杂性,来自
http://en.citizendium.org/wiki/Newton%27s_method#Computational_complexity



 类似资料:
  • 我在练习leetcode第5题。真正让我困惑的是这里C++(20ms)和Python(1000ms)之间巨大的运行时差异。 我知道Python是一种解释性语言,所以一般来说它比C++慢。但是在这里,C++比Python快50倍是我无法理解的。两个程序都使用相同的算法,所以并非如此。是因为C++和Python中字符串的实现方式吗? C++ Python

  • 问题内容: 一些用户建议使用numpy的以下方法,以及我认为是正确的方法: 我也发现具有相同的性能。无论如何,另一个答案建议使用列表理解的解决方案: 但是在基准测试之后,我发现列表理解比numpy快得多: 结果: 如您所见,numpy大约快5倍。但最令人惊讶的是,它无需使用转置就可以更快地运行,并且适用于以下代码: 列表理解仍然快了5倍。因此,除了这一点之外,这里的列表理解是在C语言中执行的,我们

  • 我试图对快速平方根逆进行基准测试。完整代码如下: 如果你想自己运行,这是quick bench中的代码。 使用GCC 11.2和-O3编译时,BM\u FastInverseSqrRoot的速度大约是Noop的31倍(当我在我的机器上本地运行它时,速度大约为10 ns)。使用Clang 13.0和-O3编译,速度大约是Noop的3.6倍(当我在我的机器上本地运行它时,速度大约为1ns)。这是10倍

  • 问题内容: 这个问题已经在这里有了答案 : Python 3枚举比Python 2慢是有原因的吗? (2个答案) 5年前关闭。 我一直在试图理解为什么在某些情况下Python 3与Python 2相比实际上要花费很多时间,以下是我从python 3.4到python 2.7进行验证的几种情况。 注意:我已经经历了一些问题,例如,为什么Python3中没有xrange函数? 与 python2相比,

  • 本文向大家介绍为什么Nginx的性能要比Apache高很多,包括了为什么Nginx的性能要比Apache高很多的使用技巧和注意事项,需要的朋友参考一下 为什么Nginx的性能要比Apache高很多? 这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。 目前Linux下能够承受高并发访问的

  • C++:15秒(源) Python:6分13秒(来源) C++:45分钟(源) 蟒蛇:10小时后被杀死(来源) 为什么Strassen矩阵乘法比标准矩阵乘法慢得多? null null null