我们在算法设计之初通常只会考虑单线程执行的情况。在实际生产中却有很多情况下可以做并行化优化。

数据分区

比如我们需要N个文件进行排序成一个大文件,那么我们可以启动N条线程对每个问候同时进行排序,然后对这个几个排序好的小文件进行归并排序。

那么对于搜索也是一样的,比如对一个大文件文本进行字符串匹配查找,可以将文件分成K块,然后启用K条线程对每个块进行查找,加速搜索过程,这里需要的注意的是对文件块的划分,因为会隔断字符串,所以需要查找后隔断部分再次搜索避免遗漏。

数据分区思想再实践中十分常用,Google的MapReduce框架就是基于这一思想实现的,shareding-jdbc在查询的时候也是应用到了这一理念。

流程分步

比如我们需要获取某个网站的所有图片并对其分类,我们可以将其分为获取图片和分类两个步骤:开N个线程获取图片存在本地,开M个线程对本地的文件进行排序。

对于编译来说也是如此,编译过程是多个阶段的,每个阶段可以交由不同的线程处理,每个阶段也会生成不同的中间文件。

流程分步的优势很多,加速是一方面,另一方面是可以存储进度,失败后可以不用重头再来。

标签: 算法基础

添加新评论