从海量数据查找有或者没有出现的数据
来源:互联网 发布:炫踪网络发行的游戏 编辑:程序博客网 时间:2024/06/07 09:26
现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。
解决办法:
一)用一个32位的整数32位表示32个数,1亿/32 = 3125000,使用3.125 * 4M byte空间即可保存1亿个数,即index[3125000].
二)对于数n,(n-1) / 32 为其在数组中的下标,table[(n - 1) % 32]与数组中下标(n-1)/32的值使用或操作。
三)表table中值为 table[ 0 ]=0x00000001,
table[ 1 ]=0x00000002,
... ...
table[29]=0x20000000,
table[31]=0x80000000, 等这样的表示方式,具体的数值使用查表法加快速度。
四)最后算某值是否存在,使用与操作即可计算出。
数据存储比如:
第一个N=30是一个随机数,则存储可以表示为:index[(30-1)/32] = index[0] = index[0] || table[(30-1)%32]
注: /*刚开始时候初始化index[32]={0}*/
= 0 || 0x20000000 = 0x20000000;
第二个N=31是一个随机数,则存储可以表示为:index[(31-1)/32] = index[0] = index[0] || table[(31-1)%32]
注:/*第30位1,其他位为0*/
= 0x20000000 || 0x40000000 = 0x60000000;
... ...
依次类推,即可。
数据验证比如:
1. 当要查询30是否存在的时候,由于:(30-1)/32 = 0;(30-1)%32=29;我们只需要计算:index[0] & table[29] 是真还是假,就可以得出30是否存在。
2. 当要查询31是否存在的时候,由于:(31-1)/32 = 0;(31-1)%32=30;我们只需要计算:index[0] & table[30] 是真还是假,就可以得出31是否存在。
... ...
依次类推,即可。
小结:
通过分析此题目,首先这种思路和方法,在一定程度上用相对小的空间存储了大量的数据,节省了比较大的内存空间;在运算方面,位运算的速度相当来说效率是比较高的,因而也再一定程度上节省了时间复杂。
总之,这种存储方式和思维方式,在一定方面能够有效的解决海量数据存储与运算。基于此题目,凡是大量数据筛选,判断是否存在等问题,我们都可以借鉴此题目的思维和方法。
- 从海量数据查找有或者没有出现的数据
- 从海量数据查找有或者没有出现的数据
- 从海量数据中查找数据
- 从海量数据中查找一个数
- 海量数据查找
- 海量数据查找中位数
- 海量数据查找中位数
- 位图的应用之海量数据查找
- 有内存限制的海量数据排序
- 海量数据中查找中位数
- 海量数据查找唯一数据问题
- 多线程生成海量数据和多线程海量数据查找
- 002 bitmap海量数据的快速查找和去重
- 处理查找海量数据中不存在的一个
- navicat for mysql psc 没有数据或者只有部分数据(即有一部分表没有数据)
- 海量日志数据,找出出现次数最多的IP地址。
- 海量日志数据,找出出现次数最多的IP地址。
- 海量数据中,找出出现次数TOPK的记录
- Zend_Cache的使用
- HDOJ1195密码箱
- zoj_1698
- w3school学习2-jQuery 选择器
- Explicit关键字的作用
- 从海量数据查找有或者没有出现的数据
- 智能手机超智能 心理学领域帮大忙
- AIX 6.1 两日学习偶记
- 谈谈ActionScript垃圾回收(上)
- 谈谈ActionScript垃圾回收(下)
- 智能指针
- Android[中级教程]第四章 单元测试AndroidTestCase
- 【DMA模式2联想到的磁盘坏道】终于CHKDSK解决了!
- Flex的事件(一)