我一直在阅读不同的计算机科学主题,到目前为止,对我来说最困难的部分是理解高效算法的概念。我想我的问题是,理论上,为什么当软件在不同速度的不同硬件上运行时,算法的效率真的很重要?
我希望我已经非常清楚地描述了手头的问题。
答案 0 :(得分:2)
硬件速度很重要,但硬件差异通常会导致速度的微小变化(通常是一个常数因素)。在算法效率的测量中通常忽略常数因子(对于算法分析,我们大多使用Big-O / Theta / Omega表示法,它不能解释运行时间的恒定差异。)
如果您的算法不正确,无论您的硬件有多快,它都可能无法实际完成。考虑一下Theta(n ^ 2)算法和Theta(n!)算法之间的区别。如果n = 1000000,那么您将很难找到能够在合理的时间内执行Theta(n!)操作的计算机。但是,您绝对可以找到一台计算机,而不是在合理的时间内执行Theta(n ^ 2)操作。
答案 1 :(得分:2)
如果你问一个学术或最近受过教育的程序员,他们会说重要的是大O,因为O(n log n)算法总是会超过O(n * n)算法,前提是n足够大
但这就是重点 - 实际上可能并不那么大。
另外,他们往往忽视不变因素 我曾经听过Jon Bentley轻轻地谴责学者,他们真的不介意让他们的薪水乘以50,是吗?
在现实世界中,常数因素非常重要
。P.S。 730x 加速的Here's an example,通过一系列六次编辑实现。
答案 2 :(得分:1)
无论底层硬件的速度如何,更快的算法都比慢速算法更快。
如果CPU速度慢,选择有效的算法变得更加重要,这样你就可以减少工作量。
答案 3 :(得分:1)
算法效率的常用度量,Big-O notation,可以让您比较算法相对于彼此的时间增长率,假设它们在相同的硬件上运行,并忽略常数因子。
当硬件速度提高时,所有算法都会以大致相同的常数加速:如果硬件速度上升三倍,则所有算法的速度将快三倍 * 。这意味着在旧硬件上运行速度更快的算法在新硬件上仍然会更快。
此外,硬件加速的影响是一个与问题大小无关的常数。根据算法与数据大小的缩放方式,不同算法的改进硬件加速速度会有所不同。
例如,考虑两种算法,X生长为O(n),Y生长为O(n 2 )。假设您衡量处理固定数量数据所需的时间。将CPU加速四倍会让X在同一时间内处理大约四倍的数据,而Y只能处理两倍的数据(也大约是)。
同时,硬件优化可能会给某些操作带来不成比例的大幅加速,如果对算法X有用而对算法Y无用,则会扭曲在不同硬件上运行的两种算法的相对速度。 / p>
* 除非您的算法遇到不同的瓶颈:例如,CPU加速三次可能需要匹配的内存访问加速才能达到预期效果加快所有算法的速度。