`
xitonga
  • 浏览: 583982 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

原文出处:StackExchange译文出处:http://blog.jobbole.com/52669/

近日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, 2004http://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

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

@左耳朵耗子

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

@薛正华-中国科学院

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

分享到:
评论

相关推荐

    常见的加密算法实现源码分享-Java语言编写

    常见的加密算法实现--Java语言编写,花费一个多月认真整理出来的可直接运行的源码文件。下载RAR文件后,对压缩包进行...这些算法可以直接运用到实际项目中,希望对您的实际工作和学习有帮助,喜欢的点个赞呗,谢谢。

    Python算法集合助力开发人员提升自己的算法能力解决各种复杂的问题

    Python算法集是一个包含各种常见算法和数据结构实现的集合,旨在帮助开发人员更轻松地解决各种问题。这个算法集涵盖了排序算法(如冒泡排序、快速排序)、搜索算法(如二分查找、广度优先搜索)、图算法(如最短路径...

    Android 项目优化、面试题集,包含Android、Java、数据结构、算法、个人blog备份等。.zip

    数据结构是计算机存储、组织数据的方式,它涉及到数据的...在实际应用中,数据结构和算法常常是密不可分的。通过对数据结构的理解和运用,以及对算法的学习和研究,可以帮助我们更有效地解决实际问题,提升编程能力。

    【运动规划算法项目实战】如何加载csv文件的路径信息(ROS源码)

    在实际应用中,我们通常需要将预先规划好的路径以某种方式加载到程序中进行后续处理和运动控制。而CSV文件作为一种常见的数据交换格式,也被广泛用于存储路径信息。因此,学会如何加载CSV文件中的路径信息将是非常有...

    RUST web框架axum快速入门教程

    RUST web框架axum的快速入门教程: 1. axum框架概述:axum是一个用RUST编程语言编写的web框架,它是一个高...6. 结论:通过本教程的学习,读者可以掌握axum的基本使用方法,并在实际项目中应用axum实现web应用的开发。

    Java八股文,面试中的黄金法则!

    java八股文Java八股文是指在Java开发领域面试中常见的一些固定问题,涵盖了Java基础、Java高级、设计模式、数据结构与算法、框架技术等多个方面。这些问题旨在评估应聘者的Java编程能力和技术水平。 Java八股文的...

    python项目基于混沌系统敏感文本信息加密算法研究(django).zip

    它不仅提供了一个实验平台来探索和验证基于混沌理论的新型加密技术,而且还能够为实际的安全应用提供支持。通过这种创新的加密方法,可以提升对抗先进持续威胁(APT)和常见加密攻击的能力,保护机密信息不被未授权...

    基于python的信息加密解密网站.zip

    这些工具可以帮助用户在实际项目中应用所学知识,提高自己的技能水平。为了方便用户学习,这个平台还提供了一系列的示例代码。这些代码涵盖了不同类型的加密和解密任务,包括文本加密、图片加密和音频加密等。通过...

    Visual C++串口通信工程开发实例导航

    本书以串口通信技术在各行业(情况)的实际应用为内容,以实例导航的方式向读者介绍了如何将串口技术、相应的行业算法合理地实施到项目开发中。\r\n 本书的8个串口通信案例都是精挑细选后才确定的,它们基本覆盖了串口...

    卡马克卷轴算法_地图双缓冲

    四、卡马克卷轴的实际应用项目分析 19 4.1项目测试概述 19 4.2事件查看器的数据比较 20 4.3内存监视器的数据比较 22 4.4真机测试比较 23 结论 23 致谢 24 参考文献 24 附录 24 卡马克卷轴的相关历史 24

    计算机毕业设计 - Android瀑布流实现,类似于蘑菇街和迷尚 应用里的排列,保证可靠运行,计算机毕业生可参考,免费资源下载

    Android瀑布流实现,本项目旨在开发一个类似于蘑菇街和迷尚等应用中常见的瀑布流布局排列的Android应用程序。瀑布流布局以其独特的排列方式,能够有效地展示大量图片信息,同时为用户带来良好的浏览体验。 在本项目...

    前端面试常见问题集锦册

    这些问题可以涉及到前端开发的基础知识、实际项目经验、算法与数据结构、框架的使用等方面。 集锦册: 这意味着这是一本集结了前端面试中常见问题的书籍或资源。集锦册的概念是将一系列相关的问题或知识点集中整理...

    AI人工智能算法工程师体系课(31周)

    第三步——机器学习算法:学习常见的机器学习算法,如支持向量机、逻辑回归、决策树、朴素贝叶斯分类器等,并理解它们的工作原理和应用场景 第四步——实践项目:通过编写代码来实现学习到的算法,比如手写数字...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    c语言c++项目源代码_C语言10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等.rar

    除此之外,项目还包含了链表、栈、队列等其他常见数据结构的实现,以及基于这些数据结构的实际应用案例。每个实例都提供了详细的注释和测试代码,确保学习者能够轻松上手并进行二次开发或定制。 这些项目源码不仅...

    对使用 Python 学习数据结构和算法的资料进行收集并学习.zip

    同时,我们也鼓励你在学习的过程中不断实践、探索和创新,将所学知识应用于实际场景,发挥Python的强大潜力。Python是一门强大且易学的编程语言,广泛应用于数据科学、机器学习、Web开发等多个领域。为了帮助大家更...

    php项目开发中用到的快速排序算法分析

    本文实例讲述了php项目开发中用到的快速排序算法。分享给大家供大家参考,具体如下: 实际上在,做web开发,比较少遇到使用一些算法之类的...学学一些常见的算法,对于实现特殊的应用还是有帮助的。比如有些时候我们依

    单片机原理及应用课程标准(2).doc

    知识目标 1)掌握单片机内部资源的规划方法 2)掌握单片机系统中的基本技术概念,并在设计项目中灵活运用。 3)掌握程序设计过程中解决常见问题的程序算法。 4)掌握单片机产品的调试、测试的方法。 5)掌握单片机...

Global site tag (gtag.js) - Google Analytics