从海量数据查找有或者没有出现的数据
2012-06-18 20:47
399 查看
现在有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是否存在。
... ...
依次类推,即可。
小结:
通过分析此题目,首先这种思路和方法,在一定程度上用相对小的空间存储了大量的数据,节省了比较大的内存空间;在运算方面,位运算的速度相当来说效率是比较高的,因而也再一定程度上节省了时间复杂。
总之,这种存储方式和思维方式,在一定方面能够有效的解决海量数据存储与运算。基于此题目,凡是大量数据筛选,判断是否存在等问题,我们都可以借鉴此题目的思维和方法。
http://blog.csdn.net/tianmo2010/article/details/6843349
解决办法:
一)用一个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是否存在。
... ...
依次类推,即可。
小结:
通过分析此题目,首先这种思路和方法,在一定程度上用相对小的空间存储了大量的数据,节省了比较大的内存空间;在运算方面,位运算的速度相当来说效率是比较高的,因而也再一定程度上节省了时间复杂。
总之,这种存储方式和思维方式,在一定方面能够有效的解决海量数据存储与运算。基于此题目,凡是大量数据筛选,判断是否存在等问题,我们都可以借鉴此题目的思维和方法。
http://blog.csdn.net/tianmo2010/article/details/6843349
相关文章推荐
- 从海量数据查找有或者没有出现的数据
- 从海量数据查找有或者没有出现的数据
- 向SQL2005导入Excel数据出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”的错误0xc020901c
- 向SQL2005导入Excel数据出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”的错误0xc020901c
- SSH整合出现org.hibernate.LazyInitializationException: could not initialize proxy - no Session或者前台没有显示任何数据
- VS里面按键盘"Ctrl+F" 或者选 编辑 菜单里面的 查找和替换 也没有对话框弹出来 问题解决。
- 客户机随机出现文件损坏请运行CHKDSK修复或者重新打开游戏提示“虚拟盘没有此游戏,请联系网管”
- 当接收端的内核缓冲区中的数据没有全部交给应用程序时, 如果接收端关闭socket(比如调用close或者进程挂掉),就会回以RST报文
- struts2 2.5.5 中出现404 异常,没有对应的命名空间,或者没有对应的Action(套路)
- 海量数据查找唯一数据问题
- android studio编程时出现的错误:ListView重新载入后,更新数据或者再次进入该ListView加载数据,数据不显示 解决方法
- SSH三大框架CRUD项目中为什么会出现web页面页面数据出现修改,但是数据库里面的数据却没有修改
- SQL查找数据库中所有没有主键的数据表脚本
- Linq从两个edmx(两个数据库)中选取数据进行查找出现错误解决 (指定的 LINQ 表达式包含对与不同上下文关联的查询)
- windows中android SDK manager安装更新sdk很慢,或者出现Done loading packages后不动甚至没有任何可用包
- 不能打开某些文件,这些文件被别的用户独占方式打开,或者没有查看数据的权限
- Android5.0以上使用XUtils访问网络出现错误或者网络数据无法加载: java.io.IOException: stack size 1036KB
- oracle导出数据显示出现ora-00109或者LRM-00109出错修改办法
- 查找字符串中重复出现的数据