算法:关于复杂性和优化的解释

时间:2011-01-09 00:13:11

标签: algorithm language-agnostic optimization complexity-theory

我正在尝试在网络上找到一两个简单来解释这些内容的来源。此外,这个概念能否以实用的方式用于改进算法?如果是这样,怎么样?以下是我从联系人处获得的简要说明。

  

我不知道你在哪里可以找到简单   说明。但我试着解释你。   算法复杂度就是一个术语   解释输入之间的依赖性   需要的信息和资源   处理它。例如,如果您需要   要找到数组中的最大值,你应该   枚举所有元素并进行比较   用你的变量(例如max)。假设   数组中有N个元素。   因此,该算法的复杂性是   O(N),因为我们列举所有   元素一次。如果我们枚举   所有元素都是2倍,复杂   将是O(N * N)。二进制搜索有   复杂度O(log2(N)),因为它   将搜索范围减少一半   在每一步。还有,你可以   找出你的空间复杂性   算法 - 空间之间的依赖性,   程序要求,以及数量   输入数据。

6 个答案:

答案 0 :(得分:2)

说复杂性的所有事情并不容易,但我认为wiki对它有很好的解释,对于初创公司来说很好,请参阅:

  1. Big O notation介绍 这方面(你也可以看看 teta和omega符号也是如此。
  2. Analysis of algorithm,要知道 关于复杂性更多。
  3. Computational Complexity, 这是计算机中的一个重要理论 科学。
  4. 关于优化你可以查看web和wiki来找到它,但是有五行你的朋友给出了一个很好的样本进行介绍,但这些并不是一夜之间的努力来理解它们的用法,计算和数千个理论。

    总而言之,您可以根据需要熟悉它们,阅读维基,更多高级阅读书籍,如Gary and Johnson或阅读Computation Complexity, a modern approach,但不要指望在此之后您就知道它们的一切。你也可以看到这个讲义:http://www.cs.rutgers.edu/~allender/lecture.notes/

答案 1 :(得分:1)

正如你的朋友暗示的那样,这不是一个简单的话题。但是值得投入一些时间来学习。查看this book,常用作算法CS课程的教科书。

答案 2 :(得分:1)

斯坦福大学的入门编程课程中使用的课程读者对传奇的CS教育家Eric Roberts的算法分析有很好的篇章。整篇文章在线at this link,第8章可能值得一看。

答案 3 :(得分:1)

您可以观看Structure and Interpretation of computer programs。这是一个很好的麻省理工学院课程。

答案 4 :(得分:1)

Also, can this notion be used in a practical fashion to improve an algorithm? If so, how?

它不是用于改进算法,而是用于评估算法的性能并决定选择使用哪种算法。对于任何给定的问题,你真的想避免使用具有O(N!)或O(N ^ x)的算法,因为当N(你的输入)的大小增加时它们会显着减慢。你想要的是O(N)或O(log(N))或甚至更好的O(1)。

O(1)是恒定时间,这意味着算法对于一百万个输入执行与一个输入相同的时间量。 O(N)当然是线性的,这意味着执行算法所花费的时间与其输入成比例地增加。

甚至有一些问题,为解决它们而开发的任何算法最终都是O(N!)。基本上没有可以开发快速算法来完全解决问题(这类问题被称为NP-complete)。一旦你意识到你正在处理这样的问题,你可以稍微放松一下你的要求并通过“欺骗”来解决问题。这些作弊不一定能找到最佳解决方案,而是足够好。我最喜欢的作弊是遗传/进化算法和彩虹表。

理解算法复杂性如何改变您对编程的看法的另一个例子是微优化。或者说,不要这样做。您经常会看到新手提问is ++x faster than x++等问题。经验丰富的程序员大多不关心,通常会回复the first rule of optimization is: don't

更有用的答案应该是将x++更改为++x不会以任何方式改变您的算法复杂性。与任何形式的微优化相比,算法的复杂性对代码的速度影响更大。例如,查看代码并减少深层嵌套for循环的数量要比担心编译器如何将代码转换为汇编更有效率。

另一个例子是游戏编程如何加速代码反直觉地涉及添加更多代码而不是减少代码。添加的代码采用过滤器(基本上是if..else语句)的形式,决定哪些数据位需要进一步处理,哪些可以丢弃。从微观优化器的角度来看,添加代码意味着更多的CPU执行指令。但实际上,这些过滤器通过丢弃数据来减少问题空间,因此整体运行速度更快。

答案 5 :(得分:1)

通过各种方式,了解数据结构,算法和big-O 仔细设计代码,尽可能简单。

但这还不够。

优化的关键是知道如何找到问题,在编写代码后

Here's an example.