`

数据结构(如何在10亿数据中快速查找出重复的数据)

阅读更多

       对于32位的计算机而言,只有2G的内存(2的三十一次方),而十亿大概是2的32次方。因此,不能将其直接放到内存中进行处理。 一个byte有八位,我们可以开辟长度为2的29次方的byte数组,利用位映射原理,将要处理的数对8进行除法取商,商作为byte数组的下标,数组存储的元素可以转化为八位二进制,若二进制数的第i位为一,则表示该数对8取模的值为i。如:

       假设某数据为9。9=8*1+1,即对8的商为1,对8取模为1。应该存在byte[1],将byte[1]的值改为00000002,即把2的一次方赋予byte[1]。

可以看到,新开数组的所需大小并不取决于数据量的大小,而是取决于某数据值的大小,新开的数组byte的大小N与所需处理的数据集之中的最大值Max有关,N>=Max/8。那么,先得到最大值,再进行查重可不可行呢,效率相对于直接开大空间有多大的提升呢?有待探究。

按照之前并不优雅的做法,就把数据量降低了n倍,得以对其进行各种操作。

下面上代码!

 

package SearchRepeatition;
/**
 * @author lzj lzj.997@qq.com:
 * @version 创建时间:2015-1-31 下午5:05:42 类说明 :10亿数量级的查重
 */
public class searchRepeat {
	// 查询方法
	public void search(int[] array) {
		byte[] bytes = new byte[20];// 一个byte有8个bit,00000000
		int[] binary = new int[8];// 开辟存储对应二进制数的数组
		// 根据位图映射,得知byte数组的大小取决于数据集中的max;
		// 因此对数据大小相差大的集合处理效果并不理想
		for (int i = 0; i < array.length; i++) {
			int index = (int) array[i] / 8;// 得到数字在bytes数组中的下标
			int mod = array[i] % 8;// 得到数字对8的模
			for (int j = 6; j >= 0; j--) {
				binary[j] = bytes[index] % 2;
				// 转成二进制存到binary数组,因转为二进制码要倒过来读,所以从6开始
				bytes[index] = (byte) (bytes[index] / 2);
			}
			bytes[index] = (byte) Math.pow(2, mod);
			System.out.println("j=" + i + "     index=" + index
					+ "     bytes[index]=" + bytes[index] + "     mod=" + mod);

			// 如果binary[7-mod]为0,说明没有重复
			if (binary[6 - mod] != 0) {
				System.out.println("数字:" + (mod + 8 * index) + "重复了");
			}
		}
	}
	public static void main(String[] args) {
		int[] array = { 9, 1, 17, 38, 11, 26, 1, 1, 1, 9 };
		searchRepeat sr = new searchRepeat();
		long time = System.nanoTime();
		sr.search(array);
		System.out.println("==time cost==" + (System.nanoTime() - time));
	}
}
 最后修改于2015/01/31.

 

 

分享到:
评论

相关推荐

    海量数据处理总结(大量数据处理)

    - **案例二:日志数据分析**:在海量日志数据中,提取出某日访问百度次数最多的IP。通过使用Hashing,将IP直接存入内存并进行统计,可以快速找出访问次数最多的IP。 - **案例三:整数去重**:在2.5亿个整数中找出不...

    大数据量,海量数据 处理方法总结

    Bit-Map是一种基于位数组的数据结构,适用于数据范围较小(如int的10倍以下)的场景,用于快速查找、判重和删除操作。 **适用范围**:数据范围受限,如电话号码、IP地址等。 **优化建议**:通过合理分配位数组,如...

    海量数据面试题整理txt

    - **方法二**:使用布隆过滤器(Bloom Filter),这是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。布隆过滤器可能会出现误判,但不会漏判。 例如,假设内存限制为4GB,需要存储大约320G的...

    c语言如何对海量数据进行处理

    ### 在2.5亿个整数中找出不重复的整数 处理2.5亿个整数,内存不足以容纳这些整数,问题转化为在有限空间内找出唯一整数的问题。 一种可能的解决方案是使用**位图(Bitmap)**。位图是一种使用位数组来表示整数集合...

    大数据量,海量数据_处理方法总结

    **适用范围**:适用于快速查找、删除等基本数据结构需求。 **基本原理**: - 通过哈希函数将键映射到位数组中。 - 针对不同的数据类型如字符串、整数等有不同的哈希方法。 - **冲突处理**:主要有开放寻址法(open ...

    常见的海量数据处理方法

    在一个4GB的内存空间中,可以使用布隆过滤器来表示340亿个URL的存在性,从而极大地节省了内存占用。当需要判断一个新的URL是否已存在于集合中时,只需查询布隆过滤器即可快速得到结果。 为了进一步优化查询性能,...

    大数据处理方法

    - **不重复整数计数:** 在2.5亿个整数中找出不重复的整数个数,即使内存不足以存储全部整数。 综上所述,以上介绍的大数据处理方法包括布隆过滤器、哈希表和位图等,它们各有特点和适用场景。通过对这些方法的理解...

    大厂面试系列二.pdf

    在设计DNS服务器的cache数据结构时,需要考虑如何快速插入和查询IP数据,这通常涉及到数据结构的选择,如哈希表、平衡树等,以满足高并发和快速查找的要求。 找出数组中出现次数超过一半的数,可以使用摩尔投票算法...

    大数据的一些面试题.pdf

    例如,若要在2.5亿个整数中找出不重复的整数数量,可以将所有整数分为2^8个区域,利用bitmap进行存储。对于中位数问题,可以先将数据划分为2^16个区域,然后逐级确定中位数所在的区域。 二、数据库索引 数据库索引...

    大前端中的二分算法.docx

    总结来说,二分查找是一种在有序数据结构中快速查找的算法,它利用了数据的有序性,通过不断地缩小查找区间来提高查找效率。在前端开发中,掌握这种算法能够帮助我们编写出更加高效、优化的代码,应对大数据量的场景...

    孙浩天的ACM模板1

    【ACM模板】是计算机竞赛,特别是ACM/ICPC(国际大学生程序设计竞赛)中常用的算法和数据结构模板集合,这些模板可以帮助参赛者快速解决各类问题。以下将详细讲解标题和描述中提及的一些关键知识点。 1. **插入排序...

    面试常见算法

    - 在大数据处理中,空间优化技巧包括但不限于使用位图、散列表等数据结构。 - **示例7**:在处理大规模数据时,可以使用位图来表示数据的存在与否,从而大大减少空间需求。 #### 三、动态规划的应用 **知识点...

    计算机等级考试四级考试中英文术语对照.pdf

    48. **索引(Index)**:帮助快速查找数据库或文件中特定信息的数据结构。 49. **信息(Information)**:具有意义的数据,可以用来传达知识或指导行动。 50. **内处理(Inline Processing)**:在单个处理步骤中完成的...

    功能超级强悍的文本编辑器 PilotEdit 14.3.0 + x64 中文多语免费版.zip

    &gt;在打开的文件中查找/删除重复的行 &gt;按文本或数字比较 &gt;按一列数据比较 &gt;按正则表达式比较 19. 收集字符串 &gt;将匹配正则表达式字符串拷贝到的剪贴板。比如,我们可以把一个文件中所有的Email地址拷贝到剪贴板。 20. ...

    PilotEdit Lite v12.7.0.zip

    在打开的文件中查找/删除重复的行 按文本或数字比较 按一列数据比较 按正则表达式比较 19. 收集字符串 将匹配正则表达式字符串拷贝到的剪贴板。比如,我们可以把一个文件中所有的Email地址拷贝到剪贴板。 20. ...

    PilotEdit支持超过400G的文件编辑

     &gt;在打开的文件中查找/删除重复的行  &gt;按文本或数字比较  &gt;按一列数据比较  &gt;按正则表达式比较  19、收集字符串  &gt;将匹配正则表达式字符串拷贝到的剪贴板。比如,我们可以把一个文件中所有的Email地址...

    office办公软件EXCEL表格2010、2007-应用技巧.pptx

    如F2用于编辑单元格,F4重复上一个操作,F5打开定位对话框,F12打开另存为对话框,Ctrl+1显示单元格格式对话框,Ctrl+D向下填充,Ctrl+Z撤销,Ctrl+S保存,Ctrl+"+"和"-"插入或删除行,Ctrl+回车批量输入重复数据,...

    2011各大IT公司笔试面试题-经典

    在10亿条记录的数据库上进行查询,目标是在90%的情况下达到100毫秒内返回结果。这可以通过**分布式计算**和**索引优化**来实现。将数据分布到多台机器上,利用MapReduce等技术进行并行处理,同时建立高效的索引结构...

Global site tag (gtag.js) - Google Analytics