关于Eratosthenes筛子算法筛选小于n的素数的理解
今天在学习Java核心技术第九章集合框架中的BitSet时,遇到了这个算法。Eratosthenes筛子算法时一个查找素数的方法,这并不是查找素数的最好方法,但是测试编译程序性能的一种流行的基准。
一、BitSet位集
BitSet类用于存放一个位序列,它将位包装在字节里,比使用Boolean对象的ArrayList更加高效。
BitSet类的常用方法有
BitSet(int initialCapacity) 创建一个位集,规定了它的容量。 index从0开始,长度会随需要增加。
int length() 返回位集的而逻辑长度,即位集的最高设置位的索引 + 1.
boolean get(int bit) 获得一个位
void set(int bit) 设置一个位为true
void clear(int bit) 清除一个位为false
void and(BitSet set) 两个位集相“与”
void or(BitSet set) 两个位集“或”
void xorBitSet set) 两个位集“异或”
void andNot(BitSet set) 清除这个位集中对应另一个位集中设置的位
二、Eratosthenes筛子算法
本算法的思想如下
1,创建一个从2到n的连续数组
2,创建一个变量p等于2(第一个素数)
3,从p2开始,标记所有大于等于p2,让其中一个因子p自增,且乘积小于等于n的程式。例如p(p+1),p(p+2),……
4,找到大于p的第一个未被标记的数字,让p等于它,重复第三步。
下面我们用图片来更加具体的解释一下这个过程 (以下部分转自https://www.geeksforgeeks.org/sieve-of-eratosthenes/ 如有侵权,请联系我删除)
Let us take an example when n = 50. So we need to print all print numbers smaller than or equal to 50.
We create a list of all numbers from 2 to 50.
According to the algorithm we will mark all the numbers which are divisible by 2 and are greater than or equal to the square of it.
Now we move to our next unmarked number 3 and mark all the numbers which are multiples of 3 and are greater than or equal to the square of it.
We move to our next unmarked number 5 and mark all multiples of 5 and are greater than or equal to the square of it.
We continue this process and our final table will look like below:
So the prime numbers are the unmarked ones: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47.
Thanks to Krishan Kumar for providing above explanation.
三、代码实现
下面我们给出两种实现:第一种使用BitSet位集来标记筛选出去的数字索引
int n = 50; BitSet b = new BitSet(n + 1); int count = 0; int i; for (i = 2; i <= n; i++) { b.set(i); } i = 2; while (i * i <= n) { if (b.get(i)) { count++; System.out.println(i); int k = 2* i; while (k <= n) { b.clear(k); k += i; } } i++; } while (i <= n) { if (b.get(i)) { System.out.println(i); count++; } i++; }
第二种用布尔数组实现
void sieveOfEratosthenes(int n) { // Create a boolean array "prime[0..n]" and initialize // all entries it as true. A value in prime[i] will // finally be false if i is Not a prime, else true. boolean prime[] = new boolean[n+1]; for(int i=0;i<n;i++) prime[i] = true; for(int p = 2; p*p <=n; p++) { // If prime[p] is not changed, then it is a prime if(prime[p] == true) { // Update all multiples of p for(int i = p*p; i <= n; i += p) prime[i] = false; } } // Print all prime numbers for(int i = 2; i <= n; i++) { if(prime[i] == true) System.out.print(i + " "); } }
原文地址:https://www.cnblogs.com/Joey777210/p/11877865.html
- .NET魔法堂:工程构建基石->MSBuild
- 微信小程序能干哪些事,有什么优势?
- 如何告诉手机我是“我”呢?
- 没有任何类型 Windows 的外层实例可访问---Java内部类与外类型
- Hadoop(十二)MapReduce概述
- 安卓第一夜 第一个应用
- spring cloud 学习(1) - 基本的SOA示例
- SVN冲突
- 什么叫微信小程序分销系统?如何通过分销系统来实现你的创业梦
- Hadoop(十一)Hadoop IO之序列化与比较功能实现详解
- 安卓第五夜 维纳斯的诞生
- Eclipse中Project的Deployment Assembly(部署程序集)消失了
- spring-boot 速成(9) druid+mybatis 多数据源及读写分离的处理
- Python标准库14 数据库 (sqlite3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IDEA + Spring Boot 的三种热加载方案,看完弄懂,不用加班~
- 开篇讲--关于Kali的碎碎念
- Mysql服务器SQL模式 (官方精译)
- 如何用Prometheus和Grafana监控Kubernetes集群?
- linux实时文件事件监听--inotify
- MySQL事务原理&实战【官方精译】
- 俗话:MySQL索引
- 基于飞桨复现CVPR 2016 MCNN的过程解析:教你更精确估算人流密度
- mysql各种引擎对比、实战
- 接球小游戏玩腻了?换个姿势让PaddleX帮你吊打游戏系统
- mysql事务隔离级别详解和实战
- ELK+FileBeat+Kafka分布式系统搭建图文教程
- Flink CEP 原理和案例详解
- 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!
- 分布式计算框架Gearman原理详解