[转载]计算机科学与技术学生学习基础材料参考
计算机科学与技术学生学习基础材料参考
转发(原来的出处不详,抱歉):
这份材料是我在帮美国MIT的William Stallings博士翻译站点的时候的一部分内容,感觉对国内的学生帮助会很大。写给大家,希望能对大家有所帮助。材料中涉及的所有内容版权归原作者所有,收集信息的版权归William Stallings博士所有。
关于一些计算数学基础性的材料
Math Refresher:这个概论覆盖了你在高中学得很多东西,你可能已忘记。包括一些正弦和对数函数的基本的公式,一个关于 log 变化率的讨论,以及离散概率论基础,William Stallings编写,2002年2月8日更新。
Number Systems: 十进制,二进制,十六进制,包括了一个关于数制转换的讨论,William Stallings编写。
Queuing Analysis: 一个对计算机科学家非常重要的工具的实践指南William Stallings编写。
Theoretical Computer Science Cheat Sheet: 路易斯安纳州立大学Steven Seiden教授编写,10页的常用公式以及其他一些对计算机科学家很有用的信息,版本2.01,1999年9月编写。.
The Mathematical Atlas: 一个关于数学方面的非常大的文章收藏。每篇文章都对本学科,应用以及相关的领域和一些选择性的话题作了基本的介绍。这里还提供了很多讨论这些问题的详细材料,提供书籍下载和在线浏览两种方式。
Topics in Mathematics: 网上的数学资源链接, 按照话题组织在一起,,有关键字搜索功能。这个站点同时也显示了阅读这些材料所需的数学背景知识。
Math Tables and Formulas: Tables featured include 三角恒等式 ,推论, 不定积分,定积分,二项式系数及其公式, 这里还提供了一个搜索引擎以及到其他S.O.S站点和S.O.S数学讨论板的链接。
Math Reference Tables: 一个极好的提供下载数学资料列表收集。
Prime Mathematics Encyclopedia: 一个数学术语与概念的很丰富的收集。
How-To
How to Solve and Write Up Homework Problems: 来自巴尔的摩的马里兰州大学 Alan Sherman教授的有帮助的建议。
Advice on Writing Technical Reports: 这个也是Alan Sherman教授编写的。
Advice on Research and Writing: 关于如何去研究以及如何去有效的与人有效的交流的建议的收集 (主要是面对计算机科学家的)。其中包括了一些很好的链接。
Richard Felder's Student Handouts: 一些写给学生的有用的建议包括一些与考试相关的帖子。
How to Present a Paper in Theoretical Computer Science: 北德克萨斯州大学Ian Parberry教授编写 , 美国计算机协会自动机遇科技酸性理论专业组(SIGACT)2000年3月新闻。这是一个zipped postscript格式的各种计算机科学论文的写作指南。
How to Write an Abstract: 卡内基.梅隆大学Philip Koopman教授编写 。写计算机论文摘要的很好的建议。
William Strunk's The Elements of Style (1918 edition, online):虽然这份材料已经写了很久了,这份短小的名作对改善你写作风格所起的作用比一些较新的要大得多。
Online Resources for Writers: 在线写作资源的一些很好的链接的收集。
Writing Guide: 来自Henson学院一份很有用的总论性的论文写作指导。
Guide to Grammar and Writing: 极好的一份写作与语法的彻底的讨论,包括一些指南,链接以及 FAQ。
Efficient Reading of Papers in Science and Technology: 这个小册子来自一个神秘的作者,很值得学习一下。
How To Study 一个提供给学生如何学习的建议的网站
研究资源
Networked Computer Science Technical Reference Library: 一个国际性的,提供给非商业性使用的用户,从很多研究会和档案室收集来的计算机科学研究报告及论文集。
Computer Science Directory: 一个组织良好的计算机科学论文与算法的搜索。
Collection of Computer Science Bibliographies: 通过很多来源组织到一起的计算机科学的科学著作参考书目,涵盖了计算机科学的大部分内容。每月更新,已经有近一百万个参考书籍。
INFOMIME一个具有大学水平的提供给老师,学生以及研究人员的虚拟图书馆Internet资源。
Links for Computer Science Researchers 一个极好的链接收集。
其他丰富的资源
Dictionary of Algorithms, Data Structures, and Problems: 包括定义,问题分析,源代码样例,有些例子有动画演示。
Free Online Dictionary of Computing: 含有交叉引用的在线术语表。
Computer Related Acronyms: 在线缩略语表。
Acronyms and Abbreviations: 缩略语查找。
Association for Computer Machinery (ACM):我强烈建议每个计算机科学专业的学生都加入会员。
Institute of Electrical and Electronics Engineers (IEEE): 同上。
Numerical Prefixes: kilo, mega的两重含义及其他。
Conversion Factors: 这个文档提供了从英国度量衡转换到公制系统(SI单元)的方法。
Conversion Web Site: 转换器,单位和度量标准,数据表以及工具的一个收集。
Treasure Trove of Paper Summaries:由很多计算机研究生一起编写的,这份摘要是写作的很有用的指南,同时他们提供了一个如何写作报告,论文,书的很好的向导。
What the Professor Really Means
另外补充:下面是科大计算机系的师兄GoUSTC给新生的一点建议:
做计算机领域研究,最根本的就是数学和计算机理论方面的基础。先列些对于计算机研究来说相对比较重要也比较有用的,先不求全。
数学方面:图论,概率论(与数理统计),随机过程,组合数学,线性代数,高等数学,复变函数,代数结构,数理逻辑,等等。
计算机理论方面:算法设计与分析,可计算性理论与计算复杂度理论,通信复杂度理论,形式语言理论,等等。
假设大一同学没有相关基础,推荐从以下几本书读起。
1.科大王树禾老师的《图论》课本。图论非常有意思,而且不需要其它数学基础。同时,图论在教学和科研中几乎到处都会出现。
2.算法设计与分析,首推那本《Introduction to Algorithms》第二版,宝典级巨作,智慧的乐趣贯穿全书,还有很多很有挑战性的习题,1180页。啃完这本书,你就基本上解决了读研究生的算法理论基础问题了。国内好像已经引进发行了影印版了。如果一点计算机知识都没有,你可能需要先大概学一门编程语言,好有个感性认识,不需要精通,只要能够大概看明白教材中的那些极其简明易懂的代码就可以了。
3.组合数学、概率论、随机过程,可以先看看前面两个,对数学基础要求都不太高。概率论教材应该很多,科大的就不错。组合数学,以前我们用的是自编讲义,不知道科大现在有没有出版正式教材。如果没有,可以到书店里去找一本翻翻。
4.科大的《线性代数》教材,高中数学基础就可以开始学习了,同样用处广泛。
5.可计算性理论与计算复杂度理论,不需要什么计算机和数学基础就可以开始学习了。也比较有意思。不好说今后会有多大用处,这要看你今后是否从事这方面研究。但是至少可以帮助你更深刻地理解计算问题的可计算性和复杂度。有一本清华出版社影印发行的英文原版书,非常经典,也不厚,可惜暂时记不起来书名和作者了,等我找出那本书来再告诉大家,不急着先看这个。对抽象思维能力要求稍微高一些,但是非常有趣,找到感觉了一点不难。
6.通信复杂度理论,第一位华人图灵奖得主姚期智开创的学科,也不需要什么计算机和数学基础吧。这方面的教材,即使国外也不多,我一共只找到过三本,国内恐怕就更少了。如果没有中文教材,就用关键字communication complexity搜索一下英文教材,要是实在没有那也没办法。
关于计算机系双学位的一些东西 By hlliu
看到很多新生对双学位有疑问,我来说说我的经历,希望有所帮助。我选的是计算机系的双学位,大约包括以下课程:C++、数据结构、离散数学(图论等等)、操作系统、数据库、编译原理、人工智能、网络、图形学等等课程。其中个人认为比较要用心学习的是:C++、数据结构、离散数学(图论等等)、操作系统、数据库、编译原理、人工智能、网络、图形学。
几乎两年的时间在周六需要上课,有时周日也要上课和上机。期末考试平均比别人多考3门(不考虑补考重修的情况)。考试一般不太好考,不要指望混过去,否则只能在考场上看到试卷然后昏过去。
对出国申请有什么帮助呢?还是我的老话,如果不用心学,只有坏处。如果没有真才实学,想混到比如说校机器人队去然后拿着别人的成果去海外现眼,除了bs没话说。不过如果能把你的专业学科和双学位学科很好的结合,效果就不仅仅是简单的1+1=2了,很可能这就是以后道路的一个转折点。
双学位到底有什么意义,学完了就一定能够知道,好好的做这两个学科的融合,受益无穷。坚持到底吧。最后,祝大家在双学位的学习中一帆风顺。
发信人: honsrx(Timing~两矿一波)
标 题: 看到大家说课程,我也说一说我的感受 (2009年03月25日19:40:12 星期三)
大一的时候喜欢技术,有一阵子没日没夜的编程,做好玩的小东西,觉得技术上有太多的名词不懂,什么java啊,php啊,c++啊,python啊,linux的XX之类,在我眼里都是很牛很厉害的东西。
我那时挺愤青的,当然,愤的不是国家政治之类的,而是我们的课程表。大一大二用了一大半时间学习数学物理,应付没完没了的物理实验报告。我当时很怀疑我来科大是来错了,我是来学习信息科学的还是物理数学的?曾有一次报告会上,我还打断过一个老师,当场问他为什么大二的我感觉还没有找到计算机世界的大门?当时我的心里,有个现在看来很可笑但是那时很真实的印象:学信息科学的是it精英,以后的生活会衣着光鲜,满嘴名词,口袋里大把钞票,连做的工作都是像google这样有趣有影响力的;而数理工作者的生活则应该是像灰蒙蒙的旧照片里一样,秃顶,生活弱智,是没有钱没有魅力的geek。在这样的潜意识的影响下,从大学开始,我就和我以前喜欢的物理数学毅然分手,信息学才是我的新欢。那个时侯我眼中的信息学的内容,可以参见第一段。
基于这个想法,我的物理课数学课一直疲软,因为我觉得学个大概就行了。虽然分数不难看,但是真正理解了多少我并不用心并不在意。我继续进行着自己程序设计这份很有前途的职业,学习GUI,学习脚本,学着人家做漂亮的个人主页挂在服务器上。让我改变的是在大三上学期,那个学期我接触到一些paper,有一个讲coolstreaming原理的(最早的一个p2p视频点播),还有一篇讲无线网络中的网络容量的优化。我拿到coolstreaming那篇paper的时候,本来是准备把它当作一个分布式网络程序的架构来学习的,结果开篇几个定义和一连串的矩阵运算把我砸晕了。我当时记忆中的线性代数知识已经所剩无几。让我乘个矩阵可能还可以,其它的恐怕就不行了。我再翻几页,满篇都是求导求极限线性回归参数估计的种种奇怪符号。这看起来不像是计算机啊,倒像是以前看的物理书和数学书!我再找了老师上课说的其他几篇reference paper,完了,大部分是这样子啊。我顿时有一种进了洞房掀开红盖头发现娶错了人的感觉,那不是我高贵的老婆大人,分明是个撅嘴瞪眼的非主流啊。
为了以后的人生幸福,我毅然开始华丽丽转型。每天回去不开电脑,拿起线性代数、概率论、图论、运筹学,看书做题。这时候系统上过这些课的优势就体现出来了,基本上两天一本的样子,顺带着还看看别的书,交叉验证。当时还学算法,做acm,几十天下来,感觉把以前松松垮垮的数理基础很是压了压紧。这些天过得很充实,因为有很强烈的一直在进步的感觉。每天几乎都是带个数学问题睡着的,醒来时仿佛还能听到我的经验槽涨满又升一级的声音……有一次在地铁里(那个学期在香港交流),周围都是忙碌的人群,我就突然很有感慨。后来的日志写到,如果退休了,就去研究理论物理和抽象代数。
我们学的数学和物理是很有用的。计算机方面的很多课程依赖与这些基础的土壤。你不学习图论当然也能看懂匈牙利算法,你不学习概率也能记住ALOHA协议的效率是1/e,你不学习排队论也知道平均队长=到达率*平均等待时间……不可否认专业知识的重要,但较多较好的数学物理训练能够在很大程度上帮助你1)快速理解算法的核心思想;2)记忆专业知识;3)训练形式化定义和证明的能力和意识。
第一点和第三点很明白,第二点我想举一些例子,往专业的说。说说我自己感受到的:
- Universal Hashing/Perfect Hashing保证O(1)的访问时间,其理论依据是代数结构(威尔逊定理(的引理))。
- Google Pagerank排序算法有三种等价的数学解读:a.线性变换角度:特征值为1的特征向量;b.马尔科夫链的极限分布;c. 竞赛图里的Hamilton路。
- 素数判定的随机算法,代数结构(费马小定理)。
- 快速排序的分析,为什么随机选取pivot就能保证O(nlogn)?还记得1+1/2+1/3+1/4+....+1/n = O(logn)吗?
- 矩阵的原地转置,置换到可以分解成若干个不想交的轮换之积。
- Machine Learning: 线性回归,参数估计(极大似然估计),贝叶斯分析,牛顿迭代,梯度下降……你还能再数学点吗?
- 函数式语言,这个我接触的不多。但重要的特点是没有变量,所有的操作都是用递归函数定义的。大大减少了出错调试的开销。也许你会想这怎么可能编出程序呢?理论: 还记得图灵机的计算能力限于递归可枚举集合吗?
学习生活中这样的体会很多,现在只能想出来这么些。最近搜集了不少stanford和mit ocw的课程,感觉他们的课程设计很用心,例子很生动很“计算机”,让学生很有兴趣。除此之外,都是数学。现在很火的machine learning啊,data mining啊之类的,除数据库系统方面的描述,大部分内容也只是数学的马甲而已。“学习率”其实就是函数的梯度,“带宽”其实是高斯分布的标准差,所谓名词,大部分是这样的。对于找工作的同学来说,数学思维也很重要的。我面试百度时基本上大部分问题是和计算机关系不大的,主要是图论,概率这些内容。正因为cs和数学这样的重叠,经常还见到“is computer science science?”这样的讨论呵呵。
现在我大四了,呆在实验室里做毕设,虽然不是很忙碌,也是感受到了自己的变化。很难再有能像之前的3年那样一心一意学习基础理论的时光了。现在做研究也好,做项目也好,都有很多系统方面的问题需要了解学习和尝试,这些非常的花费时间和精力。每次忙很久挺累的还说不太清楚自己到底干了些啥,但是瞎忙也得忙啊。操作系统网络这些课程的内容在不断更新,并且随着经验的积累,大家的功力其实是差不多的。而数学这些基础的东西往往决定了以后发展的深度和广度。从大四开始,对不考研的同学来说,能够像大一那样静静坐下来看线性代数的日子很可能一去不复返了。不管是读研还是工作,有的是机会学习技术,但是静下心来学习数学物理的机会很少了。
我们这些人都是高中时候数学物理很好的,我相信大部分同学当时也是很喜欢它们的。我们科大的学生,心里应该有一个角落留给这些漂亮的精灵们。以上种种,个人见解,大家轻拍呵呵。