随便写点最近在看的这本黑皮书。
在知乎上找关于“数据结构”的书,大概是绕不开这本黑皮的《数据结构与算法分析》的。
从页码上看,这本书大概是所有数据结构里面最薄的一本了;但这并不意味着这本书好读。
实际上,就目前我上的数据结构课来看,这本很薄的书的内容远超比它多出一倍页码的书。
一般的数据结构书在讲到“树”时“二叉查找树”大概是核心,会让人感觉难的也可能就是“表达树”。这本书在树这一章的核心居然是AVL(平衡二叉树);Wow,居然是据说去年难倒很多学长面试的平衡二叉树。(哈哈我还听说有面试要求手写红黑树的……)
这玩意我第一次读也没明白……老老实实抄完代码后,果不其然第二天就忘了。
AVL大概是阅读这本书时会碰到的第一个难题。实际上它的难处就在于它刚讲完单旋转就把单旋转抽象化直接用在了双旋转。这就跟我们之前聊过的,作者在此处省略了信息,你需要靠组块才能理解这个问题。
这让我想起去年我怼蓝以中先生的《高等代数(上册)》。这样一本面的书,为了看懂它,我不仅花了将近2个月的时间,而且还将此书手抄了一遍……
纵使这样,耗费了太多心力的我已经没有办法能把《高等代数(下册)》读完:一是学校线性代数考的内容差不多就是上册的,我再继续看下册会显得有些费力不讨好;二是虽然我上册看得很认真,在看下册时还是不出意外地需要来回翻上册的内容。
总的来说大概就是我觉得继续看下去会没有用吧;没有用的东西还费力争取它干嘛呢?
因为当时是这样想的吧,所以后来在比赛时看到近世代数真的是想杀人。
(蓝以中先生的《高等代数》是很值得一看的;推荐要回顾线性代数的可以看一下上册)
回到这本书吧。
这本书的篇幅短还有一个很重要的原因:它代码没写全或根本没写。
在讲“堆”的的时候,这本书只是在一大段话里的一小行说明了LeftCHild怎么算,于是就在代码里面用上了LeftChild()这个函数;而且这个函数相对于那个说明还有些改动。习惯于直接看代码的我在这个卡了很长时间,想了很久LeftChild()这个函数到底是在干什么……
有关数据结构的应用也是一行代码都没有给。用栈实现的“中缀表达式”和“后缀表达式”当初也要了我好长时间来研究,导致我现在处理“中缀表达式”和“后缀表达式”更喜欢用“表达树”而拒绝用栈……
还有在描述“栈”的两种实现(数组和链表)时这本书倒是都给了例程;于是在讲队列时说“队列的例程就当作习题吧”。
说到习题……
这本书的习题也是很有意思。
链表那一章我还能接受,毕竟学完链表要求写一个双向循环链表不过分。
队列那一章我还能接受,毕竟学完队列要求写一个双向队列我能接受。
树那一章直接轰到了伸展树是什么鬼啊……
你怎么不干脆直接轰到红黑树啊……
图论也是直接轰到了NP-Hard……
完全,不能接受……
以上。
豆瓣8.9分,所谓数据结构的入门书。
其实入门书里有一本更好的,红皮的《算法》。
有机会读完跟你们分享一下,放在书单里了。
赞赏