并行算法 Parallel Algorithm -- 提高执行效率

文章目录

    • 1. 并行排序
    • 2. 并行查找
    • 3. 并行字符串匹配
    • 4. 并行搜索
    • 5. 总结

时间复杂度是衡量算法执行效率的一种标准。但是,时间复杂度 != 性能。即便在不降低时间复杂度的情况下,也可以通过一些优化手段,提升代码的执行效率。即便是像10%、20%这样微小的性能提升,也是非常可观的。

算法的目的就是为了提高代码执行效率。当算法无法再继续优化的情况下,该如何来进一步提高执行效率呢?

一种非常简单又非常好用的优化方法,就是并行计算

1. 并行排序

假设要给8GB的数据进行排序,并且,机器的内存可以一次容纳这么多数据。对于排序来说,最常用的就是时间复杂度为O(nlogn)的三种排序算法,归并排序、快速排序、堆排序。从理论上讲,这个排序问题,很难再从算法层面优化了。而利用并行的处理思想,可以轻松将排序问题的执行效率提高很多倍。实现思路有两种。

  • 归并排序并行处理。将8GB的数据划分成16个小的数据集,每个集合包含500MB的数据。我们用16个线程,并行对这16个500MB的数据集进行排序。这16个小集合分别排序完之后,再将这16个有序集合并。

  • 快速排序并行处理。扫描一遍数据,找到数据所处的范围区间。把这个区间从小到大划分成16个小区间。将8GB的数据划分到对应的区间中。针对这16个小区间的数据,启动16个线程,并行地进行排序。等16个线程都执行结束,得到的数据就是有序数据了。

两种处理思路都是分治思想,数据分片,并行处理。区别在于,第一种处理思路是,先随意地对数据分片,排序之后再合并。第二种处理思路是,先对数据按照大小划分区间,然后再排序,排完序就不需要再处理了。

如果要排序的数据不是8GB,而是1TB,那问题的重点就不是算法的执行效率了,而是数据的读取效率。因为1TB的数据肯定是存在硬盘中,无法一次性读取到内存中,这样在排序的过程中,有频繁地磁盘数据的读写。如何减少磁盘的IO操作,就变成了优化的重点。

2. 并行查找

散列表是一种非常适合快速查找的数据结构。

如果是给动态数据构建索引,数据不断加入时,散列表的装载因子会越来越大。为了保证散列表性能不下降,就需要对散列表进行动态扩容。对如此大的散列表进行动态扩容,一比较耗时,一比较消耗内存。比如,给一个2GB大小的散列表进行扩容,扩到原来的1.5倍,也就是3GB大小。这个时候,实际存储在散列表中的数据只有不到2GB,所以内存的利用率只有60%,有1GB的内存是空闲的。

  • 实际上,我们可以将数据随机分割成k份(比如16份),每份中的数据只有原来的1/k,我们针对这k个小数据集分别构建散列表。这样,散列表的维护成本就变低了。当某个小散列表的装载因子过大的时候,我们可以单独对这个小散列表进行扩容,而其他散列表不需要进行扩容。

还是刚才那个例子,假设现在有2GB的数据,我们放到16个散列表中,每个散列表中的数据大约是150MB。当某个散列表需要扩容的时候,我们只需要额外增加150*0.5=75MB的内存(假设还是扩容到原来的1.5倍)。不管从扩容的执行效率还是内存的利用率上,这种多个小散列表的处理方法,要比大散列表高效

  • 查找某个数据时,只需通过16个线程,并行地在16个散列表中查找。查找性能,比一个大散列表的做法,并不会下降,反倒有可能提高。

  • 当往散列表中添加数据时,可以选择将新数据放入装载因子最小的那个散列表中,有助于减少散列冲突。

3. 并行字符串匹配

之前学过的字符串匹配算法有KMP、BM、RK、BF等。如果处理的是超级大的文本,处理的时间可能就会变得很长,如何加快匹配速度?

  • 把大的文本,分割成k个小文本。假设k是16,我们就启动16个线程,并行地在这16个小文本中查找关键词,这样整个查找的性能就提高了16倍。16倍效率的提升,从理论的角度来说并不多。但对于真实的软件开发来说,是一个非常可观的优化。

这里还有一个细节要处理,大文本中的关键词,被一分为二,分割到两个小文本中,会导致尽管大文本中包含这个关键词,但在16个小文本中查找不到它。需要针对这种特殊情况,做特殊处理。

假设关键词的长度是m。在每个小文本的结尾和开始各取m个字符串。前一个小文本的末尾m个字符和后一个小文本的开头m个字符,组成一个长度是2m的字符串。在这个长度为2m的字符串中再重新查找一遍,就可以补上刚才的漏洞。

4. 并行搜索

前面学习过好几种搜索算法,它们是广度优先搜索、深度优先搜索、Dijkstra 最短路径算法、A*启发式搜索算法。对于广度优先搜索算法,也可以将其改造成并行算法。

广度优先搜索是一种逐层搜索的搜索策略。基于当前这一层顶点,可以启动多个线程,并行地搜索下一层的顶点。在代码实现方面,原来广度优先搜索的代码实现,是通过一个队列来记录已经遍历到但还没有扩展的顶点。现在,经过改造之后的并行广度优先搜索算法,需要利用两个队列来完成扩展顶点的工作。

假设这两个队列分别是A和B。多线程并行处理队列A中的顶点,并将扩展得到的顶点存储在队列B中。等队列A中的顶点都扩展完成之后,队列A被清空,再并行地扩展队列B中的顶点,并将扩展出来的顶点存储在队列A。两个队列循环使用,就可以实现并行广度优先搜索算法。

5. 总结

并行计算是一个工程上的实现思路,尽管跟算法关系不大,但在实际的软件开发中,它确实可以非常巧妙地提高程序的运行效率,是一种非常好用的性能优化手段

特别是,当要处理的数据规模大之后,我们无法通过继续优化算法,来提高执行效率的时候,就需要在实现的思路上做文章,利用更多的硬件资源,来加快执行的效率。所以,在很多超大规模数据处理中,并行处理的思想,应用非常广泛,比如MapReduce就是一种并行计算框架。

课后思考

假设有n个任务,为了提高执行的效率,希望能并行执行,但是各个任务之间又有一定的依赖关系,如何根据依赖关系找出可以并行执行的任务?

答:拓扑排序,没有依赖关系的,可以并行处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 | 主题感知的问答生成

Citation: XingC, Wu W, Wu Y, et al. Topic aware neural response generation[C]//Thirty-FirstAAAI Conference on Artificial Intelligence. 2017.动机人机对话在 AI 和 NLP 领域是一项具有挑战性的工作。现存的对话系统包括任务导向的对话系统和非任务导向的聊天机器人。在…

集成学习(西瓜书学习)

集成学习概述一、Boosting1、Boosting2、GBDT (Gradient Boosting Decision Tree)3、XGBoost(Extreme Gradient Boosting)二、Bagging 与 Random Forest1、Bagging2、RF(Random Forest)概述 集成学习&…

爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件

一:爬取词库,使用jieba分词库,自定义dict.txt文件 import jiebafrom urllib.request import urlopen from bs4 import BeautifulSoup# 来源于地图搜索数据,按照网民输入习惯精心筛选使用较多的词条。包含城市地名、公交、购物、餐…

.halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者: 网络安全是当今数字时代的一大挑战,各种勒索病毒如.halo病毒层出不穷,对用户和企业的数据安全构成了严重威胁。本文将介绍.halo勒索病毒,以及如何恢复被其加密的数据文件,同时提供预防措施。在面对被勒索…

阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈&#xf…

周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...

近年来,机器学习技术的快速发展推动了语音、自然语言处理、机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展。回顾机器学习最近30 年的发展历程,各种学习方法推陈出新、不断演进。但是,在此历程中&#xff0c…

Redis常用数据类型的数据结构

文章目录1. Redis 数据库介绍2. 列表(list)3. 字典(hash)4. 集合(set)5. 有序集合(sortedset)6. 数据结构持久化7. 总结1. Redis 数据库介绍 Redis 是一种键值( Key-Val…

python 异常处理相关说明

Python异常及处理方法总结: https://blog.csdn.net/polyhedronx/article/details/81589196?depth_1- .tar(是打包操作,不是压缩) 解包:tar -xvf FileName.tar 打包:tar -cvf FileName.tar DirName —————————…

论文浅尝 | 使用循环神经网络的联合事件抽取

余博涛,南京大学计算机科学与技术系,硕士研究生论文连接:http://www.aclweb.org/anthology/N16-1034发表会议:NAACL-HLT 2016摘要事件抽取(event extraction)是信息抽取中一个特别具有挑战性的问题。针对该…

阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等。 1.浏览器访问优化 (1)减少http…

决策树(西瓜书学习)

算法是死的,思想才是活的! 1. 基本流程 决策树(decision tree):一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个…

动手做个DialoGPT:生成式多轮对话模型

文 | 苏剑林编 | 兔子酱前段时间刷Arixv的时候,发现清华大学开源了一个大规模的中文闲聊语料库LCCC,从开源的文件上来看,这可能是目前开源的数量最大、质量最好的闲聊语料库了,而且还包含了部分多轮对话聊天,总的来说可…

搜索引擎背后的数据结构和算法

文章目录1. 整体系统介绍2. 搜集2.1 待爬取网页链接文件:links.bin2.2 网页判重文件:bloom_filter.bin2.3 原始网页存储文件:doc_raw.bin2.4 网页链接及其编号的对应文件:doc_id.bin3. 分析3.1 抽取网页文本信息3.2 分词并创建临时…

mysql: order by, group by ,having, select, where 执行 顺序

where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。 group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合&#x…

论文浅尝 | DKN: 面向新闻推荐的深度知识感知网络

笔记整理:仲亮靓,东南大学硕士研究生,研究方向是基于知识图谱的推荐系统动机新闻文本的语言非常凝练,其中包含了很多实体和常识知识。但目前的新闻个性化推荐方法都没有利用这些外部知识,也没有使用新闻之间潜在的知识…

聊聊工业界做机器学习的里程碑

文 | 吴海波编 | YY阅读说明,本文的机器学习领域限制于互联网搜索、推荐、广告场景,仅限于个人观点。2017年,我和团队的几个核心去了趟北京,找了各大互联网公司一线实战的同学,交流各自在机器学习上的经验。这次交流让…

直通BAT JVM必考题:Minor GC、Major GC、Full GC的区别

Java面试过程,JVM属于必考题系列: 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:7种JVM垃圾收集器特点,优…

matplotlib绘制多张图、多子图、多例图

绘制多图 关键: fig plt.figure(1) 表示新建第几个图 import matplotlib.pyplot as pltfig plt.figure(1) plt_rec_loss [1,2,3,4,5,6] plt_rec_recall [4,3,6,5,8,9] plt.xlabel("epoch") plt.ylabel("loss") plt.plot(range(len(plt_re…

jieba分词并做分析

Github:结巴分词地址 https://github.com/fxsjy/jieba 几种分词方法的简单使用:一 . jieba安装、示例 pip install jieba,jieba分词的语料是基于人民日报。分词示例1 import jieba 2 3 str1 江州市长江大桥 4 word_object jieba.cut(s…

研讨会 | CCF TF 第 17 期:认知计算产业化落地

CCF TF 技术前线只为技术专家CCFTF第17期主题 认知计算产业化落地2019年05月11日上海斯波特酒店五楼(上海市南丹路15号,徐汇区政府对面)人类迈入人工智能时代,技术的发展使得机器可以从大数据中提取信息,串联成知识&a…