- 0-?课程
- 1-?OJ
- 2-?视频
- 3-?讨论区
-
[Q0-02]我并没有良好的C\C++编程基础——我平时比较习惯使用Java\Python\C#\Matlab\Lisp……我能学好这门课吗?
[A0-02]正如课程简介页面上所指出的,DSA需要兑现为具体的语言,但并不唯一地依赖于某一特定语言。正因为此,课程内容中也会涉及很多其它的语言(Java/Python/Perl/Ruby/...),它们之间的相互比较,对于我们理解DSA很有帮助。这也属于我们在课堂上,着重强调的拓展内容之一。因而对于这个问题,答案是肯定的。
但是非常遗憾地,因为我们的资源限制,我们在编程作业上也只能忍痛割爱,在OJ上以统一的编译、运行环境进行测试,因而对于C\C++的编程基础,我们还是有一定的要求:事实上在数据结构中也只是会用到部分的特性(比如C++里的类模板)。主要是能够使用就行了,只要学一些过基本的内容问题应该不大。
-
[Q0-05]能详细解释一下什么是课后测验,什么是编程习题吗?
[A0-05]- 课后测验是我们对于学生对课程掌握程度的一种过程性评价,平均会在每章左右的时候放出一次,每次10道客观题,需要在规定的截止日期前作答。
- 编程习题则是由我们课程特色所决定的的一种习题形式,会与OJ http://dsa.cs.tsinghua.edu.cn/oj/ 绑定,请以自己注册edx的邮箱注册到该平台,我们会自动把OJ上的成绩同步到edx上。
-
[Q0-06]那么对于这门课的学习,老师您是怎样定位的?从这门课中,我们能够对数据结构掌握到怎样的程度?如果我的基本功比较薄弱的话,我是否适合学习这门课?
[A0-06]数据结构与算法(依然简称DSA)是个非常开放的专题,学习过程没有终点,任何一门课程都不可能穷尽。然而有意思的是,反过来,它的学习过程也是分阶段逐层递进的。一门好的此类课程,应该可以让不同背景、不同基础、不同目标的学习者有一定的选择余地,这也是我们设计这门课的重要标准之一。
我喜欢将DSA比作汽车。
熟悉基本的数据结构的基本功能与使用方法,犹如拿驾照会开车能上道。
懂得不同DSA之间的差异及其适用场合,懂得针对问题需要选取适当的DSA,犹如懂得如何选购适宜于自己的汽车。
懂得对DSA做适当的裁剪、扩充和改造,并优化组合,犹如玩车的行家里手,有DIY的能力和乐趣。
探索DSA的优化极限,能够完成从内部优化到外部封装的整个过程,则是设计师与工程师的任务与要求。因此只要定位清楚,心态平和,一些基本功相对薄弱的学生学习DSA是完全可行的。我讲授的另一门课程《计算几何》是面向本专业研究生的,但我对自己的要求却是,(在以上第一、二个层面上)要让高中生能听懂。如果实在遇到不能很快弄懂的,不妨直接跳过。好在,我会尽力使用初等的方法,并将相关的结论简明扼要地概括出来,如不愿推敲,先记下就是了,并不影响你继续前行。
最后,数据结构是典型的大学学习模式,不像中学,所有知识点都须面面俱到。学习的过程中,应更加关注自己“学到了什么”,而不是“什么还没学”。尽早地接触这种学习模式,相信对你日后的大学学习必有裨益。
-
[Q0-08]这门课对应的教材应该在哪里获取?有没有对应的源代码?
[A0-08]教材和配套习题解析可以在页面上方导航栏中的对应版块在线阅读
本课程所涉及的几乎所有代码,均以Visual Studio解决方案的形式汇编打包,共含50多个示例工程。读者可通过以下页面上的“示例代码”链接直接下载: http://dsa.cs.tsinghua.edu.cn/~deng/ds/dsacpp/
解压缩后,可在VS2008中打开dsacpp.sln,然后选择对应的工程、编译、运行。
-
[A1-00]?OJ是Online Judge(在线评测)的缩写,本课程的编程作业(占总成绩的40%)需要在该系统(http://dsa.cs.tsinghua.edu.cn/oj/)上自动评测。也就是你需要用同样的邮箱在OJ系统上注册并根据课程进度要求提交作业源代码。
-
[A1-05]对于"Wrong Answer": 请首先检查自己的程序是否符合题面的输入、输出格式要求,不要在输出里加多余的东西。因为系统会用给定的输入运行你的程序并将输出与正确答案比对,多余的输出会导致比对失败。
对于"Runtime Error": 该问题是由于程序执行过程中产生了未处理的异常。比如整数除以零(1/0)、assert失败、访问到了非法的内存等等。请进一步调试自己的程序。需要注意的是,main函数必须以“return 0;”结束,如果返回值非0,也会被认为是Runtime Error。如果保证返回值为0并且希望知道OJ返回错误代码的含义,可以参考 http://unixhelp.ed.ac.uk/CGI/man-cgi?signal+7。常见的是8除0错和11内存访问错误。对于"Exceed Time Limit"和"Exceed Memory Limit": 程序运行超时和程序使用的内存超过限制,请从算法和编码两个角度进一步优化自己的程序。
-
[Q1-06]那么可以给一些调试建议吗? 对于OJ我还有更多的问题。
[A1-06]事实上,“程序在我的机器上跑通过了”是个很不严格的说法,更严谨的说法是“程序在我的机器上用我的测例跑没出错”
而把程序放在OJ上跑的时候,OJ的测例则必然会与你的测例有不同之处——它可能有更庞(bao)大(li)的测例,也可能会是一些边(e)界(xin)测例。吾日三省吾身:边界情况未考虑乎?(Wrong Answer/Runtime Error)内存装不下乎?(Exceed Memory Limit)跑太慢乎?(Exceed Time Limit)
对应于后两种情况,优化是程序进步的阶梯,可能你需要一个更好的算法,也可能你的算法已经不错,只是差一个漂亮的实现。而对应于第一种情况,建议你测试更多测例以找出错误,事实上测试数据的构造也是课程训练的环节之一。我们也鼓励同学们互相交换测例以防微杜渐。
-
[Q1-07]把代码提交到OJ上编译测试好麻烦,我应该如何在本地构建尽可能接近于OJ的测试环境呢?
-
[Q3-01]看见讨论区很多人能够打出漂亮的代码和公式,他们是怎么做到的?
[A3-01]在讨论区的讨论,我们使用的是Markdown语法,详情可以参见Markdown语法说明。特殊地,对于公式的输入,我们使用类似于如下的方式进行书写:
\begin{equation}\ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \end{equation}
,效果如下:
-
[Q3-02]我有问题想要咨询老师和助教们,他们什么时候会出没在讨论区?
[A3-02]北京时间每天晚上22:00-23:00是我们的集中答疑时间,我们将会在这一时间段内集中回答讨论区内的问题。如果同学日常生活比较繁忙,可以选择在这一时间段到讨论区查阅回复,而不必一直刷新讨论区页面“在线等,挺急的”。