在算法的哪些编程领域中,运行时实际上是一个重要的问题?


15

有时我听到人们说,由于处理器的速度和可用内存量的原因,实际上,算法效率和运行时间并不是主要关注的问题。

但是我想在某些领域中,这种考虑确实仍然至关重要。我想到的两个是算法交易,其中必须在几分之一秒内完成数千笔交易,而嵌入式系统编程则通常缺乏内存和功能。我对这些例子正确吗?还有哪些其他领域也是示例?


1
:在LMAX破坏者你可能感兴趣的infoq.com/presentations/LMAX

“算法交易”是一个不好的例子。这些算法通常很简单。总体而言,低延迟性能更多的是专用资源,而不是巧妙的算法设计。
S.Lott 2012年

6
随着数据量的增加,复杂性总是比硬件资源更为重要。一种O(n*log(n))算法将完成一个30岁的计算机快于一个O(n!)O(n*n)当今最昂贵的硬件是否n足够大。
vsz 2012年

1
您可以将其O(c * f(n))视为常量c基于硬件效率低下的地方。您可以拥有一个快1000倍的系统,随着n无穷远的发展,它的重要性将越来越小。如果我怀疑那一天会很大,我会选择一天O(10000 * log(n))而不是O(n)任何一天n
vsz 2012年

Answers:


14

速度始终是需求。我想你是对的。以下是一些需要精巧算法的示例:

  1. 密码学

  2. 搜索大型数据库

  3. 排序与合并

  4. 文本搜索(非索引),包括通配符

  5. 密集计算的数学问题

  6. 模拟

  7. 数据挖掘应用

  8. 动画

  9. 人工智能

  10. 计算机视觉


2
我想添加到这种“生命攸关的”应用程序中,例如医疗设备。
stuartmclark 2012年

@stuartmclark,您说得很对。我也忘记提及自动控制系统和导航系统!
NoChance 2012年

2
除非您试图破解密码,否则速度在加密中并不十分重要。我将“大型数据库”放在首位。Internet上可用的信息量惊人。笨拙的大数据算法可能会使一个好主意变得不可行,从而扼杀了它。
S.Lott 2012年

4
@ S.Lott,速度非常重要。如果加密算法的优化不够好,则每秒处理数千个SSL请求的网站会感到窒息。有些甚至使用硬件加速。
SK-logic

@ SK-logic:虽然是正确的,但与其他算法所考虑的算法不同。大多数加密处理具有相对简单的算法,该算法具有许多超级聪明的优化方法,可以减少对表查找和位摆弄的“计算”。我认为这是“算法”,但加密算法似乎总是比算法设计更像是许多超级聪明的优化方法。这就是为什么我建议不要首先这么做的原因。
S.Lott 2012年

7

在某些情况下,算法的运行时间可能并不重要,因为我们已经意识到,您可以使用功能更强大的硬件简单地运行时间更长的算法。但是肯定在某些地方加速至关重要。

一般而言,任何使用庞大数据集的问题都将成为问题。当您的某个事物的n不能很好地缩放时,然后使na成为一个非常大的数,就会遇到问题。我怀疑如果您访问了Computational Science测试版网站并进行了摸索,可能会发现许多需要更好,更快的算法的问题。我遇到过的一些领域:

  • 统计分析特别复杂。效率低下的算法和庞大的数据集相结合,可能会导致速度大幅下降。对于某些研究来说,这可能并不重要,但是如果您要尝试快速转身怎么办?当您运行化学/核/生物威胁监视系统时,“它会在一个月内从服务器上脱落”可能是一件坏事。
  • 在大型数据集上进行数据挖掘。
  • 模拟涉及许多变量。

一般而言,如果您的算法很慢(其中许多都遭受很大的n),科学计算通常似乎是一个编程领域的复杂性会导致严重减速的机会的领域。而且,正如您提到的,存在财务应用程序。当毫秒可以确定您是在交易中获利还是亏损时,如果可以做得更好,那么“足够好”的算法就不会削减它。


4

有时我听到人们说,由于处理器的速度和可用内存量的原因,实际上,算法效率和运行时间并不是主要关注的问题。

撒一粒盐。基本上,更多的计算能力只是意味着您的n可以大大变大,然后才显着降低。对于大多数日常问题,此n现在足够大,您无需关心。但是,您仍然应该知道算法的复杂性。

有了更多可用资源,以后可能需要处理更多数据。今天,您需要分析一个包含100,000行的10MB日志文件。一年中,您可能会有一个100GB的日志文件,其中包含1,000,000,000行。如果数据量的增长快于资源能力的增长,那么以后就会遇到问题。

有了更多可用资源,更多的层就会相互堆叠。操作系统,操作系统框架,第三方框架,语言解释器,最后是您自己的工具。所有不同层中所有不必要的低效率都会成倍增加。明天,您的工具可能会在具有更多功能的新操作系统上运行,这本身会占用更多的周期和更多的内存,而为您所用的时间更少。

因此,要回答您的问题,您仍然需要关心需要处理越来越多的数据的地方(在其他答案中给出了足够的示例),在哪里您没有提供最终的工具,而是为其他工具提供了另一个抽象层。


4

几年前,我不得不编写一种算法,将排列在n架子上的试管分为两个不同的分区:即,“选择”了试管的一个子集,“未选择”了其余的试管,最终结果是没有架子会同时带有“选择”和“未选择”的电子管(还有一些额外的要求,例如压缩)。每个机架最多容纳100个试管。

该算法将用于驱动制药实验室中的试管分拣机器人。

当我收到原始规范时,我被分配了大约1分钟的计算时间,以便对2000支左右的管子进行分类,因为我们认为在可用性方面并不太麻烦。由于机器人本身的速度,因此要求在所有可能的组合上移动的次数必须最少。

隐含的假设是,复杂度将与管的数量成指数关系。但是,在进行算法设计时,我发现有一种快速O(n)算法,其中n执行管子最佳分配的机架数量是。结果是算法排序时间是即时的,因此当用户配置其排序操作时,排序显示将实时更新。

对我来说,每次更改后坐一分钟的用户和具有即时响应GUI的用户之间的区别是功能上足够的软件和使用起来很愉快的软件之间的区别。


很好的例子!听起来您做了类似基数的操作?
巴里·布朗

@BarryBrown-不确定我自己编写的算法的名称是什么。本质上,这是同时竞争的两个列表。因此,每个机架都可以出现在“选择的”或“未选择的”列表中,而在该列表中的代价是删除所有非法管的成本。

3

其他领域包括多种实时信号处理,反馈控制系统,石油勘探反卷积,视频压缩,光线追踪和电影帧渲染,虚拟现实系统,高帧频可能是重要竞争优势的游戏以及智能手机等移动设备应用程序,其中大量的CPU周期将消耗用户更快的电池寿命。

我很惊讶甚至会问到这个问题,因为对于任何曾经建造的Top-500超级计算机,可能都有大量的研究人员等待着他们,他们可以最大限度地发挥作用,并希望数量级更多的计算能力或数量级更好的算法来解决某些问题(将某种蛋白质折叠以破译癌症等),然后再退休。


1
电池寿命问题(或一般来说只是能源消耗)在今天(发布此答案后的6年)中是如此重要,以至于我公司除了时间指标外,还希望在应用程序中达到特定的能源指标。在开发过程中,我们使用了导致设备过热并进入低功耗,慢速模式的应用程序。更好,更有效的算法可以缓解这种情况!
user1118321


1

如今,算法效率不再是主要问题,因为我们正在使用高效的算法。如果使用O(n!)算法,则在任何类型的硬件上运行速度都会很慢。


这是一个有趣的观点。“这不是问题,因为它应该不用说”,而不是“这是一个问题,但不是重要的问题”。
大约

1

随着数据量的增加,算法的复杂性变得越来越重要。幸运的是,几乎每种现代编程语言的标准库都包含针对常见编程问题(主要是搜索和排序)的有效通用解决方案,因此通常,程序员不必担心这些问题。不利之处在于,许多程序员根本不了解幕后情况以及所使用算法的特征。

由于许多应用程序未经过适当的压力测试,因此这特别成问题:人们编写的代码对于小型测试数据集运行良好,但是当面对数千倍的数据时,代码就会停顿下来。当数据集增长时,适用于十条记录的某些事物会迅速爆炸。实际示例:一段本应清除不再链接到任何类别的项目的代码使用了三级嵌套循环,即O(n ^ 3)。测试数据库中只有10条记录,这意味着1000条检查-完全可行,并且不会引起明显的延迟。但是,生产数据库很快填充了大约1000行,并且突然代码每次进行十亿次检查。

所以:不,您不需要了解实施各种巧妙算法的来龙去脉,也不需要能够发明自己的算法,但是您确实需要一些通用算法的基本知识,它们的用途。优点和缺点是,何时以及何时不使用它们,您需要了解算法复杂性的可能影响,以便可以确定可接受的复杂性级别。


0

这不是什么应用程序域对运行时敏感的问题。任何程序,任何地方,都有最低性能,低于该性能实际上是毫无价值的。算法复杂度的关键是它如何随着输入大小的增加而变化。换句话说,速度尤为重要的领域是您希望不仅要扩展当前问题规模,还要扩展数量级的领域。您当前的问题大小。如果您处理法国部门公民的税务申请,任务可能会很艰巨,但是人口规模或处理一项记录的复杂性都不可能增加十倍或一百倍,因此无论哪种方法您现在,可能会继续工作。但是,如果您尝试创建可以在互联网上大量使用的东西,那么算法的复杂性就很关键:任何线性地或线性地依赖于输入大小的东西都将变得非常昂贵,最终处理器速度将无法实现跟上增长。


0

在我的领域(VFX,涵盖路径跟踪,计算机动画,粒子模拟,流体动力学,图像处理等),算法复杂性是至关重要的。没有什么比线性运算时间更糟糕的工作可以希望在任何合理的时间内完成通常达到数百万个顶点,多边形,体素,粒子,纹理像素的输入,尤其是当其中许多东西需要每秒完成许多次才能提供时实时,交互式反馈。

话虽如此,通常在同事之间的讨论中,并没有那么强调算法复杂性,这也许是因为它被认为是理所当然的,而是“基本的”。通常假设,如果您要编写路径跟踪程序,它将在对数或更佳的时间内运行,并且对数据结构(如边界体积层次结构)的熟悉和理解对于读者而言相对来说是微不足道的。我什至有一个熟练的同事一直在说多线程和SIMD比算法更重要,而且我不认为他的意思是您可以期望从并行化冒泡排序中受益匪浅。我认为他说的是,因为他认为我们将应用明智的算法视为理所当然,

如今,很多时候通常将重点放在采用许多这些熟悉的算法上,并使它们更好地利用硬件的基本特征,例如CPU缓存,SIMD寄存器和指令,GPU和多核。例如,英特尔提出了一种采用熟悉的旧BVH并提出“光线包”概念的新颖方法,基本上是通过递归树遍历一次来测试多条相干光线(听起来像这样)它具有复杂性和系统开销,但事实是,现在可以通过SIMD指令和寄存器同时测试这些射线的ray / AABB和ray /三角形相交,这远远超出了它的弥补。

类似catmull-clark细分的东西,在计算机图形学中是非常基本的东西。但是如今,具有竞争性,热门和超高效的是GPU实现,该实现使用Charles Reg流行并后来被Pixar采纳的Gregory Patches近似CC细分。现在,更直接的CPU实现已经过时了,这不一定是因为它已被算法复杂性所取代,而是因为它已被可与GPU完美配合的东西所取代。

如今,这些挑战通常不是以与硬件的基本特征相对独立的方式提出最佳算法,这是很多挑战。我实际上是通过提出一种新颖的加速结构而步入行业的,这种加速结构显着加快了碰撞检测的速度,该碰撞检测使用分层分段方法(而不是空间索引)为90年代的角色和其他软体动画,这使我受益匪浅。职位空缺,但如今这些东西已经不那么令人印象深刻了,因为我在拥有如此令人印象深刻的CPU缓存,多核和可编程GPU之前就发布了它,而如今却没有,而如今,由于基础硬件。


0

我曾经遇到一个问题,即算法通常以O(n)运行,但是在极少数情况下(极少可能)需要O(n ^ 3)时间-“罕见”情况是一个目录,其中包含名称在一个操作系统,而不是另一个。

没人遇到问题。然后,一个客户使用一种策略来命名文件,这些文件将系统地运行到O(n ^ 3)情况,并且只有几百个文件,系统因此陷入了虚拟停顿。结果是必须更改算法。


0

还没有提到的三个:

1)许多实时策略游戏。看一下那些不能分享职位的单位。观察大量单位在受限地形中移动时的寻路过程。我还没有遇到一款与此没有任何实质性问题的游戏,因为根本没有足够的CPU能力。

2)许多优化问题。(编辑:自从我写了这个答案以来,我已经打了一个。我的目标是修剪冗余路径,以使所有节点保持连接路径的最小权重。我的原始方法效果很好,直到我进行了更多的修剪到那个例程,然后我意识到它是2 ^ n。现在它是n ^ 2,即使有时可能会产生稍微不理想的结果。)

3)必须实时处理大量数据的事物。考虑一下DVD:您通常会在4.7gb的时间内获得2小时的视频。考虑一个具有相同分辨率的典型视频文件:这2个小时的视频通常不到1gb。原因是放下DVD规格时,您无法制作价格合理的DVD播放器,该播放器无法足够快地解码更现代的格式。


0

好吧,通常在超级计算机(最大的计算机列表)上运行的任何应用程序都符合条件。这些是多种多样的,但其中很大的子类是物理模拟:

  • 物理模拟:
    • 天气预报
    • 气候模拟
    • 爆炸恒星等的模拟
    • 爆炸核的模拟
    • 汽车/飞机/火车等的空气动力学模拟
    • ...
  • 从射电望远镜数据计算图像
  • 生物应用:
    • 具有DNA序列的东西(我不是很喜欢)
    • 生化物质,例如蛋白质折叠
    • 神经细胞如何协同工作以处理信息的模拟
    • 模拟其他复杂的相互作用,例如生态系统
    • ...
  • ...

这些只是我的首要话题,但只要阅读不同的超级计算机的清单,并意识到这些超级计算机中的每一个都是为了实现某种类型的计算而设计的,而这些计算如果没有这种巨型计算机就不可能实现。

而且,一旦您看到我们确实需要这些机器,就可以通过将这些应用程序速度提高10%来意识到可以节省多少成本。这些代码的任何优化都会直接增加我们从这些机器中获得的结果数量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.