常见算法在实际项目中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原文出处:StackExchange译文出处:infoQ
近日Emanuele Viola在Stackexchange上提了这样的一个问题,他希望有人能够列举一些目前软件、硬件中正在使用的算法的实际案例来证明算法的重要性,对于大家可能给到的回答,他还提出了几点要求:
使用这些算法的软件或者硬件应该是被广泛应用的;
例子需要具体,并给出确切的系统、算法的引用地址;
在经典的本科生或者博士的课程中应该教过这些算法或者数据结构;
Vijay D的回复获得了最佳答案,他的具体回复内容如下:
Linux内核中的基本数据结构和算法
双向链表和B+ 树,代码中的注释将会告诉你一些教科书中不能学到的内容:
这是一个简单的B+树实现,我写它的目的是作为练习,并以此了解B+树的工作原理。结果该实现发挥了它的实用价值。
…
一个不经常在教科书中提及的技巧:最小值应该放在右侧,而不是左侧。一个节点内所有被使用的槽位应该在左侧,没有使用的节点应该为NUL,大部分的操作只遍历一次所有的槽位,在第一个NUL处终止。
互斥锁、红黑树区间树
优先级堆,文字上的描述,主要是在教科书中实现,用于/techreports/reports/citi-tr-00-
1.pdf
这些选择的素数是位稀疏的,也就是说对他们的操作可以使用位移和加法来替换机器中很慢的乘法操作;
有些代码,比如这个哈希表,用于实现文件系统完整性检查等;
Semaphores和中断处理、使用B-树进行二叉树查找;
目录配置;
在命名空间树中执行一个修改过的深度优先算法,开始(和终止于)start_handle所确定的节点。当与参数匹配的节点被发现以后,回调函数将会被调用。如果回调函数返回一个非空的值,搜索将会立即终止,这个值将会回传给调用函数;
合并排序用于文件系统管理等;
在某个Knuth-Morris-Pratt 字符串匹配;
Knuth、Morris和 Pratt [1]实现了一个线性时间复杂度字符串匹配算法。该算法完全规避了对转换函数DELTA的显式计算。其匹配时间为O(n)(其中n是文本长度),只使用一个辅助函数PI[1…m](其中m是模式的长度),模式的预处理时间是O(m)。PI这个数组允许DELTA函数在需要时能迅速运行。大体上,对任意状态q=0,1,…,m和任意SIGMA中的字符”a”,PI[“q”]保存了独立于”a”的信息,并用于计算DELTA(“q”, “a”)。由于PI这个数组只包含m个条目,而DELTA包含O(m|SIGMA|)个条目,我们通过计算PI进而在预处理时间保存|SIGMA|的系数,而非计算DELTA。
[1] Cormen, Leiserson, Rivest, Stein Introdcution to Algorithms, 2nd Edition, MIT Press
[2] See finite automation theory
Boyer-Moore模式匹配,如下是引用和对其他算法的使用建议;
Boyer-Moore字符串匹配算法:
[1] A Fast String Searching Algorithm, R.S. Boyer and Moore. Communications of the Association for Computing Machinery,
20(10), 1977, pp. 762-772. http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf
注意:由于Boyer-Moore(BM)自右向左做匹配,有一种可能性是一个匹配分布在不同的块中,这种情况下是不能找到任何匹配的。
如果你想确保这样的事情不会发生,使用Knuth-Pratt-Morris(KMP)算法来替代。也就是说,根据你的设置选择合适的字符串查找算法。
如果你使用文本搜索架构来过滤、网络入侵检测(NIDS)或者任何安全为目的,那么选择KMP。如果你关乎性
能,比如你在分类数据包,并应用服务质量(QoS)策略,并且你不介意可能需要在分布在多个片段中匹配,然后就选择BM。
Chromium 浏览器中的数据结构和算法
Voronoi图
二叉树
AVL树
用于压缩的计算自动机的后缀
苹果实现的布氏算法
编程语言类库
排序、搜索和堆操作算法;
Boost C++ 类库,包含了诸如Boyer-Moore和Knuth-Morris-Pratt字符串匹配算法等;
分配和调度算法
最近最少使用算法有多种实现方式,在Linux内核中是基于Richard Carr的自适应缓存替换被用于一些IBM的存储控制中,由于伙伴内存分配算法被用于Linux内核中,FreeBSD和Aho-Corasick 字符串匹配算法;
GNU grep,据作者Mike Haertel所说,哑谜机(Enigma Machine)中的加密算法的变种;
Doug Mcllroy基于和James合作的原型实现的Merkle树,尤其是Tiger Tree Hash的变种,用于点对点的程序,例如LimeWire;
Linux实现)中的完整性校验,同时他还支持Windows和OS X系统;
LALR解析器;
支配算法用于基于SSA形式的最优化编译器;
lex和flex将正则表达式编译为NFA;
压缩和图片处理
为GIF图片格式而出现的Lempel-Zivsraf算法在图片处理程序中经常被应用,从一个简单的*nix组件转化为一个复杂的程序;
运行长度编码被用于生成PCX文件(用于Paintbrush这个程序中),压缩BMP文件和TIFF文件;
小波压缩(Wavelet压缩)是JPEG 2000的基础,所以所有生成JPEG 2000文件的数码相机都是实现了这个算法;
Reed-Solomon纠错用于见讨论)。对我来说,这是近代最伟大的成功故事之一,因为它结合了先进的算法、巧妙的设计思路、实验反馈,并以一致的共同努力来解决这个问题。@hashjoin首先并在微博上传播了这个内容:
很多学生和软件工程师都会好奇自己过去学习的算法有什么实际应用的价值。这个StackExchange的回答列出了各种经典算法在几个开源项目中的应用。@GeniusVczh:
所谓的算法实现就跟背书一样,所以如果不是为了学习语法,千万不要看那些带代码的编程书,或者编程书里面的代码。以学习为目的的话,东西就自己做,然后自己用,用出翔了,你就知道他为什么不好了。
@薛正华-中国科学院:
我一直觉得在讲述每一个技术前,最好先让大家知道这个技术能干什么,曾经干过什么,将来或许能用在什么地方。这会增加大家对技术的兴趣、理解和灵活运用,会让大家学的更好。这挺重要
2 赞 9 收藏