- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
网上有很多问题需要你找质数,所以我决定写一组函数来找它们。我使用 Eratosthenes 筛法 生成素数,因为与其他算法相比,它快速且易于实现。但是,我想知道是不是我的代码而不是我的方法 效率低下。我使用的是 STL 容器/迭代器吗?我的代码中是否有任何部分减慢了程序速度?
换句话说,它确实计算出了正确的结果,但我想知道是否可以通过一些算法改进而不是仅仅通过一些代码调整来提高它的效率。
非常感谢任何帮助。
这是我的代码(如果难以阅读,我深表歉意)
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define initial_prime_barrier 100
bool isFlagged(int i) { return i == 0; }
bool isNextStart(int i) { return i != 0; }
vector<int> generatePrimesBelow(int limit)
{
vector<int> primes;
for (int i = 2; i < limit; i++)
{
primes.push_back(i);
}
vector<int>::iterator currentStart = primes.begin();
do
{
int numberAtStart = *currentStart;
vector<int>::iterator currentNumber = currentStart + numberAtStart;
do
{
*currentNumber = 0;
advance(currentNumber, numberAtStart);
} while (currentNumber < primes.end());
currentStart = find_if(currentStart + 1, primes.end(), isNextStart);
} while ((*currentStart) * (*currentStart) < limit);
vector<int>::iterator newEnd = remove_if(primes.begin(), primes.end(), isFlagged);
primes.erase(newEnd, primes.end());
return primes;
}
bool isPrime(int number)
{
static vector<int> primes = generatePrimesBelow(initial_prime_barrier);
static int numPrimes = primes.size();
static int largestPrime = primes[numPrimes-1];
static int halfwayPrime = primes[numPrimes/2];
if (number == largestPrime)
{
return true;
}
else if (number < largestPrime)
{
if (number == halfwayPrime)
{
return true;
}
else if (number > halfwayPrime)
{
for (int i = numPrimes/2; i < numPrimes; i++)
{
if (number == primes[i])
{
return true;
}
}
}
else if (number < halfwayPrime)
{
for (int i = numPrimes/2; i >= 0; i--)
{
if (number == primes[i])
{
return true;
}
}
}
}
else if (number > largestPrime)
{
primes = generatePrimesBelow(number + number);
numPrimes = primes.size();
largestPrime = primes[numPrimes-1];
halfwayPrime = primes[numPrimes/2];
return isPrime(number);
}
return false;
}
int main (int argc, char * const argv[])
{
const int number = 123123;
cout << (isPrime(number) ? "YES" : "NO") << endl;
}
最佳答案
是的,这是你的方法。几件事。您不需要数组来保存数字,数组中每个条目的地址就是数字本身。您只需要它们包含两个值 - true
和 false
.所以让你的数组 vector<bool>
,它会更紧凑。然后,在你的内部循环中,你从 x+x
开始并按 x
的步骤推进.你应该从x*x
开始, 并按 2*x
步进- 这将适用于所有 x
除了 2
.做一个特例,或者在初始化循环中标记这些偶数。或在 i
处理条目表示数字 2*i+1
并完全免除处理偶数。这应该会加快您的筛选代码。最后,你不需要特殊的 find_if
调用它的所有机制,你可以只检查循环中出现的当前条目。
(编辑:)在你的isPrime
您手动执行二进制搜索,但 STL 中已经有一个 binary_search 算法。如果你保留你的 vector<bool>
,你根本不需要它按原样筛选阵列,不压缩。然后 isPrime(i)
只需要检查数组的值是否位于索引 i
处还是true
.
(edit2:) 现在,关于效率。您重新计算了 n+n
,可能是为了测试更多的数字。如果你只测试几个,简单的试分赔率会更快。如果要测试的数字都在一个狭窄的上部区域,您最好的选择是偏置筛,下部筛到sqrt
。测试区域的上限。如果数字分布广泛,则可以使用您当前的整个数组方法。
此处要使用的关键事实是大约有 n ~= m/log m
m
以下的素数在值(value)上,即从 0
中筛选一个数组至 m
需要 O(m*log (log m))
时间,然后筛选 a
之间的上部区域和 b
,即宽度 d=b-a
, 通过以下所有素数 r=sqrt b
,它需要的时间与 d*log (log r)
成正比.
另外,当增加你的筛阵列时最好扩大,而不是重新计算整个。质数都在那里。要筛选附件,需要遍历筛选数组中的所有素数,直到 sqrt
。其新的上边缘。这让人想起分段筛子,尽管每个新分段都取代了前一个分段,或者在任何情况下都与前一个分段分开。
关于c++ - isPrime 函数的改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406755/
请问我的代码中可能存在什么错误,为什么它打印数字而不是仅打印小于 10,000 的质数? public class Isprime { public static void main(Stri
网上有很多问题需要你找质数,所以我决定写一组函数来找它们。我使用 Eratosthenes 筛法 生成素数,因为与其他算法相比,它快速且易于实现。但是,我想知道是不是我的代码而不是我的方法 效率低下。
我构造了两个函数。第一个(不重要但相关,因为它在第二个中被调用)告诉一个数字是否是素数: def is_prime(i): if i == 1: print("prime")
这是一个程序,用于确定 10 个数字的数组中的元素是否为素数。打印时,主要的将被替换为-1,其他保持不变。 这对我来说似乎很好,但是当我用 9 运行代码时,有些会得到 -1,这意味着 9 是素数(错误
('1' * N) !~ /^1?$|^(11+?)\1+$/ 在网上,我找到了一段适用于 N >= 0 的 Ruby 代码,用于确定 N 是否为素数。据我所知,它看起来像是在玩正则表达式,但我不知道
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我大约一个月前开始学习 Java,今天我看到了一道我无法解决的问题。 问题是: Write a method named isPrime, which takes an integer as an a
我是 LISP 的新手,正在解决一些初学者问题。我尝试定义一个 ISPRIME 函数,但它似乎无法正常工作。这是我的代码: (defun ISPRIME (n &optional (d (- n 1
我在下面有一个 isPrime 函数: public static boolean isPrime(int n) { if(n == 1) return false; for(int
这是我的 isPrime 方法: private static boolean isPrime(int num) { if (num % 2 == 0) return false; f
我正在阅读 http://www2.informatik.hu-berlin.de/~weber/slipOff/hashmap_c.html并且很难理解这个函数是如何工作的: static unsi
我正在尝试创建一个基本函数来测试 Haskell 中整数的素数。我的代码可以在特定意义上工作,但是当我尝试将它传递给函数时继续收到错误消息。请注意,我使用 :{ 直接在 GHCi 中编写定义。和 :}
我正在尝试获取一个函数来确定 N 是否为质数。我是 Python 的新手,我知道这可能不是解决这个问题的最有效方法,但这是我的尝试 def is_prime(N): k = []
我正在做一个练习,它要求我使用尾递归在 scala 中实现 isPrime。我确实有一个实现,但是我在生成正确的基本案例时遇到了问题。 所以我的算法涉及检查从 2 到 N/2 的所有数字,因为 N/2
所以我能够在互联网的一点帮助下解决这个问题,这就是我得到的: def isPrime(n): for i in range(2,int(n**0.5)+1): if n%i==
所以,我开始学习编程并尝试使用 java 进行 euler 项目。问题 10 看起来非常简单,我想我可以使用我之前在另一个问题中用来获取素数的方法。问题是,该方法有效,除非我将其放入 for 循环中,
我有一个函数可以测试这个数字是否是质数。 public static boolean isPrime(int number) { if (number == 2) { retu
考虑以下方法: public static boolean isPrime(int n) { return ! (new String(new char[n])).matches(".?|(.
我有一个名为“prime.c”的程序,如下: #include "stdio.h" #include "stdlib.h" #include int isPrime(int number); voi
自然地,对于 bool isprime(number) 会有一个我可以查询的数据结构。 我定义最佳算法,即生成在 (1, N] 范围内内存消耗最低的数据结构的算法,其中 N 是一个常数。 只是我正在寻
我是一名优秀的程序员,十分优秀!