先看一个题目:
给你一堆西安市的电话号码列表,数量大概在千万级,
要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。
目前西安市的电话号码大概都以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算法改进及其实现.doc》可能包含了如何在实际项目中优化和实现Apriori算法的详细步骤、代码示例以及性能评估。它可能涵盖了以上提到的一些改进策略,并提供了具体的编程实现指导,包括使用哪种编程语言...
在Java中,对象引用的生命周期与垃圾回收机制密切相关。不同类型的引用对象决定了其被垃圾收集器处理的方式: - **软引用(SoftReference)**:在内存压力较大时,软引用所指向的对象可能被垃圾回收器回收。软引用...
总之,掌握线性表及其不同实现方式,以及如何在实际问题中应用递归和分治思想,对于深入理解和应用数据结构与算法至关重要。这些知识不仅对于软件开发,也对于理解和优化系统性能有着深远影响。
《UrlImageLoaderToListView在Java中的实现与应用》 UrlImageLoaderToListView是Java编程领域中常见的一种技术实践,主要用于将网络上的图片加载到ListView中显示。在Android开发中,ListView作为常用的数据展示...
- Kotlin:了解Kotlin语言特性,对比Java的优势,如何在项目中使用Kotlin。 - AndroidX:理解从Support Library迁移到AndroidX的好处,如何进行迁移。 以上知识点是Android面试中的常见问题,求职者需要深入理解...
在Android中,可以使用Bitmap类加载图片,然后通过Animation类实现动画效果,如角色跳跃、敌人移动等。 六、声音与音乐 Android支持多种音频格式,如MP3、WAV等。使用MediaPlayer或SoundPool类可以播放背景音乐和...
在Java中,注解可以用于各种目的,如文档、编译器指令或运行时行为修改。 **API (Application Programming Interface) 应用(程序)编程接口** API是一组定义了如何构建和使用软件组件的协议、工具和例程。API使软件...
之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写...
之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写...
2. **Java创建线程的方法**:在Java中可以通过继承`Thread`类或实现`Runnable`接口的方式创建线程。示例代码如下: ```java class MyThread extends Thread { public void run() { // 线程执行体 } } // ...
Java中多态的表现 - **多态**是面向对象编程的一个重要特性,允许子类继承父类,并覆盖父类的方法。 - **实现方式**:继承和接口实现。 #### 7. 抽象类和接口的异同 - **相同点**:都不能实例化。 - **不同点**...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...