有点标题党,其实只是一点点个人看法而已。
其实这本书已经看过有一阵了,不过还是想批判一下。不管宣传得如何,其实这本书说来其实还是一个面试题汇编,而且更像是给应届生看的。因为其中的题目基本都和实际应用没多大关系,就像以前数学的应用题,给一些算法问题套了一个故事而已。但是,因为这本书套了一个微软的名头,很容易让人误以为实际情况中就应该这么做。其实如果把故事给扒了也许会更好些。还有就是,与C/C++语言结合的太紧,有些问题用其他语言很容易做一个比较高效的方法。
书里的题目多数难度上也还好,多半我也能做出一个不差的解。不过有一些就偏了一点。如果没专门去研究过算法(有些题目在别的书上见过),一般人光靠脑袋估计是想不出来的。
比如第一个 cpu 占用率曲线,我知道可以用 sleep/idle 让 cpu 睡觉,但是除非对 windows 很熟悉的才可能知道得到 cpu 频率之类的函数。也许这是考找资料的能力?
比如那个双线程高效下载,这个问题的出现倒是恰好对上了 《unix编程艺术》里对 windows 的一个批评。每个应用都做了太多的事情,重复实现功能。其实这个问题的解答虽然不算很难,但是线程同步到底是个麻烦的事情。其实如果用进程来实现这个功能,一个进程负责下载,一个进程负责写文件,然后用管道连起来,就可以运用管道来实现缓冲了。系统自己会处理好同步这些事情。另外,如果系统本身提供一个下载程序,比如 wget ,就只需要调用它就可以了,完全不用费力开发,而且通常会更可靠。
那个发帖水王的问题,如果遍历一遍帖子列表,用 hash 表(MS 的 STL 里带了)来统计每个用户的发帖数,然后遍历一下这个 hash 表就可以找到发帖最多的人。复杂度也是 O(n) 。有不少语言自带了这种结构。其实这个问题的特殊之处在于要你去根据超过一半这个情况去做优化,后面的扩展问题也是类似情况。这其实是脱离实际应用的。
又比如那个找出故障机器,如果抛掉应用题的那个壳,作为考思路的题倒也不错。但在实际情况中,这种不具备扩展性的方法是不合适的。而且通常来说,服务器都是分机房分组的。一组机器就算有 10000 个,遍历整个列表也是很快的。而且这个操作一般也就是一个定时任务,其实就没啥必要去做优化。
最后引用一句话,过早优化是万恶之源。