所以,我知道效率是由算法和数据结构决定的 用在解决方案中。但是,我真的不知道算法的顺序比处理器的速度更重要吗?
答案 0 :(得分:17)
典型的个人计算机可以10^8 calculations per second
。
世界上最快的超级计算机确实10^16 calculations per second
。
假设您现在在笔记本电脑/台式机上运行了O(n)算法。并且O(n ^ 2)算法同时在世界上最快的超级计算机上运行。如果n = 10 ^ 10,
PC上的运行时间= 10 ^ 10/10 ^ 8 = 100 seconds
。
超级计算机上的运行时间= 10 ^ 20/10 ^ 16 = 10000 seconds
。
我们寻找更好算法的另一个原因是 scalability 问题。根据{{3}},计算能力每18个月翻一番。因此,即使超级计算机今天能够以极快的速度处理大量输入,也可能无法在问题规模增加了许多倍的情况下这样做,而计算能力在未来18个月内只会翻倍。
答案 1 :(得分:5)
让我们看一个例子:
您的算法的订单为O(n ^ 3)。您可以在100毫秒内处理n = 10的处理器上运行该算法。
如果n变为10000,则该处理器需要1158天。
使处理器速度提高两倍只能将其缩短到579天。
即使您能够以十倍的速度获得处理器,仍然需要几个月的时间。
但是用O(n ^ 2)的顺序替换该算法并在原始处理器上运行该算法会将所需时间减少到2.8小时。
答案 2 :(得分:2)
不能说算法的顺序比CPU速度更重要/更不重要!!!他们没有可比性!!!! 我们使用命令将不同的算法相互比较,因为我们不知道算法将运行的目标架构。另外注意,程序的执行时间取决于许多因素,例如高速缓存未命中率,主存储器命中率和....因此在每个执行程序中执行时间可能与先前的不同。结果我们无法比较两个程序,即使在结构上执行它们也是如此!!!
答案 3 :(得分:1)
是否更重要取决于具体情况。算法的复杂性顺序与其速度没有直接关联,可能存在比“更好”算法更快地解决特定问题实例的“更差”算法。正如其他答案所解释的那样,复杂性顺序归结为“内存/时间消耗如何随输入大小增长?”。对于小投入,你不在乎。对于平均输入,您可以对算法进行基准测试,并查看哪个算法在硬件上运行得更快。问题是出乎意料的大输入:现在你关心十倍数据是否意味着十倍的运算时间,百倍的等待时间,或永无止境的计算,直到宇宙死亡。
一个突出的例子是Windows XP update mechanism。他们正在使用具有指数运行时间的算法处理已安装更新的列表。这是没有问题,并且运行得非常快,直到几十年后 - 更新的数量使这成为一个真正的问题。
但作为一名计算机科学家,我还有另一种观点可以分享更重要的事情:算法复杂性更有趣。找出具有更好复杂性的算法是一个智力问题。如果您只关心更快的结果,您可以轻松升级您的硬件。你可以获得处理能力。处理器的速度或多或少仍在提高 - 只需获得它们就可以轻松加快程序 [1] 。直到你达到(技术或预算)的优势,你需要一个更好的算法。然后你有一个坚果要破解。脑筋急转弯。这很有趣!
1:我不是说快速制作处理器是微不足道的。但使用它们来解决问题是: - )
答案 4 :(得分:0)
我试着以简单的方式解释
处理器速度以周期/秒为单位进行测量,并且因处理器而异。为了判断算法,我们需要一个独立于此的度量,并且纯粹基于算法。
我们假设算法中的单个操作需要一个处理器周期。
因此,对于算法的顺序,如果输入的大小为n,则需要n个处理器周期。
如果order是algo n ^ 2,如果输入大小为n,则需要n ^ 2个处理器周期。
所以你看,算法的顺序是一个与处理器速度无关的度量。订单越低,工作越快。
这是一个非常普遍的答案,但我希望它能够清除你的怀疑。