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秒来生成列表 如何为这个问题设计一个算法,使程序生成列表的时间更短 注意-我试图通过一个例子来理解这个概念,上面提到的时间是随机的,不是事实。如果有人不想使用上面
注意-我试图通过一个例子来理解这个概念,上面提到的时间是随机的,不是事实。如果有人不想使用上面的例子,可以用一个“简单”的例子来帮助我理解这个概念,那就太好了。在你给出的例子中,你的速度再快不过了。您必须输出整个列表,并且您描述的算法可以有效地执行此操作 让我们稍微修改一下这个问题:您只需输出大于1000000的第一个数字。这比生成整个列表更聪明。上面给出的(生成列表的步骤列表)是一个算法 效率的显著提高通常意味着从一种算法转换到另一种算法,以更少的工作量实现相同的目的。例如,对于上面的算法,您可能会尝试完全避免创建列表(这样),而是替换一个可以快速生成列表中任何特定点的结果的算法——给定N作为输入,它将执行以下操作
int n = N/2;
int m = N-n;
return 1 + n * 3 + m * 5;
请注意,这段代码可能并不完全正确(我认为它处理奇数和偶数输入数字的方式不太正确),但您得到了一般的想法——而不是执行一系列操作来获得一个结果,它执行的运算次数要少得多,以产生相同的结果。让我们先说一句,你不使用算法来提高计算机程序的性能;算法是程序(根据定义,算法是解决问题的有限操作序列) 当然,有一些著名的算法,已经由智者发明,可以完美地应用于一个问题(你的问题涉及到图?Dijkstra的最短路径算法,Ford Fulkerson的最大流算法,Prim和Kruskal的最小生成树算法,等等)。您通常希望在程序中重新使用这些性能良好的算法,而不是从头开始重新编写它们 你会想使用它们,因为
希望我能清楚地解决您的疑问,不幸的是,我不喜欢big-o符号和类似的性能计算,因此当人们希望提高程序或代码片段的性能(即使用更好的算法计算相同的结果)时,我只能指向wikipedia链接,考虑算法的可见输出是很重要的。也就是说,算法的(输出)是如何被使用或使用的?换言之,算法返回什么,以及如何使用该返回 你问题中的上述步骤表明应该建立一个列表,但是接下来呢?如果只是放弃结果(您可以轻松编写这样的程序或函数),那么一个好的优化器(人或机器)可以基于从未使用结果的事实来替换空的或空的程序或函数。(说真的:这是基准测试中的一个常见问题,一个算法计算一些结果来衡量生成代码的性能,但这个结果没有被使用,因此编译器可能会删除整个循环、内存分配,甚至整个函数!) 因此,关于如何更改算法以获得更好的性能的分析问题的设置,真正重要的是:确定或指定(由程序的其他部分)使用的输出部分 给定一个规范(算法的结果是如何使用的),我们可以反向工作,找到算法改进,以更少的工作产生相同的结果 当我们编写算法时,我们可以通过编写来确定改进的机会。换句话说,您上面描述的算法可能被其他算法用于一次只查找一个值,这意味着Jeffry的解决方案是性能更好的替换算法 但是,列表算法的不同使用者可能会要求其可见效果的不同部分,因此可能需要不同的优化或算法替换。这就是我上面描述的情况,如果根本不使用结果,那么另一个消费者可能只想计算列表中的节点数,在这种情况下,完全不同的优化更合适 在某些情况下,我们可以指定算法返回一些东西,我们被迫出于某种原因生成代码,而不知道是谁