程序员必会的40种算法
上QQ阅读APP看书,第一时间看更新

1.4 算法设计技术

算法是求解实际问题的数学方案。我们在设计和微调算法时,需要牢记以下三个设计的关注点:

  • 第一点:算法是否能产生我们预期的结果?
  • 第二点:这是获取预期结果的最佳方法吗?
  • 第三点:算法在更大的数据集上表现怎么样?

在为问题设计解决方案前,最好先理解问题本身的复杂度。例如,如果将问题描述为其需求和复杂度,则有助于为其设计恰当的求解方案。一般来说,算法可以根据问题的特点分为以下几种类型:

  • 数据密集型算法:数据密集型算法旨在处理大量数据,其处理需求相对简单。压缩大型文件的算法就是数据密集型算法一个典型例子。对于这类算法,待处理数据的规模远大于处理引擎(单节点或集群)的内存规模,因此可能需要开发一个迭代处理设计来根据要求高效地处理数据。
  • 计算密集型算法:计算密集型算法具有大量计算需求而不涉及大量数据。一个简单的例子就是寻找大素数的算法。寻找恰当策略将算法划分为不同的阶段,使得其中至少有一些阶段是可以并行化的,这是最大限度地提升算法性能的关键。
  • 既是数据密集型算法,也是计算密集型算法:有些算法需要处理大量数据,同时也有大量计算需求。实时视频信号上的情感分析算法就是这种算法的一个很好的例子,其中数据和计算需求都很大。这类算法是最耗费资源的算法,需要对算法进行精心设计,并对可用资源进行智能分配。

更深入地研究问题的数据和计算将有助于刻画问题的复杂度和计算需求。下面讨论这方面的内容。

1.4.1 数据维度

将算法从问题的数据维度上归类,我们需要查看数据的体积(volume)、速度(velocity)和多样性(variety),这三个方面被称为数据的3V,其定义如下:

  • 体积:指算法将要处理的数据的预期规模;
  • 速度:指使用该算法时新数据生成的预期速度,它可以为零;
  • 多样性:量化了所设计算法预计要处理多少种不同类型的数据。

图1-5更加详细地展示了数据的3V,其中心是最简单的数据,体积小且多样性和速度都很低。逐渐远离中心时,数据复杂度逐渐增加,这可以从三个维度中的一个或多个维度上增加。例如,在速度维度上,最简单的是批处理过程,其次是周期性处理过程,然后是近实时处理过程,最后是实时处理过程。实时处理从数据速度维度上看是最复杂的情况。例如,由一组监控摄像头收集的实时视频信号的集合具有体积大、速度快和多样性高的特点,因此可能需要恰当的设计才能有效地存储和处理数据;而由Excel创建的单个简单.csv文件则具有体积小、速度慢和多样性低的特点。

图 1-5

例如,如果输入数据仅有一个简单的csv文件,则数据体积小,速度和多样性都低。另一方面,如果输入数据是监控摄像头的实时信号,则数据体积大,速度和多样性也高,在为其设计算法的时候应该牢记这一点。

1.4.2 计算维度

问题的计算维度与待求解问题的处理需求和计算需求有关。算法的处理需求确定了其应采取何种设计才最有效。例如,深度学习算法一般都需要大量的处理能力。这意味着,深度学习算法都应尽可能采用多节点并行架构。

实例

假定要对视频展开情感分析,也就是将视频的不同部分恰当地用人类的悲伤、幸福、恐惧、喜悦、挫折和狂喜等情绪进行标记。这是一项计算密集型的工作,需要大量的计算能力。如图1-6所示,为了对算法的计算维度进行设计,我们将处理工作分为五个任务,由此构成两个阶段。所有的数据转换和准备工作都在三个mapper中完成。为了实现这个目的,我们将视频分为三个不同的部分,统称为切片(split)。在执行mapper后,将处理后的视频输入到两个称为reducer的聚合器中。为了完成所需的情感分析,这两个reducer根据情感对视频进行分组。最后,将结果合并在输出中。

图 1-6

007-1a 注意,mapper数量将直接转化为算法运行时的并行度。mapper和reducer的最佳数量取决于数据的特性、所用算法的类型和可用资源的数量。