理论计算机科学什么时候有用?

时间:2008-10-24 22:00:55

标签: theory turing-machines halting-problem computation

在课堂上,我们了解了暂停问题,图灵机器,减少等等。许多同学都说这些都是抽象和无用的概念,而且知道它们并没有真正的意义(即,你可以忘记它们一次课程结束了,不会失去任何东西)。

为什么理论有用?你有没有在日常编码中使用它?

24 个答案:

答案 0 :(得分:27)

真实的故事:

当我从研究生院开始我的第一份编程工作时,那些拥有我工作的公司的人都是飞行员。在我被雇用几周后,其中一人问我这个问题:

  

阿肯色州共有106个机场。   你能写一个会这样的程序吗?   找到必要的最短路径   他们每个人都有土地?

我认真地认为他是根据我对旅行商问题和NP完全性的了解来测验我的。但事实证明他不是。他对此一无所知。他真的想要一个能找到最短路径的程序。当我解释说有106个因子解决方案并且发现最好的解决方案是一个众所周知的计算难以处理的问题时,他感到很惊讶。

这就是一个例子。

答案 1 :(得分:24)

答案 2 :(得分:21)

当然,这很有用。

想象一下开发人员正在使用模板引擎。你知道那种事......

Blah blah blah ${MyTemplateString} blah blah blah.

它开始时很简单,用一个厚脸皮的小正则表达式来表示替换。

但逐渐地,模板变得更加花哨,开发人员包含用于模板化列表和字符串映射的功能。为了实现这一点,他编写了一个简单的小语法并生成一个解析器。

变得非常狡猾,模板引擎最终可能包含条件逻辑的语法,以根据参数的值显示不同的文本块。

在CS中具有理论背景的人会认识到模板语言正逐渐变得图灵完成,并且解释器模式可能是实现它的好方法。

为模板构建了一个解释器,计算机科学家可能会注意到大多数模板请求都是重复的,一遍又一遍地重新生成相同的结果。因此,开发了一个缓存,并且在执行昂贵的转换之前,所有请求都通过缓存进行路由。

此外,某些模板比其他模板复杂得多,渲染时间也要长得多。也许有人会在渲染之前估计每个模板的执行情况。

但等等!!!团队中的某个人指出,如果模板语言确实是图灵完成的,那么估算每个渲染操作的执行时间的任务就是停止问题的一个例子!哎呀,不要那样做!

在实践中,关于理论的是所有实践都是基于理论的。理论上

答案 3 :(得分:16)

我最常用的东西:

  • 编写可以优雅扩展的算法的计算复杂性
  • 了解内存分配,分页和CPU缓存是如何工作的,这样我就可以编写高效的代码了
  • 了解数据结构
  • 了解线程,锁定和相关问题

关于图灵机等的东西。我认为这很重要,因为它定义了我们所有人都在运作的约束条件。这很重要。欣赏。

答案 4 :(得分:14)

这是学习代数和被教导如何使用计算器之间的区别

如果你知道代数,你会发现同样的问题可能以不同的形式出现,你理解将问题转化为更简洁的形式的规则

如果你只知道如何使用计算器,你可能会浪费大量时间在一个问题上按下按钮,这个问题要么(a)已经解决,(b)无法解决,要么(c)像其他一些问题(已解决或未解决)您无法识别,因为它的形式不同

暂时假装计算机科学是物理学......这个问题看起来很愚蠢吗?

答案 5 :(得分:8)

我的一位朋友正在研究一种带有一些模板的语言。我被要求做一点咨询。我们讨论的部分内容是模板功能,因为如果模板是图灵完成的,他们必须真正考虑VM-ish属性以及他们的编译器如何/如果支持它。

我的故事就是这样:自动教学理论仍在教授,因为它仍具有相关性。暂停问题仍然存在,并限制了您可以做的事情。

现在,这些事情是否与数据库管理员敲定C#代码有关?可能不是。但是当你开始进入更高级的水平时,你会想要了解你的根源和基础。

答案 6 :(得分:7)

虽然我没有直接将它们应用于日常工作中,但我知道我对正规计算机科学的教育影响了我的思考过程。我当然从一开始就避免了某些错误,因为我从我灌输的正式方法中吸取了教训。

当他们学习它时,它似乎毫无用处;但我敢打赌,你的同学最终会遇到一个问题,他们会使用他们所教的内容,或者至少是它背后的思维模式......

Wax on ... Wax off ... Wax on ... Wax off ...这与空手道有什么关系呢?

答案 7 :(得分:6)

在一项工作中,我被分配了改进我们的配电模型的网络跟踪算法的任务,因为他们使用的算法太慢了。三相网络基本上是三个n树(因为电网中不允许环路)。网络节点在数据库中,并且一些原始团队无法弄清楚如何构建内存模型,因此跟踪是通过数据库上的连续深度SELECT完成的,对每个阶段进行过滤。因此,要跟踪一个节点,来自变电站的十个节点将需要至少10个数据库查询(原始团队成员是数据库高手,但在算法中缺乏合适的背景)。

我编写了一个解决方案,将3个n树的节点网络从数据库转换为数据结构,其中每个节点在节点结构数组中存储一次,并且n-tree关系使用双重转换为三个二叉树数组中的链接指针,以便可以在任一方向轻松跟踪网络。

至少快两个数量级,三个在很长的下游痕迹上。

令人遗憾的是,我必须实际教授n-trees,二叉树,指针和双向链接列表中的一些类,这些程序员已经接受过数据库和VB方面的培训,以便他们理解算法。

答案 8 :(得分:4)

这是一个经典的二分法,介于“如何”和“什么”之间。你的同学正在研究如何编程软件,他们非常关注近距离的焦点;从这个角度来看,从实施的角度来看,似乎知道停止状态和图灵机等事情并不重要。

但是,“如何”与计算机科学相关的实际工作却很少。事实上,我所知道的大多数成功的工程师可能会把它放在实际工作的不到20%。 “做什么”更为重要;为此,计算机科学的基础是至关重要的。你想做什么与设计有关,而不是与实施有关;好的设计是......好吧,我们把它称为“非平凡的”。

“构建软件设计有两种方法:一种方法是使其变得如此简单以至于显然没有缺陷,另一种方法是使其变得如此复杂以至于没有明显的缺点。第一种方法要困难得多。“ - CAR霍尔

祝你学习顺利!

答案 9 :(得分:3)

大多数知识并非“实用”,但可以帮助您以无法预料的方式连接点,或者为描述更复杂的想法提供更丰富的词汇。

答案 10 :(得分:3)

重要的不是你学习的具体问题,而是你通过研究它们所学到的原则。我每天都在工作中使用有关算法,数据结构,编程语言和操作系统的概念。如果您作为程序员工作,您将始终做出影响系统性能的决策。你需要在基本的抽象概念中有一个坚实的基础,才能做出正确的选择。

答案 11 :(得分:3)

我认为理解计算的基本模型很有用:确保你在实践中永远不需要能够将图灵机翻译成注册机,但学习如何看待这两个非常不同的问题实际上是同一个概念的实例是一项关键技能。

答案 12 :(得分:2)

从CS毕业后,我的想法同样如此:我们研究的一大堆理论在实践中完全没用。这证明在短时间内是正确的,但是当你处理复杂的任务时,理论肯定比实践更有价值。经过几年的编码后,每一个人都可以编写一些“有效”的程序但不是每个人都能理解如何。无论我们大多数人会在某个方面处理性能问题,网络延迟,精确性,可扩展性等问题。在这个阶段,理论至关重要。为了在处理复杂系统时设计一个好的解决方案,了解内存管理的工作原理,进程和线程的概念,如何为内存分配内存,以及高效的数据结构等等都非常重要。

有一次,例如我正在开展一个项目,包括大量的数学计算,在某些时候我们的软件失败了。在调试时,我发现经过一些数学运算后,我得到一个数值为DOUBLE的值为1.000000000002,但是从数学的角度来看,不能是1在程序的某个后期阶段,它给出了传奇的 NaN 例外。我花了一些时间来弄明白这一点,但如果我更多地关注“近似的Double and Float ”课程,那我就没那么浪费了。

答案 13 :(得分:2)

如果您在一家开展突破性工作的公司工作,那么能够与建筑师和开发人员沟通的好处是很重要的。关于各种技术的炒作很多,定位自己可能很困难。当您在科学和理论方面构建您的创新时,您肯定处于优势,客户感觉您是真实的。我可以告诉人们:有一种处理状态,编码和非确定性(即复杂性)的新方法,你肯定比现在更有效率。

如果你在职业生涯中学习长远的理论,理论会给你深度,你需要的深度。学习第5或第6编程语言的投资回报将比学习第2和第3编程语言少得多。接触理论将使您对真正的工程,自由度的位置以及如何做出正确的权衡取舍有所了解。

重要概念1)状态,2)编码,3)非确定性。如果你不了解他们,他们将无法帮助你。理论应该为您提供的是大局观和基本概念如何融合在一起的感觉。它应该可以帮助你磨练自己的直觉。

示例:上面的一些答案提到了暂停问题和图灵机。当我在大学读到图灵的论文时,我根本没有感到开悟。有一天,我偶然发现了Goedel的不完备性定理和Goedel编号。事情开始变得很有意义。多年后,我在一家书店读到了Georg Cantor。现在我真的开始了解图灵机和停止问题了。试着自己在维基百科上查找“康托尔的对角论证”。这是你将遇到的最智能的事情之一。

值得深思:典型的图灵机并不是设计状态转换机的唯一方法。使用两个而不是一个磁带的图灵机可以为您提供更多的算法速度。 http://www.math.ucla.edu/~ynm/papers/eng.ps

通过阅读本书,您可以更有效地让自己了解这些见解。链接在这篇文章的底部。 (至少,请查看亚马逊上的目录,了解这是什么):

我发现罗森伯格的这本书很轰动。 http://www.amazon.com/The-Pillars-Computation-Theory-Nondeterminism/dp/0387096388如果你只有一本关于理论的书恕我直言,那应该就是那本书。

答案 14 :(得分:1)

说实话,我有点不同意这里的很多答案。我编写了我的第一个编译器(为了好玩;我真的有太多咖啡/空闲时间)而没有参加编程器课程;基本上我只是扫描了另一个编译器的代码并遵循了模式。我可以在C顶部编写一个解析器,但是如果我的生活依赖于它,我认为我不记得如何绘制一个下推自动机。

当我决定将类型推理用于我的玩具(命令式)编程语言时,我首先查看了五篇论文,盯着一种叫做“打字的lambda演算”的东西...... ...... *** ....?起初我尝试使用“泛型变量”和“非泛型变量”来实现,并且不知道发生了什么。然后我把它全部废弃了,坐在那里用笔记本弄清楚我是如何实现它的,实际上支持我需要的所有东西(子类型,一流函数,参数化类型等)。经过几天的思考&安培;在编写测试程序时,我吹走了超过一周的时间来试图找出理论上的废话。

了解计算的基础知识(即虚拟内存如何工作,文件系统如何工作,线程/调度,SMP,数据结构)都被证明非常有用。复杂性理论和Big-O的东西有时被证明是有用的(对于像RDBMS设计这样的东西特别有用)。停止问题和自动机/图灵机理论?从不。

答案 15 :(得分:1)

即使不直接使用理论课程,也可能有助于你更好地思考。

你不知道老板要求你做什么,你可能不得不使用你认为不会有益的东西,正如Jeffrey L Whitledge所说。

答案 16 :(得分:1)

我正在为我的分布式算法课程学习。有一章关于容错,它包含一些上限,证明有多少进程可以失败(或行为不端),以便分布式算法能够正确处理它。

对于许多问题,行为不当的过程最多占进程总数的三分之一。这在我看来非常有用,因为你知道尝试开发一个更好的算法(在给定的假设下)是没有意义的。

答案 17 :(得分:1)

我知道这已经过时了,但我对那些声称理论是无用的人做出的简短回答'并且他们可以在没有它的情况下练习他们的职业:

没有基础理论,没有实践。

  

为什么理论有用?

理论是建立其他事物的基础。当理论被应用时,实践就是结果。

今天考虑使用计算机。今天的普通计算机是在图灵机的基础上建模的,为了简单起见,它是一个抽象/理论的计算模型。这个理论模型位于计算的基础,我们今天使用的所有计算设备,从高端服务器到袖珍手机,都起作用,因为底层基础是合理的。

考虑算法分析。简单来说,算法分析和时间复杂度理论已被用于分类问题(例如P,NP,EXP等)以及我们的算法如何表现当试图解决不同阶级的不同问题时。

假设你的一个朋友在某个地方获得了一份工作X,而在那里,经理会提出一些简单的请求,例如:

  

Ex 1:我们拥有庞大的运载车队,可以访问多个州的不同城市。我们需要来实现一个系统,以确定每辆车的最短路线,并从所有可能性中选择最佳。你能做到吗?

认为这个理论是无用的'你的朋友们没有意识到他们刚刚接受了旅行商问题(TSP)并开始设计这个系统而没有经过深思熟虑,只是为了发现他们天真地尝试检查所有根据最初的要求,可能性很慢,他们的系统无法用于任何实际目的。

事实上,他们不知道为什么系统在"可接受的"检查5个城市时的水平,但在10个城市变得非常缓慢,只有40个城市才冻结。他们认为它只是&#34>比5个城市测试的城市多2倍和8倍的城市和#34;并想知道为什么该计划不仅仅需要2倍和8倍的时间"分别...

理解该理论将使他们能够实现以下目标,至少一目了然:

  1. 是TSP
  2. TSP是NP-hard
  3. 他们算法的增长顺序是 O(n!)
  4. 这些数字不言自明:

    +--------------+-------+-----------------------------------------------------------------+
    |  No. Cities  | O(N!) |  Possibilities                                                  |
    +--------------+-------+-----------------------------------------------------------------+
    |       5      |   5!  | 120                                                             |
    |      10      |  10!  | 3,628,800                                                       |
    |      40      |  40!  | 815,915,283,247,897,734,345,611,269,596,115,894,272,000,000,000 |  <-- GG
    +--------------+-------+-----------------------------------------------------------------+
    

    他们可能在一开始就意识到他们的系统会像他们想象的那样开始工作。该系统后来被认为是不切实际的,并且在大量的时间,精力和其他资源被分配给项目并最终被浪费在项目上之后被取消 - 而且所有这些都是因为思想和理论是无用的#34; / p>

    所以在经历了这次失败之后,经理们会想到,嗯,也许这个系统被低估了;毕竟,我们国家有很多城市,我们的计算机根本不像我们最近取消的系统那样快,因为我们的计算机取得了成功。

    管理团队将缓慢的计算机归咎于项目失败的原因。毕竟,他们不是CS理论的专家,不需要,而且那些应该成为该主题的专家并且可以通知他们的人,并没有&#39 ;吨

    但他们还有另一个项目。实际上更简单。一周后他们来了,请问以下内容:

      

    Ex 2:我们只有几台服务器,我们的程序员不断提交程序,这些程序由于未知原因,最终会无限循环并导致服务器停顿。我们需要编写一个程序来处理正在提交的代码并检测提交的程序是否会在运行期间导致无限循环,并决定是否允许提交的程序运行这个基础。你能做到吗?

    亲爱的朋友再次接受挑战并立即开始工作。经过几个星期的工作,没有结果,你的朋友很紧张,并且不知道该怎么做。又一次失败......你的朋友现在感到愚蠢&#34;因为没有能够解决这个问题&#34; ...毕竟,请求本身使它声音简单。

    不幸的是,你的朋友,同时坚持认为#34;理论毫无用处&#34;没有意识到,据称简单的请求实际上是一个关于可判定性的棘手问题(即停止问题本身),并且没有已知的解决方案。这是一项不可能完成的任务。

    因此,即使开始解决该特定问题的工作也是可以避免和可预防的错误。如果理解框架能够理解所要求的内容,那么他​​们就可以提出一个不同的,可实现的解决方案......例如实施一个简单的监控流程{{ 1}}任何用户进程(根据用户列表)在某些假设下以某种任意/合理的间隔独占CPU(例如,我们知道每个程序运行应该在10内终止)分钟,因此任何运行20分钟以上的实例应为kill -SIGTERM <id>

    总之,没有理论的实践就像没有基础的建筑。迟早,来自正确角度的适当压力将使其自身崩溃。没有例外。

      

    您是否曾在日常编码中使用它?

    是的,但不是直接。相反,我们依赖间接。需要注意的是,根据您碰巧正在处理的问题域,不同的理论概念或多或少都适用。

    当然,我们:

    1. 每天使用计算机,它依赖于计算模型(例如图灵机)
    2. 编写代码,它依赖于可计算性理论(例如甚至可计算的东西)和lambda演算(例如编程语言)
    3. 依靠色彩理论和模型(例如RGB和CMYK颜色模型)进行彩色显示和打印等。
    4. 欧拉计算机图形学中的定理,这样就可以构建矩阵来围绕任意轴旋转物体,等等......
    5. 事实上,只是使用飞机旅行的人并不需要理解甚至允许飞机建造并首先飞行的理论。但是当某人被要求构建所说的机器并让它们工作时......你真的期望一个甚至不了解飞行原理的人会得到一个好结果吗?

      在历史的大部分时间里,没有人能够建造一台飞行机器(有些人甚至死于测试他们的飞机),直到莱特兄弟理解了关于飞行的某些理论概念并设法将它们付诸实践,这真的是巧合吗? ?

      这不是巧合。我们今天拥有大量的工作技术,因为构建它们的人理解并应用了允许他们首先工作的理论原则。

答案 18 :(得分:1)

因为C ++模板实际上是某种lambda演算。见www.cs.nott.ac.uk/types06/slides/michelbrink_types_06.pdf

答案 19 :(得分:1)

简单。例如:如果我正在使用 RSACryptoServiceProvider ,我想知道它是什么以及为什么我可以信任它。

答案 20 :(得分:1)

Ya,我通常使用状态图来设计程序的形状和流程。 一旦它理论上起作用,我开始编码和测试,在我去的时候检查状态。

我发现它们也是向其他人解释流程行为的有用工具。

答案 21 :(得分:1)

我发现从CS理论世界我所需要的每日幸福就是“低耦合和高凝聚力”这句口头禅的话语。 Roger S. PressmanSteve McConnell成为时尚之前就{{3}}进行了学术研究。

答案 22 :(得分:1)

我不是每天都使用它。但它给了我很多理解,每天帮助我。

答案 23 :(得分:-1)

我想这取决于你进入哪个领域。