`

bitmap思想及其在java中的相关实现

 
阅读更多
先看一个题目:

给你一堆西安市的电话号码列表,数量大概在千万级,

要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。

目前西安市的电话号码大概都以8开头,为8位,也就是

类似于82678578这样子

二重暴力搜索时间复杂度太高,这里我们不予考虑。

容易想到的办法就是建立一个标志数组,

int boolean都行,用相应的位置值来代替这个号码是否出现,

根据数组的可直接存取特性,来提高效率。

但是你是否想过或测试过

int[] a = new int[100000000];

boolean[] a = new boolean[100000000];

这样类似的语句是否可以通过编译并且执行。

再仔细思考下,就会发现,int型的字段太过于占空间,我们只需要知道这个号码存在与否,

所以最简单的0和1就够用了,能表示0和1的最小存储单位是什么呢?

是内存中的一位。

OK,这就是bitmap的思想。

将西安市的电话号码去掉开头的8,就可以将其映射到一个1到10000000的数组中。

8bit是1byte,1024byte是1kb,1024kb是1mb

所以10000000个bit占用的空间为

10000000/8/1024/1024mb大概为1mb多些,

这对于现在大家动不动几G的内存来说,完全是小菜一碟。

同时,java中也有对应的实现,java.util.BitSet,

完全是为这个量身定做的java类。

这个类从jdk1.0开始就有了,不过其中的某些方法是jdk1.4以后才有的,

大家用的时候要当心。

另外BitSet是非线程安全的,需要外部同步。

下面的简单代码给出了BitSet的例子:

print?

           
 //创建一个具有10000000位的bitset 初始所有位的值为false  
           java.util.BitSet bitSet = new java.util.BitSet(10000000);  
            //将指定位的值设为true  
            bitSet.set(9999, true);  
              //输出指定位的值  
            System.out.println(bitSet.get(9999));  
            System.out.println(bitSet.get(9998)); 
分享到:
评论

相关推荐

    位图查询海量数字是否存在问题

    在Java中,可以使用`BitSet`类来创建和操作位图。以下是一些基本操作: 1. 初始化位图:根据数据范围创建大小合适的位图。 ```java BitSet bitSet = new BitSet(maxValue + 1); ``` 2. 插入数据:将数据插入位图,...

    Apriori算法改进与实现

    文档《Apriori算法改进及其实现.doc》可能包含了如何在实际项目中优化和实现Apriori算法的详细步骤、代码示例以及性能评估。它可能涵盖了以上提到的一些改进策略,并提供了具体的编程实现指导,包括使用哪种编程语言...

    图片缓存笔记

    在Java中,对象引用的生命周期与垃圾回收机制密切相关。不同类型的引用对象决定了其被垃圾收集器处理的方式: - **软引用(SoftReference)**:在内存压力较大时,软引用所指向的对象可能被垃圾回收器回收。软引用...

    01-绪论和线性表1

    总之,掌握线性表及其不同实现方式,以及如何在实际问题中应用递归和分治思想,对于深入理解和应用数据结构与算法至关重要。这些知识不仅对于软件开发,也对于理解和优化系统性能有着深远影响。

    UrlImageLoaderToListView

    《UrlImageLoaderToListView在Java中的实现与应用》 UrlImageLoaderToListView是Java编程领域中常见的一种技术实践,主要用于将网络上的图片加载到ListView中显示。在Android开发中,ListView作为常用的数据展示...

    android经典面试题

    - Kotlin:了解Kotlin语言特性,对比Java的优势,如何在项目中使用Kotlin。 - AndroidX:理解从Support Library迁移到AndroidX的好处,如何进行迁移。 以上知识点是Android面试中的常见问题,求职者需要深入理解...

    android小游戏

    在Android中,可以使用Bitmap类加载图片,然后通过Animation类实现动画效果,如角色跳跃、敌人移动等。 六、声音与音乐 Android支持多种音频格式,如MP3、WAV等。使用MediaPlayer或SoundPool类可以播放背景音乐和...

    IT软件开发常用词汇大全.docx编程资料

    在Java中,注解可以用于各种目的,如文档、编译器指令或运行时行为修改。 **API (Application Programming Interface) 应用(程序)编程接口** API是一组定义了如何构建和使用软件组件的协议、工具和例程。API使软件...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写...

    我的编程感悟(中文PDF)(共37M二分卷)分卷一

    之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写...

    操作系统计算题总结no.pdf

    2. **Java创建线程的方法**:在Java中可以通过继承`Thread`类或实现`Runnable`接口的方式创建线程。示例代码如下: ```java class MyThread extends Thread { public void run() { // 线程执行体 } } // ...

    百度校园招聘历年经典面试题汇总:Android岗

    Java中多态的表现 - **多态**是面向对象编程的一个重要特性,允许子类继承父类,并覆盖父类的方法。 - **实现方式**:继承和接口实现。 #### 7. 抽象类和接口的异同 - **相同点**:都不能实例化。 - **不同点**...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

Global site tag (gtag.js) - Google Analytics