从大二上学期开始接触严老师的《数据结构》时,就时常听到另一本书--《算法导论》!导论一词于我而言,就是粗犷全面地小介绍一下某门学科吧。
因为大一伊始,就有这门课--《计算机导论》。啊,哈哈!不好意思地说句吧,此门课时我进入大学以来第一次在课堂上睡觉的课。大家大概都有同感吧,非我想睡觉,而是课程实在无聊。换句话说吧,我对每一门课程都很尊重的,但此课程用的教材着实让你想到无数悖论:当今计算机技术发展的多快啊,可是啊,我们的教材为什么就那么寒酸呢,难道这本教材就似《计算机程序设计艺术》那样虽然岁月沧桑,但历久弥新?相信只要是人,且是计算机科班出生的自我感觉良好的"Geeks"都会抛出鄙夷的眼光...而且...啊,嗯,
吐槽就此打住吧。
![]()
也许吧,凡此种种有关学校教材的事件都与学校或学院的利益息息相关,教授老师们领导们等着灰色Income吧!但我相信--平均实力处于二流甚至三流水准的大陆IT人士们在读大学时也都相信,我们的大学不应该是这样,至少计算机专业的教育不应该是这样(连选购教材也太...此处省略几个字...)。
To the point,我刚读完《算法导论》前三章,觉得这根本就不是什么导论,至少不是我想的那种以及大一时《计算机导论》的那种。仅仅读完前三章后,我就目瞪口呆,震惊无比,非常Shock。虽然前三章的内容我早就熟知,但几位MIT的牛教授深入浅出的叙述方式及其浓厚的学院派作风不得不让我敬仰无比!感叹终归感叹,终于寻得真正讲算法设计的知己老师这一事实更让我一个刚踏入IT才三年半的无名晚辈热泪盈眶啊!
虽然目前只读了前三章,但也体会到严老师的书与此书的巨大差距了。我指的并非侧重于所涵盖的知识点,而是作者的独特品味--让你看懂一个算法是关键,但对你如何深入理解算法,在理解过程中某些细节性的但又非常重要知识点又娓娓道来。
就第二章的插入排序算法(INSERTION_SORT)中的一个让我困惑了三年的知识点来说吧!一个让人醍醐灌顶的术语循环不变式(loop invariants)让我瞬间“石化”了。虽然之前对这一相关知识点已经理解的可以了,但就是没有系统地概括,所以难免有点模糊的不舒适感。究其缘由,就是未能上升到理论化此知识点的程度。
下面介绍下循环不变式(loop invariants)以飧读者:
对于循环不变式(loop invariants)务必满足并证明其三个性质:INSERTION-SORT(A) 1 for j ← 2 to length[A] 2 do key ← A[j] 3 ▹ Insert A[j] into the sorted sequence A[1..j - 1]. 4 i ← j - 1 5 while i > 0 and A[i] > key 6 do A[i + 1] ← A[i] 7 i ← i - 1 8 A[i + 1] ← key
- 1. Initialization: It is true prior to the first iteration of the loop.
- (初始化:它在循环的第一轮迭代开始之前,应该是正确的。)
- 2. Maintenance: If it is true before an iteration of the loop, it remains true before the next iteration.
- (保持:如果在循环的某一次迭代之前它是正确的,那么,在下一次迭代之前,它也应该是正确的。)
- 3. Termination: When the loop terminates, the invariant gives us a useful property that helps show that the algorithm is correct.
- (终止:当循环结束时,不变式会给我们一个有用的性质,此性质有助于表明算法是正确的。)
至于具体的验证,很简单。此算法中蕴含了2个循环不变式:for循环和while循环。
我单独把循环不变式(loop invariants)拿出来讨论,并非说这个知识点很高级或者很复杂,而是这一术语让与此相关的知识明确化,当人们一提及循环不变式(loop invariants)时,我们就会激动地响应:“哦!嗯!是啊!这个啊!我知道的!”,于是三个性质马上浮现脑际,清晰明了!这可以类比于《设计模式》巨著上的各种程序设计方法的术语化。《设计模式》最大的贡献在于它将之前软件工程中经常遇到的设计技巧和方法术语化,使其独立于其它相关设计,从而使某一设计模式清晰明了!
好吧,矫情的修辞也就此打住吧!但我,此时此刻,狂热地决定了,将深深地爱上你--《算法导论》。一个月,全身心投入,希望深情的拥抱你是我本科时代最完美的句号吧!