BitSet适用于一类型boolean判断,Java的BitSet在这类型判断中非常高效。

举例说明:在判断前2000万数字中素数个数的程序中,如果使用最基本的素数判断代码:

package com;

public class Sus {

	public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 20000000;
long start = System.currentTimeMillis();
int count = 0;
boolean is = false;
for(int i = 2;i <= n;i++){
for(int j = 2; j <= Math.sqrt(i);j++){
if( i % j == 0){
is = true;
break;
}
}
if(!is){
count++;
}
is = false;
}
long end = System.currentTimeMillis();
System.out.println("count = "+count);
System.out.println((end-start)+" milliseconds"); } }

则执行时间为:

count = 1270607

35153 milliseconds

而如果使用BitSet 位图提供的基于“开关”思想的素数判断代码:

package com;

import java.util.BitSet;

public class Sieve {

	public static void main(String[] args){
int n = 20000000;
long start = System.currentTimeMillis();
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++;
int k = 2 * i;
while(k <= n){
b.clear(k);
k +=i;
}
}
i++;
}
while(i <= n){
if(b.get(i)){
count++;
}
i++;
}
long end = System.currentTimeMillis();
System.out.println("count = " + count);
System.out.println((end-start) +" milliseconds");
}
}

则执行时间为:

count = 1270607
248 milliseconds

我们可以看到,同样规模的数据,两者的执行效率差百倍之多,因此在某类可以用开关位判断的程序中,应该尽量使用BitSet。

为什么要用BitSet的更多相关文章

  1. strtok源码 bitset 空间压缩

    源代码里有一段: unsigned char map[32]; /* Clear control map */ for (count = 0; count < 32; count++) map[ ...

  2. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

  3. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  4. BitSet构造函数的两种特例

    C++11之后,bitset的构造函数新加了两种形式: bitset<bits>::bitset (const string& str, string::size_type str ...

  5. Bitset<>用于unordered container时的默认hash函数

    自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: // DR 1182. /// std::hash speciali ...

  6. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  7. hdu 5506 GT and set dfs+bitset优化

    GT and set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Probl ...

  8. (DFS、bitset)AOJ-0525 Osenbei

    题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...

  9. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...

  10. C++二进制文件中读写bitset

    这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...

随机推荐

  1. A - Number Sequence(矩阵快速幂或者找周期)

    Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...

  2. BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定

    题目:Click here 题意:给你n个点,有多少个正多边形(3,4,5,6). 分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可. #include ...

  3. 配置greenplum参数

    在进行一个greenplum安装之前需要进行配置一下相关的系统参数,否则很容易出现意想不到的错误. 1.修改系统参数 编辑 /etc/sysctl.conf ,以下是最小配置 kernel.shmma ...

  4. [Swust OJ 138]--文件压缩

    题目链接:http://acm.swust.edu.cn/problem/138/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  5. Python 第十三篇之一:前端页面 js和dome

    一:JavaScript: JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的 ...

  6. php 取小数

  7. 鸟哥私房菜--第1章 Linux 是什么

    [只做搬运工,在搬运的时候窃看其中乐趣.] 历史渊源 Linus Torvalds(请记住这个名字)当年(1991)在写Linux的时候,初衷是针对386型机器的,当时只是一套裸露的操作系统并不包含任 ...

  8. ZOJ 3872 Beauty of Array DP 15年浙江省赛D题

    也是一道比赛时候没有写出来的题目,队友想到了解法不过最后匆匆忙忙没有 A 掉 What a pity... 题意:定义Beauty数是一个序列里所有不相同的数的和,求一个序列所有字序列的Beauty和 ...

  9. Flask web应用

    Flask web应用 一.介绍 最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构.下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python ...

  10. Python 2.7 学习笔记 字典(map)的使用

    python中的字典,就是通常说的map,即 key/value集合的数据结构. 本文来介绍下在python下如何使用字典. 对于map这种数据结构能干什么,我们就不说了,这是一个常见的数据结构,我们 ...