/ T6 K: [$ `+ b6 B* W" ]5 @3 S2 [& I& z3 J1 k' U X( R( V
古典集合论,北师大出过一本《基础集合论》不错。 7 `/ j" @* X9 q9 A }- J / z0 d* c* y& Z3 W; [! b3 K3 z' F8 ?$ a& [: N1 S' n1 t% r
数理逻辑,中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,<a href="http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm" target="_blank" ><FONT color=#003366>http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm</FONT></A>自己去看看吧。总的来说,学集合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深不可测。 ' @% ]1 s: F! P
2 C; B5 Z+ b: ^( O, H! Z! n& I
) V9 C" i$ F& U7 q7 @
学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方面真正入了门,也就不用再浪费时间听我瞎侃了。 ) D) i4 S& c/ p0 Y- j - x! \8 `- r; [# t3 w3 z9 u L 5 s7 K0 a, ]1 A0 p9 _: b据说全中国最多只有三十个人懂图论。此言不虚。图论这东东,技巧性太强,几乎每个问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它就能给你成就感。我的导师说,图论里面随便揪一块东西就可以写篇论文。大家可以体会里面内容之深广了吧!国内的图论书中,王树禾老师的“图论及其算法”非常成功。一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,如Bondy & Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,就马马虎虎,对本科生足够了。再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还是读原版好。搞定这本书,也标志着图论入了门。 ) J6 g% E" I8 ~. a8 ?
' b! p: k" U* c# Y. i+ s8 X+ b0 c) }
5 o: j+ P& b* N; L
离散数学方面我们北京工业大学实验学院有个世界级的专家,叫邵学才,复旦大学概率论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我专门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中我又深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我实在觉得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书还要依据个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的都一样了。外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少是“紧跟时代的理论知识”。 3 V. t, o F' w9 A/ M( K. B& @# _' u( U; U4 z, T
. p$ ]$ `/ }- _7 K& u
组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典“具体数学”吧,西安电子科技大学出版社有翻译版。 , t/ O* j6 q+ S1 H3 \) P* Z2 ]" G) ^2 `& d
7 t+ T, I. u, ?+ }, ^- |抽象代数,国内经典为莫宗坚先生的“代数学”。此书是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一些其它的教材,然后再回头来看“代数学”。国际上的经典可就多了,GTM系列里就有一大堆。推荐一本谈不上经典,但却最简单的,最容易学的:<a href="http://www.math.miami.edu/~ec/book/" target="_blank" ><FONT color=#003366>http://www.math.miami.edu/~ec/book/</FONT></A>这本“Introduction to Linear and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想,我校比较牛的同学都有收藏。 9 j2 {$ Q: S8 c
8 j" I* H [) q" j: n2 `! n# _ 5 c2 x4 S; ~! R/ ?' \( B/ c7 |数论方面,国内有经典而且以困难著称的”初等数论“(潘氏兄弟著,北大版)。再追溯一点,还有更加经典(可以算世界级)并且更加困难的”数论导引“(华罗庚先生的名著,科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,对本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的书,如Bach的"Introduction to Algorithmic Number Theory"。 * _6 U. u) M, c" k; E$ Z7 w% K ( w* Y. M' Q6 v7 f9 g5 T , N: t1 W: x4 O1 Y+ x' s" W/ t计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确实非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。算法教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言,这一本已经足够,不需要再参考其它书。 $ ^* Y: u5 A2 G' i$ C/ G8 d5 U
# O8 @6 k. Z& X$ u当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题: 7 ]- \+ }4 B) \2 ~0 m v2 p# p* ?- s3 W0 i# C) M+ v
1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己设计数据结构。 / @, o( X2 Y8 q 7 i D; b3 A3 H1 G- T5 K+ r6 I2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序...) ; e) A: e4 Z8 p7 X0 ?+ i* y9 T! f: [. d. h
3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.) - @6 r" o- y, I* u* U9 a
& i& u8 Z. ^& B' t" r% c4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间. * N& W: ?* t) C+ b- p( P, b 8 m+ D) M* p' l5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.' @3 I# |: z: {3 p ?8 D% z
9 V8 p! `' g& I' u' S5 H
* A( p/ d' c; @6 V6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释. 1 z2 ?/ }, {/ V" G) x
- o" U5 x6 O' L, W# x# j' S
7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题. + B2 k. o# r+ A1 O. R" `* v2 n' | & t0 K* Q6 H6 E; ]8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。 ' ?+ F9 R2 I% W/ ~" V9 r: l7 I
- x8 ]; n8 |) P7 Q4 k* k" I
9. 撰写思路分析,注释. + A2 ^$ Y0 `7 P- p, G' k. N: m, `4 F! X p# `
! ?' I* z F: E; b9 E6 c% |9 Y对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说出上面的一些经验,仅供大家参考和讨论。 3 I. n) Q$ [5 S8 q" J( `
4 @+ p3 F' P6 P1 ]5 M: r
' I U4 x: _ E! t关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy. AI is a broad topic, consisting of different fields, from machine vision to expert systems. The element that the fields of AI have in common is the creation of machines that can "think". - ~$ s' p$ {! k
这门学科研究的问题大概说有: 0 w% M5 n& @/ J3 l. x 4 I: R% ~+ k2 A(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规则,语意网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具 2 N+ X& p2 L0 F. y
7 i- \$ j+ [! M6 i# V2 |; Z4 R(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线上升,神经网络可能是解决人工智能的唯一途径。 ( |& X! Y* e* w6 J! X
: T4 [& N. C; H9 S
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博士的著作《人工鱼-计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛! 4 P/ w# _" Y2 U6 m+ Z" U$ u6 T ) y# A( ]2 I+ Z+ c0 A3 { M* w' L; i' T; z关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。 6 C9 z& ]" _3 w$ K. n2 x/ s
$ A% H- x. U8 R8 x
, U, I2 h. o. } @6 u* |0 k. G我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。 % Q8 H6 `% p" `" } K
R4 k5 p! W- y+ m
( i1 T* v+ ~0 a1 ~( S总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭师范学院王爱平教授曾经对我说过这样一番话:“当你选择了计算机这一门科学,就意味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向前走,不能往后退。” 9 ]" e$ Z" ~ T0 m0 H8 n# H ; w+ ], m: F' x7 _6 ^; R, q2 Y U0 ^: c
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努力去干吧! : ^1 x: a6 M5 o5 t4 o* \9 F
' x( x4 f& i# B3 @ A
: u1 N# ?! u, X+ ?( K
必须结束这篇“胡侃”了,再侃下去非我力所能及。其实计算机还有很多基础课都值得一侃。怎奈我造诣有限,不敢再让内行耻笑。最后声明:这些只针对本科阶段的学习。即使把这些全弄通了,前面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具有的素质。最后送大家一句话“Wake up every day with a feeling of passion for the difference technology will make in people's life!”。 : p$ j3 {* ~! Z* q& z" W0 X 1 }. V' u) i c. ~' }+ Z% p1 X在我大一时无意中找到了南京大学网友sir的帖子“胡侃(理论)计算机学习”,这个帖子对我的大学学习起了至关重要的作用,写这份材料时也引用了其中的不少观点。再有就是每次和司徒彦南兄的交谈,都能从中学到很多东西,在这份材料中也有很多体现。以及每次在放飞技术网上每位同学诚恳的留言。这份材料是我原来在实验学院进行新生入学教育的讲稿之一,原有基础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内容结合我国的教学情况和我们学习的实际情况进行了重写。这里所作的工作也只是将各位学长和同学们的学习体会以及我在学习计算机科学时的所思所想汇总在一起写了下来,很不成熟。目的就是希望能够给一些刚入学或者是学习计算机科学还没有入门的同学以一些建议。不期能够起到多大的作用,但求能为同学们的学习计算机科学与技术带来微薄的帮助。希望大家批评指正。 </TD></TR></TABLE>