数据结构(如何在10亿数据中快速查找出重复的数据)
2015-06-14 22:34
609 查看
对于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倍,得以对其进行各种操作。
下面上代码!
最后修改于2015/01/31.
假设某数据为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.
相关文章推荐
- 数据结构课程设计(C语言)——判断两序列是否为同一二叉搜索树
- leetcode--Triangle
- 数据结构与算法——链表(1)
- 数据结构与算法——冒泡排序
- leetcode--Flatten Binary Tree to Linked List
- java项目——数据结构实验报告
- 一个简单的链表结构 分类: C/C++ 数据结构与算法 2015-06-14 16:39 129人阅读 评论(1) 收藏
- 【数据结构学习】字典树Trie
- 编程中最没用的东西是源代码,最有用的东西是算法和数据结构。善于思考的心是必不可少的
- 学JS必看-JavaScript数据结构深度剖析
- 【PAT】自测2 素数对猜想
- 【PAT】自测1 打印沙漏
- 数据结构实验:连通分量个数
- C++ map,set内部数据结构
- 数据结构之递归小练习(定义,阶乘,求和,汉诺塔)
- 浅谈算法和数据结构: 九 平衡查找树之红黑树
- 速查表:常用算法和数据结构的复杂度
- 数据结构(四)---树:
- hdu5269 数据结构Trie
- HDU 5269 && BestCoder #44 1002 ZYB loves Xor I (分治)