Questions tagged «education»

有关学习计算机科学学科和CS教育的一般问题

13
如何愚弄“尝试一些测试用例”启发式算法:看起来正确但实际上不正确的算法
为了尝试测试某个问题的算法是否正确,通常的出发点是尝试在多个简单的测试案例上手动运行该算法-在一些示例问题实例(包括一些简单的“拐角案例”)上进行尝试”。这是一种很好的启发式方法:这是一种快速清除算法中许多错误尝试并了解为什么该算法无效的好方法。 但是,在学习算法时,有些学生很想停在这里:如果他们的算法在一些示例上都能正常工作,包括他们认为可以尝试的所有极端情况,那么他们得出的结论是算法必须正确。总是有一个学生问:“如果我可以在几个测试用例上尝试一下,为什么我需要证明我的算法正确?” 那么,如何欺骗“尝试一堆测试用例”启发式方法?我正在寻找一些很好的例子来表明这种启发式方法是不够的。换句话说,我正在寻找一个或多个算法的示例,这些示例从表面上看可能是正确的,并且在任何人都可能想出的所有小输入上输出正确答案,但是该算法实际上在哪里不起作用。也许该算法恰好在所有小输入上都能正常工作,仅对大输入失败,或者仅对具有异常模式的输入失败。 具体来说,我在寻找: 一种算法。该缺陷必须在算法级别上。我不是在寻找实现错误。(例如,该示例至少应与语言无关,并且该缺陷应与算法问题有关,而不是与软件工程或实现问题有关。) 有人可能会提出的一种算法。伪代码应该看起来至少看起来是正确的(例如,混淆或明显可疑的代码不是一个好例子)。如果这是某些学生在尝试解决作业或考试问题时真正想到的一种算法,则可加分。 通过概率较高的合理手动测试策略的算法。手动尝试一些小型测试用例的人应该不太可能发现该缺陷。例如,“手动模拟十二个小型测试用例的QuickCheck”应该不太可能揭示该算法不正确。 优选地,确定性算法。我已经看到许多学生认为“手动尝试一些测试用例”是检查确定性算法是否正确的合理方法,但是我怀疑大多数学生不会认为尝试几个测试用例是验证概率的好方法算法。对于概率算法,通常没有办法判断任何特定输出是否正确。而且您手头不足以对输出分布进行任何有用的统计检验。因此,我宁愿专注于确定性算法,因为它们更清楚地了解了学生的误解。 我想教导证明算法正确的重要性,并且希望使用一些这样的示例来帮助激发正确性的证明。我希望那些相对简单并且可以被大学生使用的例子;需要重型机械或大量数学/算法背景的示例不太有用。另外,我也不想使用“非自然”的算法;虽然构造一些怪异的人工算法来欺骗启发式方法可能很容易,但是如果看起来很不自然,或者构造了明显的后门只是为了欺骗这种启发式方法,那么它可能不会使学生信服。有什么好的例子吗?

9
微积分如何/何时用于计算机科学?
许多计算机科学程序需要两个或三个演算类。 我想知道,计算机科学如何以及何时使用微积分?计算机科学学位的CS内容倾向于侧重于算法,操作系统,数据结构,人工智能,软件工程等。在某些情况下,微积分在计算机科学的这些或其他领域中有用吗?

5
学习用于同一目的的不同算法/数据结构的原因是什么?
自从我是一名本科生以来,我一直在想这个问题。这是一个普遍的问题,但我将在下面详细说明。 我见过很多算法-例如,对于最大流量问题,我知道大约3种算法可以解决该问题:福特-富克森(Ford-Fulkerson),埃德蒙兹-卡普(Edmonds-Karp)和狄尼克斯(Dinic),其中狄尼克斯具有最高的复杂性。 对于数据结构(例如堆),有二进制堆,二项式堆和Fibonacci堆,其中Fibonacci堆具有最佳的整体复杂性。 让我感到困惑的是:我们有什么理由需要全部了解它们吗?为什么不学习并熟悉最好的复杂性呢? 我知道这是最好的,如果我们都了解它们,我只是想知道是否有任何“更有效的”原因,例如某些问题/算法只能通过使用A而不是B来解决,等等。

14
如何向父母解释我学习编程语言?
我目前正在完成计算机科学硕士学位。我对编程语言特别是类型系统感兴趣。我对这个领域的研究很感兴趣,下学期我将开始对该主题的博士学位。 现在这是一个真正的问题:我该如何向(以前)对计算机科学或相关领域没有知识的人解释自己的意愿? 标题来自以下事实:我什至无法向父母,朋友等解释自己的所作所为。是的,我可以说“重点在于帮助软件开发人员编写更好的软件”,但我认为这并不是真正有用的:他们不了解“编程”,他们不了解它的含义。感觉就像是我对中世纪的某人说我是一名汽车修理工:他们根本不知道我在说什么,更不用说如何改进它了。 有没有人与现实世界有很好的比喻?启发性的例子引起“啊哈”的时刻?我是否应该向60岁以上没有计算机科学(也没有学术经验)经验的人展示一段简短的代码?如果是这样,我应该使用哪种语言?这里有人遇到过类似的问题吗?

13
为了使他们对计算机科学产生兴趣,我应该如何应对一堆16-17岁的年轻人?
几周后,我将在我的大学参加某种“开放日”活动。作为这段时间的一部分,我(和同事一起)被给了一大堆高中生两个小时的时间,以及一个足以容纳所有人的计算机实验室,我必须做一些与他们一起进行的一项或多项活动,以鼓励他们学习计算机科学(理想情况下在我的大学,但总体上也是如此)。我绝对不知道该怎么做,欢迎任何建议。
40 education 

7
解释算法渐近复杂度与算法设计实践的相关性
在算法和复杂度中,我们关注算法的渐近复杂度,即,随着输入大小达到无穷大,算法使用的资源量。 在实践中,需要一种能够在有限(尽管可能非常大)实例数量上快速运行的算法。 在我们感兴趣的有限数量的实例上在实践中运行良好的算法不需要具有良好的渐近复杂度(有限数量的实例上的良好性能并不意味着关于渐进复杂性的任何内容)。类似地,具有渐近复杂性的算法在实际中对我们感兴趣的有限数量的实例(例如,由于常量较大)可能无法很好地工作。 为什么我们使用渐近复杂性?这些渐近分析在实践中如何与算法设计相关?

6
计算机如何工作?
我多年来一直是计算机迷。我可以使用多种语言进行编程,甚至可以构建它们。前几天我和一个伙伴坐在一起,问一台计算机实际上是如何取电并用它来做点什么的,而我们只是想不通,谷歌也帮不上什么忙。 我的意思是,计算机如何持续吸收电流并将其变成1和0,然后实际上对那些1和0进行处理,例如打开灯15秒钟? 我了解门(AND,OR,NOR,NAND,NOT)以及有关二极管,电阻器和晶体管的一些知识,但是我认为这是用真正的外行术语解释的理想场所! 有人能指出我正确的方向还是给我一个简短的解释?

13
选择第一门编程课程的语言的标准
作为大学水平的CS教育者,在第一门编程课程中要教授哪种编程语言经常会引起讨论。有成千上万种语言可供选择,许多宗教狂热(或崇拜)支持一种语言阵营高于另一种语言阵营。所有围绕每种编程语言的主观偏见使教育工作者很难选择一种语言。 我的问题是: 教育者可以使用什么客观标准来选择编程语言作为大学一年级编程课程的基础?这些标准的依据是什么? 注意:我不想看到编程语言的列表以及为什么它们是最好的使用语言。问题不是关于最佳语言,而是关于选择语言的标准。但是,答案可能是使用编程语言来说明特定点。 这个问题的灵感来自另一个被认为是题外的问题:https : //cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language。

2
关于“论真正教计算机科学的残酷”
迪克斯特拉(Dijkstra)在他的论文《关于真正教授计算科学的残酷性》中,提出了有关编程入门课程的以下建议: 一方面,我们教看起来像谓词演算的事物,但与哲学家却截然不同。为了训练新手程序员如何使用未解释的公式,我们将其更多地讲授布尔代数,使学生熟悉逻辑连接词的所有代数性质。为了进一步切断与直觉的联系,我们将布尔域的值{true,false}重命名为{black,white}。 另一方面,我们讲授一种简单,干净,命令式的编程语言,以跳过和多重赋值作为基本语句,具有局部变量的块结构,以分号作为语句组合的运算符,一种不错的替代构造,一种不错的方法。重复,以及(如果需要)过程调用。为此,我们添加了最少的数据类型,例如布尔值,整数,字符和字符串。至关重要的是,无论我们引入什么内容,相应的语义都是由附带的证明规则定义的。 从一开始,贯穿整个过程,我们强调程序员的任务不仅是编写程序,而且他的主要任务是提供形式证明,证明他提出的程序符合同样正式的功能规范。在设计证明和程序的同时,学生有充分的机会利用谓词演算来完善自己的操作敏捷性。最后,为了向人们传达这种入门编程课程主要是形式数学课程的信息,我们发现有问题的编程语言尚未在校园内实施,因此可以保护学生免受测试其程序的诱惑。 他强调这是一个认真的建议,并概述了各种可能的反对意见,包括他的想法“完全不现实”和“太难了”。 但事实证明,那只风筝不会放飞,因为事实证明是错误的:自80年代初以来,每年都有数百位大学新生成功地参加了这样的入门编程课程。[因为根据我的经验,说这一次是不够的,所以前一句话至少应再重复两次。] Dijkstra指的是哪门课程,并且还有其他文献可以讨论吗? 这篇论文发表于1988年,当时Dijkstra在德克萨斯大学奥斯汀分校的时候,这可能是一个线索-他们托管Dijkstra档案,但馆藏很大,我特别想听听其他人对这门课程的兴趣。 我不想在这里讨论Dijkstra的想法是好的还是现实的。我考虑过将此内容发布在cstheory.se或cs.se上,但因为在这里定居下来,是因为a)一个教育工作者社区可能更容易有人可以轻松回答,并且b)Dijkstra本人强调他的课程“主要是形式数学。” 如果您不同意,请随时举报迁移。

8
成为一个不了解计算复杂性的程序员是否有问题?
我在大学里分配了一个练习。我把它带回家并尝试编写一种算法来解决它,我想这与图有关,可以找到连接的组件。 然后,我想到了最琐碎的事情,然后告诉我的讲师。经过简短的观察,他认为我的解决方案的运行时复杂性是不可行的,并显示出一些更有效的方法。而且有一种传统的程序员不知道什么是计算复杂性(我就是其中之一),所以如果程序员不知道什么是计算复杂性会存在问题吗?

9
解释计算机科学和计算机素养之间的区别
用什么很好的比喻或例子向英语专业解释经典计算机科学与“善于使用MS-Windows”之间的区别 计算机科学 电脑编程 使用电脑 3完全不同的事物。大多数人甚至不知道什么是计算机科学。他们只看到“计算机”一词。因此,“他是计算机科学专业”可以解释为“他可以连接我的打印机”。还是说他“擅长电脑”。几乎没有人知道计算机编程和计算机科学之间的区别。 计算机科学是计算理论。无需实际计算机即可学习CS。CPU微型架构。如何对数字进行排序,如何遍历列表等。状态机。算法,big(Oh)等。如何设计编程语言或编译器。 编程是使用计算机科学家创建的语言和编译器来编写代码并创建应用程序。 最后,使用计算机(使用GUI,鼠标和键盘,Internet,MS-Office等) 然而,这三者被外行互换使用。 什么是向英语专业解释经典计算机科学与“擅长使用MS-Windows”之间的区别的好比喻或示例?或者简单地,一个真实的计算机科学与MS-Windows无关的精妙示例。

7
为什么我们需要汇编语言?
我们主要用高级语言编写程序。因此,在学习期间,我遇到了汇编语言。因此,汇编器将汇编语言转换为机器语言,而编译器对高级语言也是如此。我发现汇编语言有指令,如move r1 r3,move 5等等。这很难研究。那么为什么要创建汇编语言呢?还是比高级语言更先出现的汇编语言?为什么在我的计算机工程课上学习汇编程序?

3
NP完整性教学-Turing减少vs Karp减少
我对如何最好地向计算机科学专业的学生教授NP完整性的问题感兴趣。特别是,我们应该使用Karp缩减还是Turing缩减来教授它? 我觉得NP完全性和约简的概念是每个计算机科学专业都应该学习的东西。但是,在教授NP完整性时,我注意到使用Karp约简法有一些缺点。 首先,对某些学生来说,减少Karp似乎不必要地令人困惑。减少的直观概念是“如果我有解决问题X的算法,那么我也可以使用它来解决问题Y”。这是非常直观的-但映射到Turing缩减比映射Karp缩减要好得多。结果,我看到试图证明NP完整性的学生因直觉而误入歧途,并形成了错误的证明。尝试教授这两种简化方法并强调Karp简化方法的这一方面有时会感觉有点像是不必要的形式主义,并且会占用不必要的课堂时间和学生的注意力,这似乎是无关紧要的技术细节;我们为什么要使用这种更严格的还原概念,这并不是不言而喻的。 我确实了解Karp缩减和Turing(Cook)缩减之间的区别,以及它们如何导致NP完整性的不同概念。我意识到,减少Karp可以使我们更好地区分复杂度等级之间的区别。因此,对于认真研究复杂性理论,减少Karp显然是正确的工具。但是对于仅学习此方法并且永远不会进入复杂性理论的计算机科学专业的学生来说,我不确定这种更好的区分是否对他们至关重要至关重要。 最后,作为一名学生,我记得遇到“重言式”之类的问题时感到困惑-例如,给定一个布尔公式,检查它是否是重言式。令人困惑的是,这个问题显然很难解决:任何多项式时间算法都意味着P=NPP=NPP=NP; 解决这个问题显然和解决重言式问题一样困难。但是,即使从直觉上讲重言式和可满足性一样难,重言式也不是NP难的。是的,我今天了解为什么会这样,但当时我记得对此感到困惑。(一旦我终于明白了,我的脑海便是:无论如何,我们为什么要区分NP-hard和co-NP-hard?这似乎是人为的,并且在实践中没有很好的动机。为什么我们专注于NP而不是从实际的角度来看,共NP硬度似乎与NP硬度在本质上具有相同的实际结果,所以为什么我们都对这种区别挂了钩?是的,我知道答案,但是作为一名学生,我记得这只是让这个科目变得更加神秘和缺乏动力。) 所以,我的问题是这个。当我们向学生教授NP完全性时,使用Karp归约法或Turing归约法更好吗?有没有人尝试使用图灵归约法来教授NP完全性的概念?如果是这样,情况如何?如果我们使用图灵归约法讲授概念,而跳过与Karp归约法相关的概念性问题,会有任何明显的陷阱或弊端吗? 相关:请参见此处和此处,其中提到我们在文献中使用Karp归约法的原因是因为它使我们能够区分NP硬度和共NP硬度。但是,似乎没有给出任何针对该能力是否对每个CS专业都应该学习的算法课程的学习目标至关重要的教学观点的答案。另请参见cstheory.SE上的此处,该讨论也有类似的讨论。


12
在不使用计算机的情况下如何教授计算机科学?
在世界上的某些地方,人们通常无法访问计算机(因而对计算机知之甚少),即使可以使用,硬件和软件也已过时,并且由于停电等原因而使使用受到困扰。也往往缺少对(好)书的访问。在这种情况下如何教授计算机科学? 我担心如果无法进行实验并运用所学知识,他们将根本无法学习(好),即使他们的动机非常强烈,并且将大部分时间都花在了这个爱好上。是否可以仅在理论上讲授CS?
21 education 

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.