常见算法在实际项目中的应用

标签: 程序员 算法 | 发表时间:2013-12-04 17:26 | 作者:wangjuanjuan
出处:http://blog.jobbole.com

近日Emanuele Viola在Stackexchange上提了这样的一个问题,他希望有人能够列举一些目前软件、硬件中正在使用的算法的实际案例来证明算法的重要性,对于大家可能给到的回答,他还提出了几点要求:

  • 使用这些算法的软件或者硬件应该是被广泛应用的;
  • 例子需要具体,并给出确切的系统、算法的引用地址;
  • 在经典的本科生或者博士的课程中应该教过这些算法或者数据结构;

Vijay D的回复获得了最佳答案,他的具体回复内容如下:

Linux内核中的基本数据结构和算法

这是一个简单的B+树实现,我写它的目的是作为练习,并以此了解B+树的工作原理。结果该实现发挥了它的实用价值。

一个不经常在教科书中提及的技巧:最小值应该放在右侧,而不是左侧。一个节点内所有被使用的槽位应该在左侧,没有使用的节点应该为NUL,大部分的操作只遍历一次所有的槽位,在第一个NUL处终止。

  • 红黑树 用于调度、虚拟内存管理、跟踪文件描述符和目录条目等;
  • 区间树
  • Radix树,用于内存管理、NFS相关查找和网络相关的功能;

    radix树的一个常见的用法是保存页面结构体的指针;

  • 优先级堆,文字上的描述,主要是在教科书中实现,用于 control group系统;

    包含指针的只允许简单插入的静态大小优先级堆,基于CLR(算法导论)第七章

  • 哈希函数,引用Knuth和他的一篇论文:

    Knuth建议选择与机器字长所能表达的最大整数约成黄金比例的素数来做乘法散列,Chuck Lever 证实了这个技术的有效性;

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

    这些选择的素数是位稀疏的,也就是说对他们的操作可以使用位移和加法来替换机器中很慢的乘法操作;

  • 有些代码,比如这个 驱动,他们是自己实现的哈希函数。
  • 哈希表,用于实现 索引节点文件系统完整性检查等;
  • 位数组,用于处理flags、中断等,在Knuth第四卷中有对其特性的描述;
  • Semaphoresspin locks
  • 二叉树搜索用于 中断处理登记缓存查找等;
  • 使用B-树进行二叉树查找
  • 深度优先搜索和他的变体被应用于 目录配置

    在命名空间树中执行一个修改过的深度优先算法,开始(和终止于)start_handle所确定的节点。当与参数匹配的节点被发现以后,回调函数将会被调用。如果回调函数返回一个非空的值,搜索将会立即终止,这个值将会回传给调用函数;

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.cs.utexas.edu/users/moore/publications/fstrpos.pdf

[2] Handbook of Exact String Matching Algorithms, Thierry Lecroq, 2004 http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

注意:由于Boyer-Moore(BM)自右向左做匹配,有一种可能性是一个匹配分布在不同的块中,这种情况下是不能找到任何匹配的。

如果你想确保这样的事情不会发生,使用Knuth-Pratt-Morris(KMP)算法来替代。也就是说,根据你的设置选择合适的字符串查找算法。

如果你使用文本搜索架构来过滤、网络入侵检测(NIDS)或者任何安全为目的,那么选择KMP。如果你关乎性能,比如你在分类数据包,并应用服务质量(QoS)策略,并且你不介意可能需要在分布在多个片段中匹配,然后就选择BM。

Chromium 浏览器中的数据结构和算法

此树会被分配策略参数化,这个策略负责在C的自由存储空间和区域中分配列表,参见zone.h

同时,代码中还包含了一些第三方的算法和数据结构,例如:

编程语言类库

分配和调度算法

  • 最近最少使用算法有多种实现方式,在Linux内核中是基于 列表实现的;
  • 其他可能需要了解的是先入先出、最不常用和轮询;
  • VAX、VMS系统中大量使用FIFO的变体;
  • Richard Carr时钟算法被用于Linux中页面帧替换;
  • Intel i860处理器中使用了随机替换策略;
  • 自适应缓存替换被用于一些IBM的存储控制中,由于 专利原因在PostgreSQL只有简单的应用;
  • Knuth在TAOCP第一卷中提到的 伙伴内存分配算法被用于Linux内核中,FreeBSD和 Facebook都在使用jemalloc并发分配器;

*nix系统中的核心组件

  • grep和awk都实现了使用Thompson-McNaughton-Yamada构建算法实现从正则表达式中创建NFA;
  • tsort实现了拓扑排序;
  • fgrep实现了 Aho-Corasick 字符串匹配算法
  • GNU grep,据作者Mike Haertel所说, 实现了Boyer-Moore算法
  • Unix中的crypt(1)实现了 哑谜机(Enigma Machine)中的加密算法的变种;
  • Doug Mcllroy基于和James合作的原型实现的 Unix diff,比用来计算Levenshtein距离的标准动态规划算法更好,Linux版本被用来计算最短编辑距离;

加密算法

  • Merkle树,尤其是Tiger Tree Hash的变种,用于点对点的程序,例如 GTK GnutellaLimeWire;
  • MD5用于为软件包提供校验码,还用于*nix系统( Linux实现)中的完整性校验,同时他还支持Windows和OS X系统;
  • OpenSSL实现了需要加密算法,诸如AES,Blowfish,DES,SHA-1,SHA-2,RSA,DES等;

编译器

  • yacc和bison实现了 LALR解析器;
  • 支配算法用于基于SSA形式的最优化编译器;
  • lex和flex将正则表达式编译为NFA;

压缩和图片处理

  • 为GIF图片格式而出现的Lempel-Zivsraf算法在图片处理程序中经常被应用,从一个简单的*nix组件转化为一个复杂的程序;
  • 运行长度编码被用于生成PCX文件(用于Paintbrush这个程序中),压缩BMP文件和TIFF文件;
  • 小波压缩(Wavelet压缩)是JPEG 2000的基础,所以所有生成JPEG 2000文件的数码相机都是实现了这个算法;
  • Reed-Solomon纠错用于 Linux内核、CD驱动、条形码读取,并且结合卷积从航行团队进行图片传输;

冲突驱动条款学习算法(Conflict Driven Clause Learning)

自2000年以来,在工业标准中的SAT(布尔满足性问题)求解器的运行时间每年都在成倍减少。这一发展的一个非常重要的原因是冲突驱动条款学习算 法(Conflict Driven Clause Learning)的使用,它结合了Davis Logemann和Loveland的约束编程和人工智能研究技术的原始论文中关于布尔约束传播的算法。具体来说,工业建模中SAT被认为是一个简单的问 题( 见讨论)。对我来说,这是近代最伟大的成功故事之一,因为它结合了先进的算法、巧妙的设计思路、实验反馈,并以一致的共同努力来解决这个问题。 Malik和Zhang的CACM论文是一个很好的阅读材料。许多大学都在教授这个算法,但通常是在逻辑或形式化方法的课程中。

微博热议

Databricks大数据公司联合创始人 @hashjoin首先并在微博上传播了这个内容:

很多学生和软件工程师都会好奇自己过去学习的算法有什么实际应用的价值。这个StackExchange的回答列出了各种经典算法在几个开源项目中的应用。 http://t.cn/8kAP4yG 作者罗列出了从最基础的hash table到字符串匹配和加密算法等在Chromium和Linux内核的代码。查看开源代码是学习算法实现一个好途径。

大家也纷纷发表了自己的看法:

@GeniusVczh

所谓的算法实现就跟背书一样,所以如果不是为了学习语法,千万不要看那些带代码的编程书,或者编程书里面的代码。以学习为目的的话,东西就自己做,然后自己用,用出翔了,你就知道他为什么不好了。

@左耳朵耗子

说算法没啥用的人基本上说明他只在简单的堆砌业务功能代码的井底中。

@薛正华-中国科学院

我一直觉得在讲述每一个技术前,最好先让大家知道这个技术能干什么,曾经干过什么,将来或许能用在什么地方。这会增加大家对技术的兴趣、理解和灵活运用,会让大家学的更好。这挺重

常见算法在实际项目中的应用,首发于 博客 - 伯乐在线

相关 [常见 算法 项目] 推荐:

常见算法在实际项目中的应用

- - 博客 - 伯乐在线
近日Emanuele Viola在Stackexchange上提了这样的一个问题,他希望有人能够列举一些目前软件、硬件中正在使用的算法的实际案例来证明算法的重要性,对于大家可能给到的回答,他还提出了几点要求:. 使用这些算法的软件或者硬件应该是被广泛应用的;. 例子需要具体,并给出确切的系统、算法的引用地址;.

常见程式算法推演

- hl - 博客园-首页原创精华区
 主要收集一些常见程序的练习题目,您可以借这些题目培养. 一些程序设计逻辑的感觉,对题目的分类只是个大概,方便索引而已,用 C  C#  Java    Python    Scala实现. 背包问题(Knapsack Problem). Eratosthenes筛选求质数. 最大公因数、最小公倍数、因式分解.

Javascript常见加密算法库

- - 脚本爱好者
CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法. CryptoJS在Google Code上的主页是: http://code.google.com/p/crypto-js/.

IT项目的常见风险及应对措施

- - CSDN博客研发管理推荐文章
     以下是笔者总结出来的IT项目的常见风险及应对措施,供大家参考. 做好团队建设工作、从技能上备份人才. 尽量细化需求描述,建立需求变更流程并严格执行. 事先签订合作协议,明晰双方责任和义务,记录过程证据. 事先达成验收共识,不折不扣地按计划执行,多和关键人员汇报及沟通. 多和领导沟通、经常向领导汇报工作情况.

Web项目性能问题常见定位方法梳理

- - 互联网 - ITeye博客
第一类:请求无响应,浏览器始终处于等待状态. 定位方法:kill -3或者jstack先分析线程堆栈,找到当前block的线程. 常见于:外部接口调用无返回或者网络IO阻塞无响应;死锁;死循环;……. 定位方法(这一类问题普遍比较难定位):.     (1)寻找hs_err_pidxxx.log这样的JVM日志.

推荐系统的常见推荐算法的性能比较

- - ITeye博客
数据集是movielens-1M( 下载)版本. 使用SlopeOne算法,每次随机选取6%的用户预测其喜好,进行5次实验,取MAE的均值,得到下表:. 绘制成折线图,如下图所示:.  由此可知,训练集越大,则推荐的准确率越高. 使用ItemCF算法,训练集大小为数据集的90%,每次随机选取30%的用户预测其喜好,进行5次实验,取MAE的均值,得到下表:.

面试10大算法汇总+常见题目解答

- - Java - 编程语言 - ITeye博客
面试10大算法汇总+常见题目解答. 最近更新: 2013年12月15日 持续更新…. 英文版的 “面试10大算法汇总”日最高访问量已高达4,318次. 这说明总结程序员面试算法有实际意义,比读算法书更有效. 下面是中文版的10大算法汇总+有代表性的题目汇总. 这些概念是专门为面试准备的,因为日常编程中我们很少会自己去写一个链表或者做一个图,也不会经常使用没有效率的递归.

大数据量的存储分表常见算法

- - 编程语言 - ITeye博客
当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下 的时 候,mysql的访问速度都很快,但是如果超过200w以上的数据,他的访问速度会急剧下降,影响到我们webapp的访问速度,而且数据量太大的话,如 果用单表存储,就会使得系统相当的不稳定,mysql服务很容易挂掉.

面试常见十大类算法汇总

- - ITeye博客
在Java中,String是一个包含char数组和其它字段、方法的类. 如果没有IDE自动完成代码,下面这个方法大家应该记住: . String/arrays很容易理解,但与它们有关的问题常常需要高级的算法去解决,例如动态编程、递归等. 下面列出一些需要高级算法才能解决的经典问题:. 在Java中实现链表是非常简单的,每个节点都有一个值,然后把它链接到下一个节点.

项目开发中碰到的一些常见的不规范的代码

- - Java - 编程语言 - ITeye博客
从事java EE开发4年多了,从2011年尾开始参与一个大型电子商务系统,一直做到现在. 项目在2012年10月完成了验收,2012年11月开始转运维,巧的是自己跟另外一个同事被客户指定为长期固定运维人员. 虽说是运维,但我们不需要管理服务器,不需要管理数据库,做的工作就是修改上生产后项目出现的一些问题(处理用户报障),同时开发一些新的需求(开发新功能),以及不断的优化重构项目源码,处理一些原功能存在的严重性能问题,提炼或从新定义共用的业务API等.