Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 算法:关于复杂性和优化的解释_Algorithm_Language Agnostic_Optimization_Complexity Theory - Fatal编程技术网

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

Algorithm 算法:关于复杂性和优化的解释,algorithm,language-agnostic,optimization,complexity-theory,Algorithm,Language Agnostic,Optimization,Complexity Theory,我试图在网上找到一两个能用简单术语解释这些问题的来源。此外,这一概念能否以实用的方式用于改进算法?如果是,怎么做?下面是我从一个联系人那里得到的简要解释 我不知道在哪里可以找到简单的 解释但我试着向你解释。 算法复杂性是一个术语,即 解释输入之间的依赖关系 需要提供的信息和资源 处理它。例如,如果您需要 要在数组中查找最大值,您应该 列举所有元素并进行比较 使用您的变量(例如max)。认为 数组中有N个元素。 因此,该算法的复杂度非常高 O(N),因为我们列举了所有 一次的元素。如果我们列举 所

我试图在网上找到一两个能用简单术语解释这些问题的来源。此外,这一概念能否以实用的方式用于改进算法?如果是,怎么做?下面是我从一个联系人那里得到的简要解释

我不知道在哪里可以找到简单的 解释但我试着向你解释。 算法复杂性是一个术语,即 解释输入之间的依赖关系 需要提供的信息和资源 处理它。例如,如果您需要 要在数组中查找最大值,您应该 列举所有元素并进行比较 使用您的变量(例如max)。认为 数组中有N个元素。 因此,该算法的复杂度非常高 O(N),因为我们列举了所有 一次的元素。如果我们列举 所有元素重复2次,复杂度 将是O(N*N)。二进制搜索已经完成 复杂性O(log2(N)),因为 将搜索区域减少一半 在每一步中。而且,你可以 计算出您的应用程序的空间复杂度 算法-空间之间的依赖性, 计划要求,以及 输入数据


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

斯坦福大学编程入门课程中使用的课程阅读器有一个关于算法分析的伟大章节,由传奇CS教育家埃里克·罗伯茨(Eric Roberts)撰写。全文在线,第8章可能值得一看。

你可以看。这是一门很好的麻省理工学院课程。

此外,这个概念能以实用的方式用于改进算法吗?如果是,如何进行?

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

O(1)是常数时间,这意味着算法对一百万个输入执行的时间与对一个输入执行的时间相同。O(N)当然是线性的,这意味着执行算法所需的时间与输入成比例增加

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

理解算法复杂性如何改变编程思维的另一个例子是微观优化。或者更确切地说,不这样做。你经常会看到新手问这样的问题,比如
is++x比x++
快吗。经验丰富的程序员大多不在乎,通常会回答
优化的第一条规则是:不要

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


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

要说所有关于复杂性的事情并不容易,但我认为wiki对此有一个很好的解释,对于启动来说很好,请参阅:

  • 介绍 这方面(你也可以看看 teta和omega符号)
  • ,知道 更多关于复杂性
  • 以及, 这是计算机的一个重要理论 科学
  • 关于优化,你可以在web和wiki上找到它,但是有五行代码,你的朋友会给你一个很好的介绍示例,但是这些不是一夜之间理解它们的用法、计算和上千种理论的努力


    总的来说,你可以根据需要熟悉它们,阅读维基,更高级的阅读书籍,如或阅读,但不要期望你在那之后了解它们的一切。您还可以看到本课堂讲稿:.

    请务必理解数据结构、算法和大O.
    精心设计代码,使其尽可能简单

    但这还不够

    优化的关键是知道如何在编写代码后发现问题


    Related:“如果我们将所有元素枚举两次,复杂性将是O(N*N)。”枚举两次是(
    O(2*N)
    或者实际上是)
    O(N)
    。一本关于算法的书的前60页左右将解释这一切。