如何解决有什么建议可以改进和绕过这个主要查找器功能的超时错误测试吗?
我应该创建一个函数来为给定的数字找到最接近的下一个素数,我的意思是即使算法写得很糟糕而且很慢(可能是最慢的),但它完成了任务,问题是程序应该评估我的东西,并以超时错误拒绝它,他一次给了它一堆数字,他希望它们在 10 秒内全部解决,所以问题是你可以建议有什么改进可以快速转发我可怜的折磨? (不允许使用for
)
int is_prime(int nb)
{
int i;
/* if negative terminate */
if (nb <= 1)
return (0);
/* start from first prime */
i = 2;
/* primes equals zero only when divisible by 1 and theme-selves */
while (nb % i != 0)
i++;
/* if i divides nb,we see if i is the nb we looking for */
if (i == nb)
return (1);
else
return (0);
}
int find_next_prime(int nb)
{
int i;
i = 0;
/*keep looking for primes one by one */
while (!is_prime(nb + i))
i++;
return (nb + i);
}
解决方法
最好的简单速度改进是检查最多 n
的平方根的除数,而不是最多 n
的所有除数。这需要算法从 O(nb) 到 O(sqrt(nb))。
考虑is_prime(2147483647)
。 OP 的方法需要大约 2147483647 次迭代。测试大约平方根 46341 的速度大约快 46,000 倍。
// while (nb % i != 0) i++;
// if (i == nb) return (1);
// else return (0);
// While the divisor <= quotient (or until the square root is reached)
while (i <= nb/i) {
if (nb%i == 0) return 1;
i++;
}
return 0;
避免 i*i <= nb
测试,因为 i*i
可能会溢出。
避免 sqrt(nb)
,因为它涉及大量浮点/int
问题。
注意:好的编译器会看到附近的 nb/i; nb%i
并以一个的时间成本计算它们。
许多其他改进都是可能的,但希望专注于一个具有重大影响的简单改进。当想要提高速度时,专注于降低复杂性 O() 的顺序而不是线性改进。 Is premature optimization really the root of all evil?
,您错过了两个最常见的提高速度的技巧。
- 你只需要检查数字的平方根
- 检查 2 后,您只需检查从 3 开始的每隔一个数字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。