首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何用算法高效寻找素数

预计阅读时间:5 分钟 素数定义很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数定义简单,恐怕没多少人真的能把素数相关算法写得高效。...首先你用 isPrime 函数来辅助思路就不够高效;而且就算你要用 isPrime 函数,这样实现也是存在计算冗余。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数算法高效实现了...其最终结果是 O(N * loglogN),有兴趣读者可以查一下该算法时间复杂度证明。 以上就是素数算法相关全部内容。怎么样,是不是看似简单问题却有不少细节可以打磨呀? 反向思考方能出其不意!

1.9K40

算法专题:如何用算法高效寻找素数

不要觉得素数定义简单,恐怕没多少人真的能把素数相关算法写得高效。...首先你用isPrime函数来辅助思路就不够高效;而且就算你要用isPrime函数,这样实现也是存在计算冗余。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数算法高效实现了...其最终结果是 O(N * loglogN),有兴趣读者可以查一下该算法时间复杂度证明。 以上就是素数算法相关全部内容。怎么样,是不是看似简单问题却有不少细节可以打磨呀?

66820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    素数推断算法(高效率)

    大家好,又见面了,我是全栈君 chuanbindeng 素数推断算法 关于素数算法是信息学竞赛和程序设计竞赛中常考数论知识,在这里我跟大家讲一下寻找一定范围内素数几个算法。...} 这就是最一般求解n以内素数算法。复杂度是o(n*sqrt(n)),假设n非常小的话,这样算法(事实上这是不是算法我都怀疑,没有水平。...在程序设计竞赛中就必需要设计出一种更好算法要求能在几秒钟甚至一秒钟之内找出n以内全部素数。于是就有了素数筛法。 (我表达得不清楚的话不要骂我,见到我时候扁我一顿我不说一句话。。。)...相比于一般筛法,增加这两个优化后筛法要高效非常多。高兴去同学能够试着自己编敲代码看一看效率。我这里 有程序,须要能够向我要。不懂得也能够问我。...这上面的全部素数筛选算法都能够再进一步化为二次筛选法,就是欲求n以内素数,就先把sqrt(n)内素数求 出来,用已经求得素数来筛出后面的合数。

    32310

    高效判断素数方法

    孪生素数: 所谓孪生素数指的是间隔为 2 相邻素数,它们之间距离已经近得不能再近了。 若n≥6且n-1和n+1为孪生素数,那么n一定是6倍数。...证明: ∵ n-1和n+1是素数 ┈┈┈┈┈ ① ∴ n-1和n+1是奇数 ∴ n是偶数,即n是2倍数 ┈┈┈┈┈ ② 假设n不是3倍数,得: n=3x+1 或 n=3x+2, 如果n=3x+1,则...由上面的规律可以推出下面结论: 若x≧1且n=6x-1或n=6x+1不是素数,那么n一定不是2和3倍数。...∴n一定不是2和3倍数。 素数出现规律: 当n≧5时,如果n为素数,那么n mod 6 = 1 或 n mod 6 = 5,即n一定出现在6x(x≥1)两侧。...3(2x+1),2(3x+2),它们一定不是素数,所以素数一定出现在6x两侧。

    1.1K40

    素数筛选算法

    灵机一闪,思绪回到了大二算法课上,老师讲过一种叫做“筛法”东东,不过好像记不太清了,我再想想… 半分钟后… 回来了,我感到它们全都回来了!...嗯…毫不留情,莫非还有更优算法? “您容我再想想哈~”,陪着笑脸说完,双手抱头痛苦思考状/(ㄒoㄒ)/~~ 我神呐…还有啥,还能怎么筛?...咋一看,算法阐述起来和普通筛法并无二致,实际上,两者最重要区别就在于: 有无重复筛除? 为什么有这个问题呢?...)证明这个算法时间复杂度和正确性,要从以下两个方面: 每个数至少被访问一次 对于质数,一定会在 $i$ 循环中访问到,并确定为质数。...因此整个算法复杂度是 $O(n)$ 。 面试结果 ---- hmmmmmmmm… 当然,很愉快,即使是在面试官迟到了1小时情况下,TT还是很给面子,没让我过,我记住了,哼!

    1K20

    五分钟小知识:如何用算法高效寻找素数

    不要觉得素数定义简单,恐怕没多少人真的能把素数相关算法写得高效。...首先你用 isPrime 函数来辅助思路就不够高效;而且就算你要用 isPrime 函数,这样实现也是存在计算冗余。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。...高效实现 countPrimes 高效解决这个问题核心思路是和上面的常规思路反着来: 首先从 2 开始,我们知道 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…...我们可以稍微优化一下,让j从i平方开始遍历,而不是从2 * i开始: for (int j = i * i; j < n; j += i) isPrim[j] = false; 这样,素数计数算法高效实现了...其最终结果是 O(N * loglogN),有兴趣读者可以查一下该算法时间复杂度证明。 以上就是素数算法相关全部内容。怎么样,是不是看似简单问题却有不少细节可以打磨呀? ?

    44620

    漫画:高效布隆算法

    x星球经过和y星球激战后,x星球已经无法居住,重建需要很长时间,因此迁移到why星球上。 ? ? ps: 假设每个人ip代表不同用户。 ?...每段均为最大值ip为255.255.255.255,8位正好可以表示一个255大小数字,因此每8位表示一个数字,ip一共是4段,正好32位。 ?...ps:f1,f2,f3代表3个不同hash函数。箭头指向地方代表通过hash函数计算出hash值同时也是在位图中位置。 ? ? ? ? ? ?...ps:另外一般情况下不能从布隆过滤器中删除元素,由于有一些字符串计算hash值可能会相同,此时我们会想到,把每个位置存上对应次数,删除元素时候同时减1,前面我们说过会有误判情况,所以要安全删掉元素不是这么简单...end:本文主要讲解布隆过滤器算法思想,具体实现我们可以去看guava中BloomFIlter。 文章转载自公众号 JAVA小咖秀 , 作者 小小小咖

    43620

    漫画:高效布隆算法

    转自:JAVA小咖秀 作者:小小小咖 x星球经过和y星球激战后,x星球已经无法居住,重建需要很长时间,因此迁移到why星球上。 ? ? ps: 假设每个人ip代表不同用户。 ?...每段均为最大值ip为255.255.255.255,8位正好可以表示一个255大小数字,因此每8位表示一个数字,ip一共是4段,正好32位。 ?...ps:f1,f2,f3代表3个不同hash函数。箭头指向地方代表通过hash函数计算出hash值同时也是在位图中位置。 ? ? ? ? ? ?...ps:另外一般情况下不能从布隆过滤器中删除元素,由于有一些字符串计算hash值可能会相同,此时我们会想到,把每个位置存上对应次数,删除元素时候同时减1,前面我们说过会有误判情况,所以要安全删掉元素不是这么简单...end:本文主要讲解布隆过滤器算法思想,具体实现我们可以去看guava中BloomFIlter。

    45040

    Knuth高效洗牌算法

    仔细分析发现,这个算法非常精巧,每次遍历都是将当前数i和已经在数组中随机一个数m[j]进行交换,最终达到了公平随机整个数组作用。虽然只有短短3行代码,却让人有种震撼感觉。...顿时觉得golang很NB,确实很高效。...网上搜索了一下高效洗牌算法,又发现python里面也有这样函数,这样写: for(int i = N - 1; i >= 0 ; i -- ) swap(arr[i], arr[rand(0..., i)]) // rand(0, i) 生成 [0, i] 之间随机整数 而这个算法出处竟然来自于TAOCP!...算法就是大名鼎鼎 Knuth-Shuffle,即 Knuth 洗牌算法。 看似简单问题,竟然又扯出Knuth,大意了。 能把一件小事情做到极致的人,可以称之为艺术家。Knuth名副其实。

    72420

    Slope one:简单高效推荐算法

    一般协同过滤算法,首先是收集用户对事物(产品)评分情况,一种直接对某本书,或者某个歌曲打分,另种是隐性打分,比如商务系统中,购买了表示打2分,浏览了打1分,其他0分。...最近邻集运算相对来说成本比较高,尤其是大量数据时候,今天和大家分享是一种简单高效协同过滤算法:Slope one 基本原理 用户 对事物A打分 对事物B打分 X 3 4 Y 2 4 Z 4 ?...同样,Slope one算法也认为:平均值也可以代替某两个未知个体之间打分差异,事物A对事物B平均很差是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是说人们对事物B打分一般比事物...A打分要高1.5,于是Slope one算法就猜测Z对事物B打分是4 + 1.5 = 5.5 是不是非常简单?...过几天会有一篇我算法详细介绍,盼诸位批评指正,共同学习,共同进步。

    1.1K60
    领券