Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 数学算法_Performance_Algorithm_Math_Optimization_Mathematical Optimization - Fatal编程技术网

Performance 数学算法

Performance 数学算法,performance,algorithm,math,optimization,mathematical-optimization,Performance,Algorithm,Math,Optimization,Mathematical Optimization,我试图理解算法的概念,以及它们如何提高计算机程序的性能 假设我要写一个程序生成一个数字列表 从数字1开始 加上3 将结果(1+3=4)存储在列表中 在新数字上加5 将结果(4+5=9)存储在列表中 在列表中的最新数字上交替添加3和5 现在,这是一个非常简单的程序,假设当数字大于10,00000时,程序必须停止,假设一个简单的程序需要10秒来生成列表 如何为这个问题设计一个算法,使程序生成列表的时间更短 注意-我试图通过一个例子来理解这个概念,上面提到的时间是随机的,不是事实。如果有人不想使用上面

我试图理解算法的概念,以及它们如何提高计算机程序的性能

假设我要写一个程序生成一个数字列表

  • 从数字1开始

  • 加上3

  • 将结果(1+3=4)存储在列表中

  • 在新数字上加5

  • 将结果(4+5=9)存储在列表中

  • 在列表中的最新数字上交替添加3和5

  • 现在,这是一个非常简单的程序,假设当数字大于10,00000时,程序必须停止,假设一个简单的程序需要10秒来生成列表

    如何为这个问题设计一个算法,使程序生成列表的时间更短


    注意-我试图通过一个例子来理解这个概念,上面提到的时间是随机的,不是事实。如果有人不想使用上面的例子,可以用一个“简单”的例子来帮助我理解这个概念,那就太好了。

    在你给出的例子中,你的速度再快不过了。您必须输出整个列表,并且您描述的算法可以有效地执行此操作

    让我们稍微修改一下这个问题:您只需输出大于1000000的第一个数字。这比生成整个列表更聪明。

    上面给出的(生成列表的步骤列表)是一个算法

    效率的显著提高通常意味着从一种算法转换到另一种算法,以更少的工作量实现相同的目的。例如,对于上面的算法,您可能会尝试完全避免创建列表(这样),而是替换一个可以快速生成列表中任何特定点的结果的算法——给定N作为输入,它将执行以下操作

    int n = N/2; 
    int m = N-n; 
    return 1 + n * 3 + m * 5;
    

    请注意,这段代码可能并不完全正确(我认为它处理奇数和偶数输入数字的方式不太正确),但您得到了一般的想法——而不是执行一系列操作来获得一个结果,它执行的运算次数要少得多,以产生相同的结果。

    让我们先说一句,你不使用算法来提高计算机程序的性能;算法是程序(根据定义,算法是解决问题的有限操作序列)

    当然,有一些著名的算法,已经由智者发明,可以完美地应用于一个问题(你的问题涉及到图?Dijkstra的最短路径算法,Ford Fulkerson的最大流算法,Prim和Kruskal的最小生成树算法,等等)。您通常希望在程序中重新使用这些性能良好的算法,而不是从头开始重新编写它们

    你会想使用它们,因为

  • 重新编写它可能会让你的表现更差
  • 重新编写它肯定会消耗您的时间,您可能会花在解决问题上(假设算法的使用是针对您问题的一个子集,即“为了解决我的问题,我需要首先对数组进行重新排序”-对数组进行重新排序是解决问题的必要步骤,但不是您的问题)
  • 至于数字1,还涉及一些数学计算,因为要衡量算法的性能,你必须做一些更好解释的事情


    希望我能清楚地解决您的疑问,不幸的是,我不喜欢big-o符号和类似的性能计算,因此当人们希望提高程序或代码片段的性能(即使用更好的算法计算相同的结果)时,我只能指向wikipedia链接,考虑算法的可见输出是很重要的。也就是说,算法的(输出)是如何被使用或使用的?换言之,算法返回什么,以及如何使用该返回

    你问题中的上述步骤表明应该建立一个列表,但是接下来呢?如果只是放弃结果(您可以轻松编写这样的程序或函数),那么一个好的优化器(人或机器)可以基于从未使用结果的事实来替换空的或空的程序或函数。(说真的:这是基准测试中的一个常见问题,一个算法计算一些结果来衡量生成代码的性能,但这个结果没有被使用,因此编译器可能会删除整个循环、内存分配,甚至整个函数!)

    因此,关于如何更改算法以获得更好的性能的分析问题的设置,真正重要的是:确定或指定(由程序的其他部分)使用的输出部分

    给定一个规范(算法的结果是如何使用的),我们可以反向工作,找到算法改进,以更少的工作产生相同的结果

    当我们编写算法时,我们可以通过编写来确定改进的机会。换句话说,您上面描述的算法可能被其他算法用于一次只查找一个值,这意味着Jeffry的解决方案是性能更好的替换算法

    但是,列表算法的不同使用者可能会要求其可见效果的不同部分,因此可能需要不同的优化或算法替换。这就是我上面描述的情况,如果根本不使用结果,那么另一个消费者可能只想计算列表中的节点数,在这种情况下,完全不同的优化更合适

    在某些情况下,我们可以指定算法返回一些东西,我们被迫出于某种原因生成代码,而不知道是谁