一. 海量数据求中位数,比如10G的int64的数,求排序后最中间的数
首先,若能全部放入内存中,那么可以使用类似快排的算法,每次保留包含中位数的那段数据,直到找到中位数;那么海量数据显然无法一次性放入内存,如何每次减少数据呢?一个自然的思路就是分成若干段(大小能放入内存中),也使用之前的算法,但是该舍弃哪一段显然要在整体上来判断;我的思路是引入一个基准数X,所有的段都使用X进行partition,那么就能知道全部数据中小于X的和大于X的数据量,也即知道了该保留哪些数据;重复该过程,当数据量能读到内存时就OK了。
二. 一个乱序数组求两两之差绝对值最小的值
最简单的算法就是排序然后相邻的数做差记录绝对值最小的,可以接受;
更巧妙的方法还是利用快排,与基准数X比较时就记录下最小的差绝对值,分成两半后,两段只需要在各自的段求最小值,不会跨过X,最后比较下每次产生的最小值即可。
三. 字符串替换算法
给定一个字符串 str ,要求将其中的‘m’全都替换成‘abc’,如何尽量优化空间和时间复杂度?
如果每次只考虑其中一个‘m’并进行替换移位,显然移位操作代价太大;很容易的想到要从全局出发,使得移位能够一步到位。
具体就是首先遍历求出‘m’的个数,计算出所需的额外空间,然后从后往前进行移位和替换。
四. 给你一个数组 A [ 1 .. n ] ,请你在 O ( n ) 的时间里构造一个新的数组 B [ 1 .. n ] ,使得 B [ i ] = A [ 1 ] * A [ 2 ] * ... * A [ n ]/A [ i ] 。你不能使用除法运算。
比较容易的想到记录中间结果,任意一个 B[i] 都可以看成是两个序列的成绩,一个是A[1..i-1],另一个是A[i+1..n],因此可以先求出 A[1..k],k=1..n-1;以及 A[k..n],k=2..n-1 ;分别消耗O(n)的时间,最后组合起来就构造出B,同样花费O(n)。总时间也是O(n)