计算机科学中的Big-O符号有什么大不了的?

时间:2010-01-03 21:47:42

标签: computer-science big-o

Big-O符号如何帮助我的日常C#编程?这只是一次学术活动吗?

14 个答案:

答案 0 :(得分:39)

Big-O告诉您算法在输入大小方面的复杂性。如果您想知道算法如何扩展,那么必不可少。如果您正在设计一个大型网站并且拥有大量用户,那么处理这些请求所需的时间非常重要。如果你有大量的数据并且想要将它存储在一个结构中,那么你需要知道如果要写一些不需要一百万年才能运行的东西就能有效地完成这项工作。

Big-O符号本身不会帮助您。如果您了解Big-O表示法,您就会理解算法的最坏情况复杂性。从本质上讲,Big-O让您高度了解哪些算法速度快,速度慢,以及权衡取舍。如果您不理解这一点,我不知道如何理解.NET集合库中任何内容的性能影响。

我不会在这里详细介绍,因为这个问题已经被问到many times,但只要说这是应该理解的东西就足够了。这是一个相当高度投票的previous Big-O question,可以帮助您入门。

答案 1 :(得分:8)

Big O表示法允许您根据整体效率和可扩展性分析算法。它抽象出效率的恒定顺序差异,这可能因平台,语言,操作系统而异,关注算法的固有效率以及它如何根据输入的大小而变化。

答案 2 :(得分:7)

我正在阅读答案而我(认真地)认为大O被低估了。

作为通过编码赚钱的编码员,我们需要知道大O是什么以及我们为什么需要它。

让我解释一下我的想法:Big-O表示法是你工作的效率/表现。当输入变大时,您必须知道代码的工作速度有多快,因为在现实生活中,您无法知道输入的确切数量。此外,如果没有渐近符号,你无法比较两种不同的算法方法,所以如果你想选择更好的算法,你将把它们与big-O进行比较,看看哪一种适合你的情况。两者都可能效率低下,但你会知道哪一个更好。

答案 3 :(得分:5)

Naw,我也想知道这一点,但现在我发现自己每次使用图书馆时都会想到大O.

Big-O让您了解任何函数的渐近运行时间,这样您就可以决定数据结构A是否比数据结构B更快。

例如,当您真正需要的是ArrayList时,您可能会尝试使用类似Queue的内容。当您尝试向ArrayList添加元素时,如果您可以看到运行时间为O(n)(因为它需要创建一个新数组并将所有元素复制到...有时)但是在Queue O(1)中,您可以轻松地看到队列更快。这实际上是一个很糟糕的例子,因为这两个结构之间存在许多其他差异,但你明白了这一点;)

答案 4 :(得分:4)

了解不同类型的容器和排序算法的相对优势和劣势有助于您为当前情况选择正确的容器和排序算法。 Big O表示法是表达主要差异的一种便捷方式,即算法时间复杂度。

答案 5 :(得分:4)

Big-O在算法设计中比日常黑客更重要。通常,您不需要知道Big-O,除非您正在处理大量数据(即,如果您需要对10,000个元素而不是10个元素进行排序)。在很多情况下,它们是为您处理棘手的东西的库(如内置的sort函数),但在某些情况下,您需要自己完成。

底线是Big-O相当容易学习,所以只是学习它。在一堆案例中它会帮助你。

答案 6 :(得分:4)

编写优秀的软件主要是为了理解并在设计中做出关于权衡的明智决策。例如,有时您可以容忍更大的内存占用,从而缩短执行时间,有时您可以牺牲执行时间以减少内存占用,等等。

Big-O表示法是对这些权衡的正式化,因此软件工程师可以讲一些关于它们的共同语言。您可能永远不必正式证明您设计的算法的Big-O特征,但如果您不在抽象层次上理解该概念,那么您很可能不会在您开发的软件中做出良好的权衡。

答案 7 :(得分:3)

不,知道不同算法的效率确实很有帮助。

如果你花时间去理解Big O,那么每当你坐下来编写一个循环时,你会想到“我怎样才能让它变得更有效率?” - 这是一件好事:)。

答案 8 :(得分:3)

是的,只是一个“学术练习”。可以肯定的是,只要一些愚蠢的学者做这样的练习,你就可以每天做好编程工作: - )

顺便说一句,如果这些学者不看lambda演算,图论,自动机,图灵机或其他东西,他们就会找到与哲学家共进晚餐的捷径。

如需了解更多信息,请查看好的学术书籍或上面的优秀答案......

答案 9 :(得分:2)

这是一个(几乎)每个人在他们的CS研究期间提出的问题,特别是如果他们计划成为工业开发人员。

正如大家都指出的那样,是的,这很关键。虽然你可能能够逃避它,或者从不关心性能,但在某些时候你会受到它的影响。在某些时候,你将不得不操纵内存中的大量数据,你必须找到一种有效的方法。在某些情况下,您必须在现有集合之间进行选择,而在其他情况下则必须设计自己的集合。

话虽这么说,但我发现有些学校在实际使用世界的重要性上,过多地将数学/代数方面推向了本科生。对这个代数方不太感兴趣的学生会产生厌恶。恕我直言,大多数CS学生都不需要知道如何计算Big O超出基础知识。像大师定理这样强迫他们的喉咙不会让他们欣赏这一点。

答案 10 :(得分:1)

Big-O是一种根据时间测量或有意义地停留算法性能的方法。因此,如果需要在这方面进行任何优化,那么big-o是一种有价值的工具。它是算法和数据结构类的基础章节。我同意其他回复提到您可能不会在日常编程工作中直接使用它,但即使是日常代码也有可以在需要时测量的性能。

答案 11 :(得分:1)

请记住,big-O告诉您算法如何使用大量输入进行扩展,但它并不能告诉您巫婆算法对您的任务更快。

构建金字塔是O(n),而对它们进行排序时,最好是O(n log n),这并不意味着构建它们比制作幻灯片更快。

答案 12 :(得分:1)

想想效率,我的朋友!

如果你的老板大吼大叫,按照他们的名字找到客户的地址,你会得到一大堆未分类的论文和一个按姓名索引的地址簿,可以看出差异。

在big-O表示法中,这是O(n) - 贯穿你的大量未分类纸张,O(1) - 按名称查找索引。

答案 13 :(得分:0)

没有“大不了”。

这完全取决于你正在做的工作。如果你在前端工作,你可能会花费数月时间陷入各种与Big O无关的有趣且可能很复杂的事情。

如果您在一个遭受扩展问题的组织中工作,您可能会发现自己是一个适合您所有需求的现成解决方案,而您只需要能够理解Big O 的含义,正确理解调用X函数时将获得的性能类型。或者,当你不得不将各个部分组合在一起,或者编写一个由其他人组合的新算法时,偶尔对你的工作很重要....

最后一个案例(< 1%)是你在学术界工作的,当然,发现一种新的算法,这种改进的顺序是潜在的巨大的交易,这对你的日常工作非常重要。没有人可能不得不告诉你这一点,因为如果不认识到这一点,就不可能沿着这条道路前进。

谈到面试过程,完全是另一回事。我担心这对我们的工程师来说是一个欺骗过程。我们彼此这样做,但实际上我们都会让一些对我们日常工作没有用的知识随着时间的推移而降低。像大多数工程师一样,当它变得有用时你会刷新,所以这不是一个真正的问题,除了当你退出/被解雇时你将不得不再次采访,所以...最好简单地把它当作人类做的烦人事情之一,并简单地牺牲准备面试过程所需的时间。我喜欢把它想象成以荣誉为基础。对我的算法进行研究的礼貌表明我的下一个潜在雇主的荣誉。当然,他们可能会有不同的看法,但这不是我的地方:)