找中位数最容易想到的方法就是,先对序列进行排序,取中位数,然而5亿个数要想全部读入内存需要将近2GB空间。
一种想法是采用外部排序的方法,在排序的过程中记录数据个数,找到中位数。首先采用hash() % 100,把数据分到100个文件中,然后对每个文件分别在内存中进行快速排序,再将100个小文件进行合并,并在合并过程中寻找中位数,时间复杂度是O(nlogn)
另外一种方法是,将数据按照数据空间分为0-9999999,10000000-999999999, ……大概50个部分,每一部分存入一个小文件,统计每个小文件中的元素个数,由于文件之间相对有序,可以容易得出中位数是位于哪一个文件之中,并可以得出中位数在该小文件中的排序次序,用相同的方法对小文件进行处理,当文件内容比较小的时候可以直接在内存中进行找中位数操作,对于n个随机数找k小元素的时间复杂度是O(n),所以总的时间复杂度为O(n)
5亿个数找不存在的元素
想法是:将这5亿个数据按照大小分为50部分,0-9999999, 10000000-99999999…并分别存入文件中,对于每一个文件,只用找出每个文件中不存在元素即可