算法优化是有极限的比如说常见的三种O(NlogN):快排、归并、堆排序。在算法上我们几乎没有优化的空间,但是在执行效率上我们可以利用计算机的并发来提高执行效率
并行排序
- 归并排序:可以将数据分成均分N组,然后每组并发的进行归并排序,最后在对这些数据进行合并。
- 快速排序:可以先扫描一遍数据,将数据按从小到大分别分到N个曹中,对应N个线程并发排序,排好即可
归并排序是先排序,后归并;快排是先分组,在排序。
并行查找
在用散列表构建索引时候,当散列过了负载因子阈值时候会进行扩容,如果是一个大的散列表会浪费许多资源。同时也没法通过并行提高查找效率。我们可以将散列表分成N个小散列表在查找时候去N个散列表中一起查找,同时也支持对单个散列表进行扩容和缩容。
并行匹配字符串
模式串是M
- 对于一个大文本,我们可以将文本拆分为N个小文本。用N个线程并发查找。
- 由于有可能俩个小文本结尾会把模式串切分开了,我们要对每个小文本特殊处理,也就是将没个小文本的末尾M个字符和下一个文本的开头M个字符连起来2M个长度在进行匹配
并行搜索
在图的BFS搜索的问题上,我们用一个队列来进行层层搜索,我们可以采用俩个队列A、B,多线程并发处理A将扩展队列放到B中,当A空后在处理B,如此循环。
Map-Reduce实际上就是并行处理框架
衍生问题
上面提到的都是没有依赖的任务,针对有依赖的任务我们可以进行touple排序,没个依赖用一个线程并发去执行。(有依赖就进行拓扑排序)