最新百度面试题目一

现在有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是否存在。

... ...

依次类推,即可。 

小结:

        通过分析此题目,首先这种思路和方法,在一定程度上用相对小的空间存储了大量的数据,节省了比较大的内存空间;在运算方面,位运算的速度相当来说效率是比较高的,因而也再一定程度上节省了时间复杂。

        总之,这种存储方式和思维方式,在一定方面能够有效的解决海量数据存储与运算。基于此题目,凡是大量数据筛选,判断是否存在等问题,我们都可以借鉴此题目的思维和方法。

原文地址:https://www.cnblogs.com/shihao/p/2199357.html