素数搜索算法的设计与分析
素数的搜索已经有很长的一段时间了,而且一直是一些数学家的目标。关于质数的定义和性质,我不是来讨论这个问题的。我相信每个人都知道它。寻找素数的方法很简单,根据素数的性质(素数不应该是除了1和它的其他数整除)我们可以从最小的质数2开始,直到它是小于1的数,与数整除通过它,如果它能整除它肯定是不是素数,这是一个单一的,素数判定方法(最简单的算法,复杂度最大的时间),我们也可以用这个方法来找到所有的素数的个数小于一个给定的整数,但我们会发现,使用这种单判断方法花费时间。例如,寻找素数不大于10,必须从2开始一个一个的来判断我们需要总共估计9个数字。事实上,根据我们后来提到的方法,我们只需要回收2次,因此,基于删除方法将进行以下两种方法。
让我们来看一下删除的概念。
1。将所有给定整数值小于整数的正整数添加到数组中。
2。删除可以由多个整数整除的数字;
3中留下的元素。数组是最终得到的素数序列。
对于第二步,我们将给出两种实现方法,让我们先看看算法。
算法1:
阶级的根本
{
public static int { } primelist;
public static void(int n)FindPrime
{
int { } IntList;
{ } IntList = new Int;
为(int p=2;p)
为(int p=2;p)
{
int = P + 1;
而(J
{
如果(((J-1 IntList { }!= 0)((IntList { J-1 } %)= = 0)){ } = 0 IntList J-1;
j = j + 1;
}
}
int = i 0;
为(int p=2;p)
{
如果(P-1 IntList { }!= 0)i = i + 1;
}
primelist =新的int {我};
我= 0;
为(int p=2;p)
{
如果(P-1 IntList { }!= 0)
{
我primelist { } = { } IntList P-1;
i = i + 1;
}
}
}
}
在该算法中,删除数是从2到n的平方根的整数个数。这种算法与单素数相比,搜索方法更好,它减少了一半以上的周期数,但该算法不是最理想的:
1。例如,6能被2整除,能被3整除,所以当p = 2, 6被删除一次;当p = 3, 6被删除一次,虽然我们设定算法根据规则,它不会导致冲突(通过判断数组中的元素IntList 0,如果0不会有重复,删除)而使算法的效率低。
2。除了素数序列中的元素个数外,我们还取一条曲线,在第一步中,我们首先计算数组元素的大小,然后只在第二步开始赋值。事实上,这两个步骤可以减少数组的大小,并且我们可以在前面完成它。
3、被删除的元素,也就是那些不是质数的元素,不需要把它们分为整数,例如,4不需要除以8,因为可以除以4的数可以整除2,这在前一个周期中已经被删除了。
基于以上考虑,我们得到了一个更有效的算法:
类primegood
{
public static int { } primelist;
public static void(int n)FindPrime
{
int { } IntList;
int = n-1;
{ } IntList = new Int;
为(int p=2;p)
为(int p=2;p)
{
如果(IntList { } = = 0 P-1)继续;
int = p;
而(J
{
如果(J-1 IntList { }!= 0)
{
{ 0 } = IntList J-1;
len-1 len =;
}
J=J+P;
}
}
primelist =新的int len } {;
int = i 0;
为(int p=2;p)
{
如果(P-1 IntList { }!= 0)
{
我primelist { } = { } IntList P-1;
i = i + 1;
}
}
}
}
该算法的思想与前面的算法完全相同,但它纠正了上述算法中一些不完善的内容。
为了说明这两种算法的效率差异,我们编写了主要程序来比较它们之间的差异。
静态空隙主()
{
console.writeline(开始!;
日期时间mytime5 = DateTime.Now;
(100000)primegood.findprime;
(int i = 0;i)
{
console.writeline(primegood。primelist {我});
}
日期时间mytime6 = DateTime.Now;
TimeSpan timeadd3 = mytime6-mytime5;
console.writeline(timeadd3。蜱);
日期时间mytime1 = DateTime.Now;
(100000)prime.findprime;
日期时间mytime2 = DateTime.Now;
TimeSpan timeadd = mytime2-mytime1;
日期时间mytime3 = DateTime.Now;
(100000)primegood.findprime;
日期时间mytime4 = DateTime.Now;
TimeSpan timeadd2 = mytime4-mytime3;
console.writeline(timeadd。蜱);
console.writeline(timeadd2。蜱);
}
}
通过运行该程序,可以发现他们的差异是如此之大,上述算法消耗时间是后者的算法几乎30-60倍。
事实上,该算法的时间复杂度是两个类似:*(N1.5)*(N);;因此,对于同样的问题,是实现各种不同的算法复杂度,算法设计是一个非常重要的知识。