计算机科学中最困难的学科/理论?[关闭]


17

您学习过哪些最困难的CS学科/理论,但对该领域来说很重要?原因是什么?


3
我认为这在很大程度上取决于学习该学科的人和进行授课的人
Mahmoud Hossam 2011-2-8

Answers:



35

老实说,编译器的构造!


13
+1编译器是最困难和最有价值的。
Dietbuddha 2011年

3
它在那里完成了最多的工作,并且做好了良好的编码准备,但是我认为这并不那么困难。不使用YACC或我们使用的任何工具,可能会更难,我不知道。
彼得·特纳

4
编译器实际上仅是困难的,因为大多数理论都可以追溯到严重的硬件限制时代,而且许多形式化的指令还没有超出此范围。看一下“ 让我们构建一个编译器”,以了解如果您从另一个角度进行编译,编写编译器将变得多么容易。
梅森惠勒

1
@Martin York,作为编译器作家,我认为实施编译器的复杂性被严重高估了。通常,编译器比解释器简单得多。我怀疑这是一本龙书,应该怪它,他们提出了最简单的方法来做简单的事情,而对最不重要的步骤(即解析)却过于关注。
SK-logic

1
@Martin York,不管源语言多么复杂,都有使AST尽可能简单和可维护的技术。还有许多非常简单但功能强大的技术可以使编译的各个阶段变得无关紧要。
SK-logic

22

算法设计与分析

我认为这个问题取决于您的老师,以及您的职业如何组织该科目。

分析算法可能会像有人想要的那样困难。考虑到存在未解决的问题,不仅是:无法解决的问题。

问题是您可能遇到问题,如果您知道无法解决,那就太好了。但是,如果不这样做怎么办?您可能需要花费大量时间来证明它是NP-Complete,或者试图找到一个多项式时间解决方案来解决它。

证明NP的完整性并不容易。是的,已经知道了很多问题,但是要做的是找到减少点以证明它是NP-Complete。如果您花费大量的时间/天/月来演示它,并且可以在多项式时间内求解,该怎么办?:)

还有其他科目,例如编译器组论原始递归函数,可能会像科目计划或老师所希望的那样困难;)


1
s / Analysis / Analysis ...否则,正是我所想的...原始递归函数,哇!
菲利克斯·唐贝克

同意,我对自己的学士学位感到困惑,从未对自己曾经成功地“证明”过任何东西充满信心(尽管由于教授,我的算法课太简单了)
Peter Turner

这些天,我将向您展示算法的难度:)
Oscar Mederos 2011年

18

模式识别,即人工智能。这是指智能计算以及其他模式识别工具,例如光学字符识别,语音到文本,面部识别等。

您可以使用计算机执行或希望通过计算机执行的许多“很酷”的事情都依赖于这些算法,并且数十年来,我们一直在尝试对其进行完善,但并未取得很大的成功。


很难,因为这不是确定性的。开发良好的AI模式识别需要对要使用它的每个应用程序进行实验,以确保您选择正确的算法,正确的功能等...
Ken Bloom

1
我才刚刚开始爬这座特殊的山峰(模式识别)。这个很难(硬。很多数学。巨大,巨大,令人生畏的数学堆,凝视着我,敢于进入。
David Poole

好吧...模式识别也可以看作是应用统计数据,这不仅是CS范围内的问题
Aggietech

12

我的选择是可计算性理论

(嗯...也许那不那么重要,但是肯定很困难)


2
我同意,我个人将其概括为en.wikipedia.org/wiki/Theory_of_computation
Matt H

我同意计算理论很难,但这也是我最喜欢的学科之一。当然,我是数学专业的双主修...
Poindexter

+1我也双修。我可以介绍这些内容,但可以是研究生版本……很高兴我放弃了它!
工作

很难,不是我们对此了解太多,没关系。
显示名称



6

密码学

如果您做的有点错误,则可能使公司损失数百万美元。


尽管越来越流行,但Crypto并不是软件独有的。
JBR威尔金森2011年

加密并不难。问题在于安全性无法轻松测试,因此只有在有人入侵您时,您才会注意到自己的错误。但是缺乏可测试性适用于大多数形式的IT安全性,而不仅仅是加密技术。
CodesInChaos

4

操作系统,尤其是与线程相关的部分。

原因不是因为很难让5位哲学家用叉子吃披萨。原因是因为编写多线程代码本身就很困难,而且对于人类(至少是男性-据我的妻子来说,是男性)计算起来并不容易。


9
然后让您的妻子编写多线程代码:)

3
请记住,当涉及到共享内存多线程时,计算机就像是偷偷摸摸的小猪,它可以帮助您。在处理多核处理器时,无疑是这样。一个核心可能会分散您的注意力,使您分心,而另一核心可能会落后于您并向后刺您。
Donal Fellows,

3

我也投票赞成Compiler Design。特别是在DFA和NFA部分进入的地方。关于NP问题和内容,我也不太清楚。


是的,如果我不首先学习计算理论,那我在编译器方面就很难过。
彼得·特纳

DFA和NFA是鸡饲料。等待直到您必须执行LALR(1)解析。
David Thornley

3

排队论

从技术上讲,这是数学的一个分支,但在CS中具有很高的相关性。

CS中的几乎所有内容都基于队列(可见(明显)和不可见(不太明显或隐含))。

在CS的早期,队列很明显。
程序队列(每个程序都有一副纸牌)。

如今,队列并不那么明显。例如,互联网:一个分组交换网络,但是分组形成队列,路由分组是队列最小化的一种形式。


嘿! (?您是(Lisp程序员)
Mark C

不是(尽可能(一个人(见),但是(它已经(被知道))。发生))。
马丁·约克

3

数值分析

您在课程中遇到的玩具问题并不难,但是一旦您开始考虑实际问题,就会变成繁重的工作。


2

当客户真的不知道他们想要什么时,解释客户的需求。这不是大学教授的,是拥有的最基本的技能之一。


1
我不确定我是否同意这是计算机科学的概念。我也看不到如何使用科学方法解决它。
jmort253

@ jmort253-的确如此,但是计算机科学试图(以我的观点未成功)使用正式的设计和验证方法来研究该领域。
mouviciel 2011年

我同意这不是一个“计算机科学”的概念,但是当我开始我的职业生涯时,我并不知道/根本没有意识到客户不知道自己想要什么。我认为所有软件项目都带有某种形式的正式需求文档。也许是软件工程课程的演讲主题(也许我的大学没有涵盖)?
史蒂文·斯特里加

1

我个人是形式逻辑。一开始很难,但是一旦您制定了规则并设法充分运用它,您的大脑就会Logic++;,这在开发中是一件非常好的事情。

附带说明一下,我直接回答了这个问题-毕业时这绝对不是最难的科目,但它可能是最难的“现实生活适用”科目。


形式逻辑是我与爱恨交加的关系。我喜欢思考这些概念,但是直到后来遇到需要逻辑思考的现实问题时,我才明白它对我的帮助。
jmort253

@ jmort253-对我来说真的一样。我什至挣扎着以为自己会失败,经过漫长而艰苦的研究,直到它最终击中了我的脑袋。在那之后,好处是惊人的。
凯尔·罗曾多


1

内核设计有人吗?好吧,我真的不知道它是如何完成的,以及操作系统的目标功能是什么,但是对我而言,考虑设计内核是一项艰巨的任务。

我也考虑计算机安全 ; 我当然不知道是什么使系统不安全,除了明显的缓冲区溢出,XSS和SQL注入。

我不确定,但是似乎有些算法也不安全。查看MetaSploit项目,其中列出了所有类型和种类的安全漏洞:您可以看到程序存在很多漏洞的方法。


1

该领域有许多棘手的话题,但是我选择的那些持久存在的难题是涉及Global System Properties的。此一般主题的示例包括:

  • 安全无死锁的多线程
  • 安全

这很困难,因为您追求的是只有在一切正确的情况下才存在的事物。你需要一个全球性的系统属性,但几乎所有可用的工具(以及所有的那些规模,在我的经验,真正的问题),只有真正做局部推理。这是从对程序的各个部分进行推理到整个整个工作过程的过程,这很困难,尤其是因为完全有可能使各个部分本身都是正确的,但由于组件的排列不正确,仍然存在细微的错误;错误可能是不希望出现的特征...


0

管理信息服务 在我上大学期间,我每学期只有一个管理科目,这使我非常生气。
强硬!诸如Compiler DesignOS Design等主题很艰巨,但它们确实很有趣且充满挑战。我真的搞砸了诸如管理信息系统/服务之类的主题,因为它们充满了无聊,并且您必须经历很多理论。


2
因为他们在谈论每个系统的概念上的复杂性而感到无聊,而一半的人却从未亲自编写任何系统(但是他们确实使用了各种各样的系统)。此外,开创性语言使用了很多已加载的单词,但却无法提供简单的英语实例。像决策支持系统一样……您不能只丢掉一些Google Analytics(分析)报告的屏幕截图,即FML,只是为了让学生在同一页面上,然后才开始在观众面前出现智力高潮。
菲利普·杜帕诺维奇(FilipDupanović),2011年

0

如果您使用的是C / C ++,则指针是最重要的概念。但是以某种方式,我从未在大学里完全理解它。


12
真?我的意思是,每个人都是不同的,但是我认为有很多(我的意思是很多)主题比指针更难。例如,计算机的体系Assambler,在某种程度上都涉及到指针 ;)
奥斯卡Mederos

的确如此,但是您会发现通过汇编器更容易地理解内存引用,因为您实际上使用的是原始指针,而在C / C ++中,您使用的是对指针的引用,这只会使人们感到困惑,因为从来没有直言不讳地谈论抽象关于。
菲利普·杜帕诺维奇(FilipDupanović),2011年

2
阿assambler,最好的程序员的茶
马特·艾伦

那个家伙问的主题很困难但很重要,因此很重要。
Manoj R

@Matt:您刚刚度过了我的美好时光:D @Manoj R:如果仅将指针视为数组访问,那么这些指针将是微不足道的。还是数组访问困难?
back2dos

0

算法设计与分析。并不是说很难理解和分析已知算法,而是为困难的问题设计和分析新算法很困难,并且需要对许多领域有广泛的了解,并需要运用多种不同的技术进行实践。




0

您学习过哪些最困难的CS学科/理论,但对该领域来说很重要?

离散数学。

这很困难,因为这些理论之间的联系非常松散,但它们却在CS中使用。我想太多了...

通过归纳证明,大O证明,递归,除法运算,图论,等等等等。

对我而言,编译器很容易,因为我们必须采用自动机理论。^^


0

在大学时,Z表示法/形式方法曾经伤害过我的大脑。主要是因为我讨厌它。当您享受自己所做的事情时,辛苦会容易得多,而当您不喜欢时,辛苦就容易得多。


0

我喜欢您的答案(而且我也不会忘记投票),例如编译器,内核等,但是大多数程序员从未遇到过这些问题。有一个更简单但更常见的问题:并发 -线程,锁定。如果我们在并发体系结构中甚至犯了一个小错误,编写一个产生魔术错误的程序也很容易。

因此,我说,这不是计算中最困难的问题,但是由于它是常用的,所以这是一个危险的问题。


0

面向对象编程

可能是因为我不肯使用FORTRAN和APL,但是多年来,我一直在努力从严格的过程语言转换为对象。所谓的“专家”撰写有冲突的文章和教程并没有帮助他们了解面向对象的含义以及构建面向对象程序的最佳/正确方式。

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.