题目:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
方法一:位图法
就是bit+hash的思想.具体做法:
1.hash思想:数组中我们以每个下标作为一位,位图法中,我们具体到bit,每个bit就是一个数.
2.40亿个数,4*10的9次方个数,4*10的9次方个bit/8/1024/1024=476M.所以我们只需要512M空间就能够记录这40亿个数字了.
3.读取40亿个数字,在相应的bit记录为1.因为要遍历,所以时间复杂度O(n).
4.记录完40亿个数字后,根据给定的数,去找相应位置是否为1.如果是就说明这个数存在于40亿个数当中.
总的时间复杂度O(n),空间512M
方法二:512M空间都没有的情况下,使用二分法
二分法依据:
因为40亿个整数都是unsigned int类型的,unsigned int类型最大的数2的32次方=4 294 967 296,就是42亿多.所以每一个整数肯定是可以用32位bit来表示的.于是我们考虑,可以通过每个整数的32bit中的每一个bit进行分类,分32次.
具体做法:
1.我们先根据32位中的最高位0或者1,把40亿个数分成两份文件,一份最高位全是0,另一份最高位全是1.然后可以把我们要判断的数的最高位0或1归为其中一份文件中,这个数只能在这份文件中,或者没有.
2.接下来,我们再根据32位bit中的次高位,继续把第1步中选定的文件分成两份文件.
3.第1 2部,循环32次,最终判断32位bit都完全相同的是否存在就可以了.
由于把一个文件分成两个文件的过程中,需要扫描文件中的每一个数字的当前bit,所以总的时间复