数据结构与算法-如何利用并行来提高算法效率

算法优化是有极限的比如说常见的三种O(NlogN):快排、归并、堆排序。在算法上我们几乎没有优化的空间,但是在执行效率上我们可以利用计算机的并发来提高执行效率

并行排序

  • 归并排序:可以将数据分成均分N组,然后每组并发的进行归并排序,最后在对这些数据进行合并。
  • 快速排序:可以先扫描一遍数据,将数据按从小到大分别分到N个曹中,对应N个线程并发排序,排好即可

归并排序是先排序,后归并;快排是先分组,在排序。

并行查找

在用散列表构建索引时候,当散列过了负载因子阈值时候会进行扩容,如果是一个大的散列表会浪费许多资源。同时也没法通过并行提高查找效率。我们可以将散列表分成N个小散列表在查找时候去N个散列表中一起查找,同时也支持对单个散列表进行扩容和缩容。

并行匹配字符串

模式串是M

  • 对于一个大文本,我们可以将文本拆分为N个小文本。用N个线程并发查找。
  • 由于有可能俩个小文本结尾会把模式串切分开了,我们要对每个小文本特殊处理,也就是将没个小文本的末尾M个字符和下一个文本的开头M个字符连起来2M个长度在进行匹配

并行搜索

在图的BFS搜索的问题上,我们用一个队列来进行层层搜索,我们可以采用俩个队列A、B,多线程并发处理A将扩展队列放到B中,当A空后在处理B,如此循环。

Map-Reduce实际上就是并行处理框架

衍生问题

上面提到的都是没有依赖的任务,针对有依赖的任务我们可以进行touple排序,没个依赖用一个线程并发去执行。(有依赖就进行拓扑排序)