那些算法在哪里?

操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】 首次适应算法(First Fit)、 最佳适应算法(Best Fit)、 最坏适应算法(Worst Fit)【又称“最大适应算法”(Largest Fit)】、 临近适应算法(Next Fit) 阅读详情

Vijay D写到:

在我看来,一个系统背后主要发挥作用的算法更容易在非算法课程上找到,这和应用数学中的成果比理论数学中更容易出现在应用中是一个道理。在讲座中,很少有实际问题能够精确匹配到一个抽象问题。归根结底,我认为没有理由让流行的算法课程,诸如Strassen乘法,AKS素性测试、或者Moser-Tardos算法与底层实际问题,如实现视频数据库、优化的编译器、操作系统、网络拥堵控制系统或者其他系统相关。这些课程的价值是学习利用错综复杂的方法发现问题的脉络而找出有效的解决方案。高级算法和简单算法的分析都不简单。正是由于这个原因,我不会忽略简单随机算法或者PageRank。

我想你可以选择任何一个大型软件,并在内部找到它所采用的基础和高级的算法。作为一个研究案例,我选择了Linux内核,并会示例一些Chromium里面的例子。

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

Linux内核(源代码的链接在github)。

1.链表、双向链表、无锁链表。

2.B+ 树,这是一些你无法在教科书上找到的说明。

一个相对简单的B+树的实现。我把它作为一个学习练习来帮助理解B+树是如何工作的。这同样也被证明是有用的。

...

一个在教科书中并不常见的技巧。最小的值在右侧而不是在左侧。所有在一个节点里用到的槽都在左侧,所有没有用到的槽包含了空值(NUL)。大多数操作只简单地遍历所有的槽一次并在第一个空值时(NUL)终止。

3.优先排序列表 用于 互斥量、驱动等等。

4.红黑树用于调度、虚拟内存管理、追踪文件描述符和目录项等。

5.区间树

6.根树用于内存管理,NFS相关查询和网络相关功能。

根树的一个通用的用处是存储指针到结构页中。

7.优先级堆,如其名称的教科书实现,用于cgroup。

《简单的基于CLR的只插入的,含有指针的定长优先级堆》第七章

8.哈希函数,参考了Knuth和一篇论文。

Knuth建议,用乘法哈希的机器字来表示接近黄金比例的素数的最大整数。Chuck Lever验证了该技术的有效性:

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

这些素数的选择是位稀疏的,他们可以通过移位和加法操作,而不必使用乘法器,乘法器是很慢的。

9.有的代码,比如这个驱动,实现了他们自己的哈希函数。

使用了一种旋转哈希算法的哈希函数

Knuth, D. 《计算机程序设计艺术, 卷 3: 排序与搜索》, 第6、7章. Addison Wesley, 1973

10.哈希表用于实现inode、文件系统完整性检测等等。

11.位数组用于处理标志位、中断等等。并在Knuth那本书的卷4中阐述。

12.信号量和自旋锁

13.二分查找用于中断处理,寄存器缓存查询等等。

14.B树的二分查找。

15.深度优先搜索被广泛地用于目录配置中。

执行一个修改过的命名空间树的深度优先遍历,以指定的start_handle节点开始(及结束)。回调函数会在任何一个参数匹配的节点被发现时被调用。如果回调函数返回了一个非0值,搜索将会立即终止并且将其返回给调用者。

16.广度优先搜索用于检测运行时锁定的正确性。

17.链表中的归并排序用于垃圾收集、文件系统管理等等。

18.冒泡排序在一个驱动库中也有一个令人惊讶的实现。

19.Knuth-Morris-Pratt 字符串匹配,

根据Knuth、Morris和Pratt[1]实现了一个线性时间的字符串匹配算法。他们的算法避免了转换函数的显式地计算DELTA。对于长度为n的文本,其匹配时间是O(n),对于长度为m的模式(pattern),仅使用一个辅助函数PI[1 . .m],预先计算模式的时间为O(m)。数组PI允许转换函数DELTA被实时有效地计算。粗略地说,对于任何状态"q"= 0,1,…、m和在SIGMA中的任何字符"a",PI["q"]的值包含的信息是独立的"a"并需要计算DELTA("q","a") [2]。既然PI只有m个记录,而DELTA有O(m |SIGMA|)个记录,在预处理时间计算PI而不是DELTA的时候,我们可以节省一个因数|SIGMA|

[1] Cormen, Leiserson, Rivest, Stein,算法介绍,第二版,MIT出版社

[2] 见有限自动机原理

20.Boyer-Moore 模式匹配是在找替代品时的参考和建议。

实现了Boyer-Moore字符串匹配算法:

[1] 《一个快速的字符串搜索算法》,R.S. Boyer and Moore.计算机通信协会,20(10), 1977, pp. 762-772.http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

[2] 《准确的字符串匹配算法手册》,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 浏览器中的数据结构和算法

Chromium的(源代码在 Google code)。我只会列出一部分。我建议使用搜索来找到你最喜欢的算法或者数据结构。

1.伸展树。

这个树通过分配策略(分配器)参数化。这个策略用于C的可用存储区的列表分配,参见zone.h。

2.Voronoi算法用于一个示例。

3.基于Bresenham算法的选项卡

在Chromium的第三方代码里面也有如下的数据结构和算法。

1.二叉树

2.红黑树

Julian Walker的总结

红黑树是一个有趣的小东西。他们被认为比AVL树(它们的直接竞争对手)简单,乍一看这似乎是由于插入是一项轻松的乐事。然而,当你开始删除时,红黑树变得非常棘手。然而,通过复杂性的平衡,插入和删除可以使用单通道,实现自上而下的算法。这与AVL树情况不一样,插入只能自顶向下,删除则需要自下而上。

...

红黑树是很流行的,像大多数数据结构一样有一个古怪的名字。比如,在Java和c++库映射结构通常用红黑树实现。红黑树的速度也与AVL树相当。而AVL树平衡性不是很好,需要保持平衡的话红黑树通常更好。有一些流传的误解,但在大多数情况下对红黑树的宣传是准确的。

3.AVL 树

4.Rabin-Karp字符串匹配用于比较。

5.自动机后缀的计算。

6.由Apple公司实现的bloom过滤器。

7.Bresenham 算法。

编程语言库

我想这个问题值得思考。编程语言设计者们认为值得花一些工程师的时间和精力来实现这些数据结构和算法,这样其他人就不必这么做了。这些库是我们在JAVA里面比C更少的发现需要重新实现基本数据结构的部分原因。

1.C++ STL包含了链表、栈、队列、映射、向量和排序、搜索和堆操作算法。

2.Java API易于扩展的并且越来越多。

3.Boost C++ 库包含了像 Boyer-Moore以及Knuth-Morris-Pratt字符串匹配算法。

分配和调度算法

我发现这些很有趣,因为即使他们被称为启发式,您使用的策略规定了算法类型和需要的数据结构,因此,所以需要人们知道栈和队列。

1.最近最少使用(LRU)算法可以用不同的方法实现。Linux内核有一种基于列表的实现。

2.其他的还有先入先出(FIFO)、最常使用和轮询。

3.FIFO的一个变种用于VAX/VMS系统。

4.Richard Carr的时钟算法用于Linux中的页面替换。

5.Intel i860处理器是一种随机替代策略。

6.自适应置换高速缓存用于一些IBM存储控制器中,也曾经用于PostgreSQL中(虽然仅仅因为一些专利问题)。

7.Knuth在《计算机程序设计艺术 卷1》中讨论过的Buddy内存分配算法内用于Linux内核中,jemalloc并发分配器被用于FreeBSD和facebook中。

*nix系统核心工具

1.grep和awk同时从正则表达式中实现NFA的Thompson-McNaughton-Yamada构造,显然这甚至击败了Perl的实现。

2.tsort实现了拓扑排序。

3.fgrep实现了Aho-Corasick字符串匹配算法。

4.GNU grep,根据作者Mike Haertel实现了Boyer-Mooresuan算法。

5.Unix上的crypt(1)实现了一个在Enigma机器上的不同加密算法。

6.Unix diff由Doug McIllroy实现,基于和James Hunt合作编写的原形。它比用于计算Levenshtein距离的标准动态规划算法执行地更好。Linux 版本计算最短编辑距离。

加密算法

这本是一个非常长的列表。加密算法在所有执行安全通信和交易的程序中都有实现。

1.Merkle 树,特别是 Tiger Tree Hash变种,被用于点对点应用,比如GTK Gnutella和LimeWire。

2.MD5被用于提供软件包的校验和并被用于在*nix系统上的完整性检测(Linux 实现),同样也支持Windows和OSX。

3.OpenSSL实现了很多加密算法包括AES、Blowfish、DES、SHA-1、SHA-2、RSA、DES等等。

编译器

1.LALR 解析在yacc和bison实现。

2.支配算法被用于大多数基于SSA形式的编译器优化。

3.lex和flex将正则表达式编译为NFA。

压缩和图像处理

1.用于GIF图片格式的Lempel-Ziv算法在图像处理程序中实现,从*unix工具转化到复杂的程序。

2.行程长度编码用于产生PCX文件(用于原来的画笔程序),它是被压缩的BMP和TIFF文件。

3.小波压缩是JPEG2000的基础,所以所有生成JPEG2000文件的数码相机会支持这个算法。

4.Reed-Solomon纠错在Linux内核、CD驱动器、条形码读取器、结合从Voyager中的卷积图像传输中实现。

冲突驱动语句学习算法 (CDCL)

自2000年以来,SAT求解器在工业标准的运行时间(通常是硬件工业,虽然其他地方也被使用)以近乎指数的方式每年下跌。这发展中很重要的一部分是冲突驱动语句学习算法,它结合了Davis Logemann和Loveland在约束规划和人工智能研究中关于语句学习的原始论文中的布尔约束传播算法。特定地,工业造型,SAT被认为是一个简单的问题(见这个讨论)。对我而言,这个一个最近最好的成功故事,因为它结合了这几年算法的不断发展、清晰的工程理念、实验性的评估、齐心协力地解决一个问题。Malik 和 Zhang的CACM文章值得阅读。这个算法在许多大学中教授(我参加过的4个地方都是如此),但是通常在一个逻辑或者形式方法课上。

SAT求解器的应用有很多。IBM,Intel和许多其他公司都有他们的SAT求解器实现。OpenSuse的包管理器同样使用了一个SAT求解器。

实例分析首次适应算法、最佳适应算法、最差适应算法 关于首次适应算法、最佳适应算法和最差适应算法,先看一下百度百科的解释,已经说出了三者的最大区别。 首次适应算法(first-fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。 最佳适应算法(best-fit):从全部空闲区中找出能满足作业要求的,且大小最小的空闲分区,这种方法能使碎片尽量小。 最差适应算法(worst-fit) 阅读详情

相关推荐

Dijkstra算法、prim算法和 Kruskal算法详解

1 Dijkstra算法问题描述:在一个图中,给定指定顶点,求该顶点到其它顶点的最短距离。如图所示:这是一个有向图,现在要求解从顶点V1到其它顶点的最短距离。以上图为例,利用Dijkstra算法求解最短距离。步骤:(1)将所有顶点分为两组,一组是未知的即为S,一组是已知的记为W。开始时,S={V1,V2,V3,V4,V5,V6,V7},W={};(2)首先选择顶点V1到其它顶点中距离最短的顶点为已...

pzp201833的博客 1万+

LeetCode的使用场景以及使用方法

LeetCode是一个在线编程平台,主要面向程序员和算法爱好者,提供大量的算法题目供用户练习和提高。LeetCode的算法题目涵盖了各种编程语言和数据结构,以及不同难度的级别,适合不同水平的程序员进行挑战。总之,LeetCode是一个非常好的算法练习平台,可以帮助程序员提高算法设计和编程能力。通过不断练习和挑战,程序员可以更加熟悉各种算法和数据结构,提高自己的编程水平和竞争力。

一如既往的准备文章 1802

图形算法:直线算法

算法:计算机图形学的直线算法标签(空格分隔): 算法 计算机图形学版本:1 作者:陈小默 场景中的直线由其两端点的坐标位置来定义。要在光栅监视器中显示一条线段,图形系统必须先将两端点投影到整数屏幕坐标,并确定离两端点间的直线路径最近的像素位置。接下来才是将颜色填充到相应的像素坐标。1 算法计算机图形学的直线算法 前言 一算法导论 1直线方程算法 2 DDA算法 3 Bresenham算法 31 斜

陈小默的博客 1万+

『Leetcode』十大排序的应用

十大排序算法的力扣例题

JingYan_Chan的博客 962

【算法】算法大纲

包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。介绍仅仅提供了一个整体知识结构树,有利于在后期系统性的思维框架。

猫猫的小茶馆 1498

【学习总结匈牙利算法到KM算法】

目录匈牙利算法匈牙利算法代码小结参考 匈牙利算法 匈牙利算法代码 小结 参考

AutoXTruck专栏 4747

合取范式可满足性问题:CDCL(Conflict-Driven Clause Learning)算法详解

本文以DPLL算法为引入,系统地阐述了CDCL算法的详细步骤,对迹、决策层、蕴含图、子句学习、回溯等概念进行了充分的解释,并提供伪代码、Python代码和大量例子,借鉴了维基百科、华盛顿大学、阿尔托大学的相关资料,十分适合作为SAT方面的研究人员的参考文章。......

qaqwqaqwq的博客 1万+

LBG算法、Lloyd算法和K均值算法

关于LBG算法,Lloyd算法和K均值算法的简介

wo6694458的博客 2万+

经典算法整理

0.Union-find 并查集算法 1.Knuth-Morris-Pratt 经典的KMP字符串匹配算法 2.Quicksort 快排,这里特别建议看原帖的Thread。 3.The algorithm of Blum, Floyd, Pratt, Rivest, and Tarjan 寻找第k大的数 4.Floyd-Warshall algorithm 弗洛伊德算法求最

狂奔的蜗牛 4428

广度优先算法、Dijkstra算法、A*算法、ARA*算法、AD*算法简单比较

仿真视频:五种经典路径规划算法 以下为关于广度优先算法、Dijkstra算法、A算法、ARA算法、AD算法的个人总结,可能会有不恰当的地方,望各位大佬多多批评指正。 (1)广度优先算法 该算法是从根节点开始一层一层的进行遍历,只有完全遍历完一层所有的节点后才会进入下一层的遍历。 作为盲目搜寻法,主要通过系统地展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底地搜索整张图,直到找到...

山山の十三先生 3656

Go:Moser-de Bruijn莫塞尔-德布鲁因序列算法(附完整源码)

Go:Moser-de Bruijn莫塞尔-德布鲁因序列算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 711

OS 最先适应算法、最优适应算法、最坏适应算法的解释

主要介绍最先适应算法、下次适应算法、最优适应算法、最坏适应算法的定义和特点,无代码实现。

MoMing丶的博客 4万+

基于DPLL的SAT算法的研究及应用

.基于 DPLL 的完备性 SAT 算法研究 (1)预处理:将公式转换为对应的CNF (2)加速搜索的一些启发式策略: BCP(Boolean Constraint Propagation,布尔约束传播)、变量决策策略、冲突分析、子句学习、回溯机制 (3)子句删除机制 (4)随机重启动机制

【算法】LCA的三种算法

离线用Tarjan,在线用倍增。:)

wahgreh的博客 6754

lrucacheleetcode-coderust-free:Coderust课程的免费替代课程

lru缓存leetcode Coderust 课程 - 免费替代品 与 CodeRust 课程相对应的免费链接的汇编。 有些可能是等价的,有些可能不是。 可能有也可能没有您选择的语言。 如果您想帮助添加更好的资源,我愿意接受拉取请求。 请参阅此处的 CodeRust Rubric: 数组 二分查找 - , 找到最大滑动窗口 - 搜索旋转数组 - 找到最小的公数 - 旋转阵列 - 查找低/高指数 - 向左移动零 - 找到最大单笔卖出利润 - 实施快速排序 - 合并重叠区间 - 两个值之和 - , 链表 反转单向链表 - , 从链表中删除重复项 - , 删除具有给定键的节点 - 链表的插入排序 - , 两个列表的交点 - , 从最后一个节点开始的第 N 个 - 用头交换第 N 个节点 - 合并两个排序链表 - 归并排序 - , , 反转偶数节点 - 旋转链表 - 反转 k 个元素 - 两个整数相加 - 使用任意指针复制链表 - 数学与统计 找到第 k 个排列 - , 整数除法 - 毕达哥拉斯三元组 - 所有和组合 - 查找丢失的号码 - 置换字符串 - 所有子集 - 号码有效吗? —— 数

SIwave仿真手册——电源完整性仿真之PDN阻抗的提取(四)

(想不到我这个弱鸡的博主有一天也有被催更的时候,看到后台被催的消息,我慌了,赶紧写一篇把。) 文章目录3.1 PDN阻抗的提取3.1.1手动完成PDN阻抗的提取1、创建pin group2、创建端口3、数据文件的清理和检查(参考1.3.4&1.3.5)4、添加电容模型(参考2.2.1)(==这一步很重要==)5、开始仿真6、查看仿真结果3.1.2利用向导工具完成PDN阻抗的提取1、点击图标![在这里插入图片描述](https://img-blog.csdnimg.cn/36d974339ea5449

luohuo9844的博客 1万+

【算法】算法简要介绍

算法是解决特定问题的方法和步骤,它可以根据问题的不同性质和解决思路进行分类。1. 排序算法 (Sorting Algorithms) 2. 查找算法 (Search Algorithms) 3. 图算法 (Graph Algorithms) 4. 动态规划 (Dynamic Programming) 5. 贪心算法 (Greedy Algorithms) 6. 分治算法 (Divide and Conquer) 7. 回溯算法 (Backtracking) 8. 字符串匹配算法 (String Matchi

想买很多漂亮衣服但是买不起的博客 3277

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2127

【算法】算法初步

要学好数据结构和算法的设计与分析,请务必先打好C语言基础,因为C语言中的数据存储、内存映射、指针等等概念最接近计算机的底层原理,数据结构是数据在内存空间当中的组织形式,而算法则是提供了解决某个问题的一种思路,而数据结构与算法设计一定会涉及到最核心的部分:提升性能 —— 时间和空间的问题。如果有一个好的算法,它的执行时间很短,占用空间很小,数据结构的组织形式最优,这才是我们想要看见的结果。

猫猫的小茶馆 2587

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

在科研中用到EndNote管理文献,遇到插入文献时,中国知网如何将参考文献导进Endnote9.x或者web of sicence,谷歌学术如何将文章,文献导入进文献管理软件EndNote的详细图文2022版本解释,全网最细的笔记教程,值得大家参考收藏学习

sakura的博客 5173

EV1527 vs HS1527:固定码芯片的STM32解码避坑指南

本文深入解析EV1527与HS1527固定码芯片的技术差异,提供基于STM32的完整解码方案与稳定性优化策略。通过硬件接口配置、状态机实现及示波器诊断,解决工业遥控、安防报警等场景中的解码难题,特别针对时序差异和干扰问题给出实用解决方案。

o0p1q2r3的博客 329

匈牙利算法 & KM算法

这里写目录标题1. 匈牙利算法(Hungarian Algorithm)2. KM 算法(Kuhn-Munkres Algorithm) Reference: 带你入门多目标跟踪(三)匈牙利算法&KM算法 算法学习笔记(5):匈牙利算法 匈牙利算法(Hungarian Algorithm)与 KM 算法(Kuhn-Munkres Algorithm)主要用于解决一些与二分图匹配有关的问题,这种问题在解决多目标跟踪中的数据关联时会比较常见。 二分图(Bipartite graph) 是一类特殊的图

泠山的博客 6391

Trae AI开发工具:大前端环境配置与避坑指南

大前端开发的第一步往往不是选框架,而是搭建一套可靠的工具链。IDE作为编码、调试与AI能力协同的载体,直接决定后续开发的顺畅度。传统编辑器需要手动拼装插件生态,而新一代AI开发工具将对话、代码生成与项目脚手架能力内置到编辑器底层,降低了环境准备的门槛。Trae基于VS Code内核,兼容其插件体系,同时提供Chat、Builder、内联对话三种AI交互模式,适合从VS Code迁移的开发者,也适合大前端新人快速上手。安装时需认准官方渠道,注意Node.js、Git版本联动,配置自动格式化与手动更新策略,并结

weixin_26833139的博客 279
上一篇: 微信SDK分享出现的各种问题
下一篇: 安卓:View的基本信息
computer165
博客等级 码龄16年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值