如何提高制造业流程周期效率效率

您所在的位置: &
优秀程序员必须知道的32个算法,提高你的开发效率
优秀程序员必须知道的32个算法,提高你的开发效率
eoe Android开发者社区
奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。
A搜索算法&&图形搜索算法,从给定起点到给定终点计算出路径。其中使用了一种启发式的估算,为每个节点估算通过该节点的最佳路径,并以之为各个地点排定次序。算法以得到的次序访问这些节点。因此,A*搜索算法是最佳优先搜索的范例。
集束搜索(又名定向搜索,Beam
Search)&&最佳优先搜索算法的优化。使用启发式函数评估它检查的每个节点的能力。不过,集束搜索只能在每个深度中发现最前面的m个最符合条件的节点,m是固定数字&&集束的宽度。
二分查找(Binary Search)&&在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。
分支界定算法(Branch and Bound)&&在多种最优化问题中寻找特定最优化解决方案的算法,特别是针对离散、组合的最优化。
Buchberger算法&&一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。
数据压缩&&采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。
Diffie-Hellman密钥交换算法&&一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。
Dijkstra算法&&针对没有负值权重边的有向图,计算其中的单一起点最短算法。
离散微分算法(Discrete differentiation)
动态规划算法(Dynamic Programming)&&展示互相覆盖的子问题和最优子架构算法
欧几里得算法(Euclidean
algorithm)&&计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。
期望-最大算法(Expectation-maximization
algorithm,又名EM-Training)&&在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算,第一步是计算期望,利用对隐藏变量的现有估计值,计算其最大可能估计值;第二步是最大化,最大化在第一步上求得的最大可能值来计算参数的值。
快速傅里叶变换(Fast Fourier
transform,FFT)&&计算离散的傅里叶变换(DFT)及其反转。该算法应用范围很广,从数字信号处理到解决偏微分方程,到快速计算大整数乘积。
梯度下降(Gradient
descent)&&一种数学上的最优化算法。
哈希算法(Hashing)
堆排序(Heaps)
Karatsuba乘法&&需要完成上千位整数的乘法的系统中使用,比如计算机代数系统和大数程序库,如果使用长乘法,速度太慢。该算法发现于1962年。
LLL算法(Lenstra-Lenstra-Lovasz&&lattice
reduction)&&以格规约(lattice)基数为输入,输出短正交向量基数。LLL算法在以下公共密钥加密方法中有大量使用:背包加密系统(knapsack)、有特定设置的RSA加密等等。
最大流量算法(Maximum
flow)&&该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这样一个流的值。最大流问题可以看作更复杂的网络流问题的特定情况。最大流与网络中的界面有关,这就是最大流-最小截定理(Max-flow
min-cut theorem)。Ford-Fulkerson 能找到一个流网络中的最大流。
合并排序(Merge Sort)
牛顿法(Newton's method)&&求非线性方程(组)零点的一种重要的迭代法。
Q-learning学习算法&&这是一种通过学习动作值函数(action-value
function)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。Q-leanring的优势是,在不需要环境模型的情况下,可以对比可采纳行动的期望效用。
两次筛法(Quadratic Sieve)&&现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法Number Field
Sieve)。对于110位以下的十位整数,它仍是最快的,而且都认为它比数域筛法更简单。
RANSAC&&是&RANdom SAmple
Consensus&的缩写。该算法根据一系列观察得到的数据,数据中包含异常值,估算一个数学模型的参数值。其基本假设是:数据包含非异化值,也就是能够通过某些模型参数解释的值,异化值就是那些不符合模型的数据点。
RSA&&公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用,大家也相信它有足够安全长度的公钥。
Sch&nhage-Strassen算法&&在数学中,Sch&nhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为:O(N
log(N) log(log(N))),该算法使用了傅里叶变换。
单纯型算法(Simplex
Algorithm)&&在数学的优化理论中,单纯型算法是常用的技术,用来找到线性规划问题的数值解。线性规划问题包括在一组实变量上的一系列线性不等式组,以及一个等待最大化(或最小化)的固定线性函数。
奇异值分解(Singular value
decomposition,简称SVD)&&在线性代数中,SVD是重要的实数或复数矩阵的分解方法,在信号处理和统计中有多种应用,比如计算矩阵的伪逆矩阵(以求解最小二乘法问题)、解决超定线性系统(overdetermined&linear
systems)、矩阵逼近、数值天气预报等等。
求解线性方程组(Solving a system of linear
equations)&&线性方程组是数学中最古老的问题,它们有很多应用,比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组,可以使用高斯&约当消去法(Gauss-Jordan
elimination),或是柯列斯基分解(&Cholesky decomposition)。
Strukturtensor算法&&应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域(&homogenous
region),看看它是否属于边缘,还是是一个顶点。
合并查找算法(Union-find)&&给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。不相交集(disjoint-set)的数据结构可以跟踪这样的切分方法。合并查找算法可以在此种数据结构上完成两个有用的操作:
查找:判断某特定元素属于哪个组。
合并:联合或合并两个组为一个组。
维特比算法(Viterbi
algorithm)&&寻找隐藏状态最有可能序列的动态规划算法,这种序列被称为维特比路径,其结果是一系列可以观察到的事件,特别是在隐藏的Markov模型中。
以上就是Christoph博士对于最重要的算法的调查结果,InfoQ的读者们?你们熟悉哪些算法?又有哪些算法是你们经常使用的?
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
程序员的30岁,是个伤不起的现象。你不可能敲一辈子的代码,敢问
Web App开发中会面临越来越“重”的问题,如果在开始
作为Android开发者,最头疼是什么?相信大家会异口同
七夕,是让人听起来就觉得美好的日子,牛郎织女鹊桥相
JBuilder 2006是一款强大的Java企业级开发平台,其集成了几乎所有的Java技术,涵盖了软件开发生命周期的各个过程。本书深入浅出
Windows Phone专家
Android开发专家
51CTO旗下网站博客访问: 5087214
博文数量: 238
博客积分: 10424
博客等级: 少将
技术积分: 14073
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
作者:gfree.
博客:blog.focus-linux.net & linuxfocus.blog.chinaunix.net&&本文的copyleft归gfree.所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。======================================================================================================很早就建立多核、多线程的博文目录,但一直没有写相关文章,后来干脆把这两个目录合为一个,叫做并行编程。今天就开始第一篇吧,写一点自己关于提高程序并行效率的一点经验。并行编程从多线程编程,多进程编程,直到现在的多核编程。目前多核CPU应用已经越来越广泛了,大部分的电脑都是多核了。所以提高多核下的程序并发性,可以极大的提高程序的效率。先从最基本的锁说起吧。在多核下,锁的代价比以前更高了,这个稍后会提到。为了提高并发性,最好的追求是无锁。如果锁是无法避免的,那么要让锁的粒度尽量小。1. 如何做到无锁呢?1)一般我们可以牺牲空间来换取性能。比如一些统计信息,可以建立per CPU的变量,即每个CPU都有一份统计信息,当计算总的统计信息时,需要加上所有的per CPU的统计信息。2)可以使用RCU机制——RCU的具体用法,问google去:D。使用RCU机制,可以避免锁的使用;3)良好的设计。举个简单的例子,读写队列。读线程和写线程分别维护两个指针,来实现队列的入队和出队。2. 缩小锁的粒度当锁的粒度越小,竞争发生的概率也就越小,程序的并发性也就越好。举个简单的例子,一个hash表。如果只有一把锁用于保护hash表,那么为了提高并发性,可以为每一个桶slot建立一把锁来取代原来的hash表的全局锁。显然,后者的并发性一定强于前者多倍。3. 选择恰当的锁1)如关键代码运行时间很短,可以使用spin lock,来取代mutex或者semphore。原因有二,一个是mutex和semphore为系统调用,这个cost较高,需要用户态和内核态的转换。另外一个原因是当等待锁的时候,该线程会被加入到sleep对列。这两个原因都影响了并发性。当然,如果关键代码的运行时间比较长,就不要使用spin lock,而使用mutex或者semphore。因为spin lock时,等待的线程是一直自旋spin,这白白浪费了CPU的资源。2)如果锁包含的对象,在被修改的过程中,可以合法访问——即不造成程序crash,那么可以使用seqlock。seqlock对于写者来说,是一个真的锁,即不允许多个写者同时修改对象。但是对于读者来说,根本没有加锁和解锁的过程,读者通过检查锁的seq number,来检查对象的数据是否一致。seqlock对于读取多修改少的情况,非常适用。关于CPU的cache。对于多核CPU来说,每个CPU都有自己的data cache和code cache。这里指的是L1 cache,我记得L2 cache就是多CPU共享的了。那么当一个变量同时存在于多个CPU cache时,当一个CPU更新这个变量时,它的cache自然会被更新。但是因为多个CPU的存在,那么其它CPU的cache同样也需要更新。一般来说cache更新有两种机制,write-back和write-through。不同的厂商的CPU采取的机制也不同,但是更新cache的代价却是不可避免的。那么我们为了提高效率,就要尽量避免这种cache的更新。如何做呢?就是让变量不要存在于多个CPU的cache中。这个就有各种方法了。像上面提到的per cpu的变量,以及不同CPU使用不同的变量。还有上面提到的锁的问题。当加锁时,会强制CPU更新cache,来保证数据的一致性。另外,cache除了有cache间的同步问题。还有一些情况,会导致CPU的cache被清除。1)进程切换,即CPU要运行一个新的task,这时CPU会清空以前的cache;2)发生中断,处理中断的CPU会清空cache;应该还有其他的情况,会导致CPU清空自己的cache。但是我一时想不起那么多了,欢迎大家补充。最后一个关于提高并行效率的方法就是优秀的架构和软件设计。关于这点也是听上去最虚的,没法具体说明,但是它确实最有效的方法。不过这个需要具体问题具体分析。一个简单的原则就是在硬件资源上进行划分,如内存,不同CPU使用不同的内存。对于软件来说,将整个工作,划分为耦合性很低的不同任务,使不同任务可以同时运行。并且可以利用CPU的亲和性,使某个task只在某CPU上运行,减少或禁止进程切换到另外一个CPU上。这样既保证了CPU的cache不会被清空,也使cache的命中率大大提高。啰啰嗦嗦的说了一大堆,基本上自己刚刚对于并行编程的一点经验总结吧。做了比较长时间的多核编程了,一直没有认真的总结一下经验。现在这么一写,发现还是有不少东西值得再研究一下细节,再拓展一下的。等我以后的总结吧:D
阅读(7610) | 评论(13) | 转发(8) |
相关热门文章
给主人留下些什么吧!~~
platinaluo: can you paste some sample code segment?.....OK. I will paste some codes later. Now I am investigating on the computer architecture, and the basic knowledge of network.
can you paste some sample code segment?
alexhak2004: 我是先入为主了,因为看到了spin_lock,所以以为就是内核态了。。。
其实,我觉得,其实你提到的最后一点,也就是优秀的架构和软件设计,我认为是最难的。。。很.....是的。所以一般设计都不会有一个通用的设计,必须要根据应用场景,做调整,也包括你说的如何折中。
我是先入为主了,因为看到了spin_lock,所以以为就是内核态了。。。
其实,我觉得,其实你提到的最后一点,也就是优秀的架构和软件设计,我认为是最难的。。。很多时候,需要做一些折中。比如,视频的编解码就是一例,为了达到程序并行,可能会考虑把一幅图像分为多个slice进行编码,每个slice作为一个线程处理,但是这就使得不同的slice间不能相互参考,从而降低了整体的压缩效率。。。
alexhak2004: &semphore为系统调用&这句话好像有点问题哦,内核也可以使用semphore,当然后面说的赞同。.....呵呵,我说系统调用是基于应用层的并发而说的。对比spinlock,semphore为系统调用。
内核确实也可以使用semphore。你的意见很对,我应该加上上下文环境,说明是应用层的开发。
请登录后评论。如何有效提高工作效率―流程制定_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何有效提高工作效率―流程制定
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢本周关注:&&
[04-19][04-14][04-14][04-13][04-11][04-11][04-10][04-05][04-05][04-01]
新余市建设项目环保审批备案月报
[04-11][03-12][02-12][01-17][12-06][11-20]
优化审批流程
提高审批效率
为进一步优化审批流程、提高审批效率,市环保窗口根据《新余市人民政府关于规范市政府部门行政审批行为改进行政审批有关工作的通知》(余府发〔2015〕26号)要求,结合市局相关科室工作实际,拟定了《市环保局关于报送行政许可事项审查细则备案的函》,最近已报送至市政府法制办备案。
据了解,该审查细则包括《危险废物转移行政审批事项审查工作细则》、《排污许可证(大气、水)核发事项审查工作细则》、《建设项目环境影响评价文件审批审查工作细则》等10项工作细则。每项工作细则又逐条列明了总则、审查环节、审查内容、审查标准和审查要点,具体到受理、审查、决定、送达等各个环节,流程清晰、限时办结,分工到位、责任明确,具有较强的针对性和可操作性,确保行政审批全过程依法有序进行。(阮永久)
本信息真实性未证实,仅供参考。请谨慎采用,风险自负。

我要回帖

更多关于 流程周期效率 的文章

 

随机推荐