算法设计和复杂性-如何以这种“方式”思考?


15

我的问题是一个普遍的问题:如何开始就算法设计和复杂性进行思考?我将选修算法设计研究生课程。我早些时候注册了它,但后来又放弃了,因为我跟不上它。我必须参加这门课程。

是否有以这种方式思考的“技巧”?我知道这是很粗略的说法,但有时以崭新的视角有助于以不同的方式思考一个主题。

我在本课程(和类似的理论课程)中遇到的主要问题是:我怎么知道我提出的解决方案是正确的?我发现理论部分是任意的,特别是当“证明”某种算法以某种方式起作用或表现时?

我们的课程将使用标准文本:CLRS算法简介。

是否有教科书/网站/书籍/等?可能提供一种在该领域变得自信的方法?

谢谢大家,

杰森·丹恩(Jason Dane)


2
我建议看一下这篇文章。我特别建议乌迪·曼伯(Udi Manber)的书。
MS Dousti

1
:在计算器上这种讨论提供了几个建议stackoverflow.com/questions/2256721/...
Jeffε

2
我赞同曼伯的建议。还检查了如何思考算法由杰夫·埃德蒙兹:amazon.com/Think-About-Algorithms-Jeff-Edmonds/dp/0521614104
Jeffε

“我怎么知道我提出的解决方案是正确的?” 您的意思是(1)您想出了一种算法,但不知道如何证明它是正确的,或者(2)您有一个证明,但不确定它是否正确?
Jukka Suomela 2011年

第一步:停止给出直截了当的答案,转而参考他人的解决方案。;)
拉斐尔

Answers:


18

我认为对于不熟悉这些学科的学生而言,算法设计计算复杂性课程总是具有挑战性,因为它们确实需要一定程度的数学成熟度和解决问题的能力。在我的第一本关于“计算复杂性”的研究生课程中,我的一个朋友获得了纯粹的数学学位,他告诉我他为自己感到惊讶,尽管该课程并不需要太多的数学背景(至少在课程大纲),实际上,这几乎需要他通过所有纯数学本科学位所获得的所有技能!

我发现通过阅读和进行Sipser的书中的练习,我最了解“方式”(当我第一次开始我的研究生学习时)。确保您进行练习,因为解决问题的能力和数学成熟度是您要学习的,而不仅仅是一堆事实或定义。

但是,Sipser的书仅适用于复杂性和NP完整性方面的内容,不足以替代CLRS书。CLRS本书的唯一问题是,它的全面覆盖优势可能会使其弱点,因为这本书对于学生来说可能看起来很吓人或不堪重负。因此,我的建议是,您应该真正去图书馆搜索有关算法的书籍,一本一本地浏览,然后选择最适合您的思维方式的书籍。再次不要忘记做运动!

对于算法,我个人建议以下书籍(除了Sadeq和JeffE所建议的书籍):

  • S. Dasgupta,CH Papadimitriou和UV Vazirani撰写的一本非常易读且精美的算法
  • 杰夫·埃里克森(Jeff Erickson)的杀手笔记(或书稿)。(由于JeffE不太谦虚地建议自己的笔记,所以我必须自己做。)

通常,每当您学习某种算法或数据结构时,如果某种程度上您的教科书中的论述对您来说不够清楚,那么最好的方法是在google上搜索该特定主题的讲义。在某些情况下,对同一事物的不同解释最终将为您提供完整的图片。至少,这就是我的工作方式。


8
+1为Jeff的杀手notes。我总是喜欢阅读它们。算法一词的阿拉伯书法非常漂亮。
Mohammad Al-Turkistany
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.