前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >当今世界最为经典的十大算法 博客分类: 经典文章转载 算法数据结构网络应用数据挖掘J#

当今世界最为经典的十大算法 博客分类: 经典文章转载 算法数据结构网络应用数据挖掘J#

作者头像
chroya
发布于 2018-10-31 09:50:00
发布于 2018-10-31 09:50:00
1.3K0
举报
文章被收录于专栏:封碎封碎

本文转载自July CSDN博客:http://blog.csdn.net/v_JULY_v/archive/2011/03/07/6228235.aspx

第一部分、来自圣经的十大算法

    当今世界,已经被发现或创造的经典算法数不胜数。如果,一定要投票选出你最看重的十大算法,你会作何选择列?     曾有人在StackExchange上发起了提问,向网友们征集当今世界最为经典的十大算法。众人在一大堆入围算法中进行投票,最终得出了票数最高的以下十个算法。

    来自圣经的十大算法:     发起人的描述:《来自圣经的证明》收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧。如果还有一本《来自圣经的算法》,哪些算法会列入 其中呢?现在,朋友们,以下是数十种候选算法,如果你觉得它是当今世界最经典的算法,就请您为它投一票.....     最终在StackExchange上产生了下面得票数最高的十大经典算法(投票数统计截止到2011年3月7日 ):

第十名:Huffman coding(霍夫曼编码)     霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文。

第九名:Binary Search (二分查找)     在一个有序的集合中查找元素,可以使用二分查找算法,也叫二分搜索。二分查找算法先比较位于集合中间位置的元素与键的大小,有三种情况(假设集合是从小到大排列的):     1.键小于中间位置的元素,则匹配元素必在左边(如果有的话),于是对左边的区域应用二分搜索。     2.键等于中间位置的元素,所以元素找到。     3.键大于中间位置的元素,则匹配元素必在右边(如果有的话),于是对右边的区域应用二分搜索。 另外,当集合为空,则代表找不到。

第八名:Miller-Rabin作的类似的试验测试     这个想法是利用素数的性质(如使用费马大定理)的小概率寻找见证不数素数。如果没有证据是足够的随机检验后发现,这一数字为素数。

第七名:Depth First Search、Breadth First Search (深度、广度优先搜索)     它们是许多其他算法的基础。关于深度、广度优先搜索算法的具体介绍,请参考此文:教你通透彻底理解:BFS和DFS优先搜索算法

第六名:Gentry's Fully Homomorphic Encryption Scheme (绅士完全同态加密机制)算法。     此算法很漂亮,它允许第三方执行任意加密数据运算得不到私钥(不是很了解)。

第五名:Floyd-Warshall all-pairs最短路径算法     关于此算法的介绍,可参考我写的此文:几个最短路径算法比较(http://blog.csdn.net/v_JULY_v/archive/2011/02/12/6181485.aspx )。 d[]: 二维数组. d[i,j]最小花费、或最短路径的邻边。

for k from 1 to n:   for i from 1 to n:     for j from 1 to n:       d[i,j] = min(d[i,j], d[i,k] + d[k,j])

第四名:Quicksort(快速排序)     快速排序算法几乎涵盖了所有经典算法的所有榜单。它曾获选二十世纪最伟大的十大算法(参考这:细数二十世纪最伟大的10大算法 )。关于快速排序算法的具体介绍,请参考我写的这篇文章:一之续、快速排序算法的深入分析 ,及十二、一之再续:快速排序算法之所有版本的c/c++实现

第三名:BFPRT 算法     1973 年,Blum、Floyd、Pratt、Rivest、Tarjan集体出动,合写了一篇题为 “Time bounds for selection” 的论文,给出了一种在数组中选出第 k 大元素的算法,俗称"中位数之中位数算法"。依靠一种精心设计的 pivot 选取方法,该算法从理论上保证了最坏情形下的线性时间复杂度,打败了平均线性、最坏 O(n^2) 复杂度的传统算法。一群大牛把递归算法的复杂度分析玩弄于骨掌股掌之间,构造出了一个当之无愧的来自圣经的算法。

    我在这里简单介绍下在数组中选出第k大元素的时间复杂度为O(N)的算法:     类似快排中的分割算法:

每次分割后都能返回枢纽点在数组中的位置s,然后比较s与k的大小 若大的话,则再次递归划分array[s..n], 小的话,就递归array[left...s-1] //s为中间枢纽点元素。 否则返回array[s],就是partition中返回的值。 //就是要找到这个s。

找到符合要求的s值后,再遍历输出比s小的那一边的元素。

    各位可参考在:算法导论上,第九章中,以期望线性时间做选择,一节中, 我找到了这个 寻找数组中第k小的元素的,平均时间复杂度为O(N)的证明:上述程序的期望运行时间,最后证明可得O(n),且假定元素是不同的。

第二名:Knuth-Morris-Pratt字符串匹配算法     关于此算法的介绍,请参考此文:六、教你从头到尾彻底理解KMP算 。KMP算法曾经落选于二十世纪最伟大的十大算法,但人们显然不能接受,如此漂亮、高效的KMP算法竟然会落选。所以,此次最终投票产出生,KMP算法排到了第二名。

第一名:Union-find     严格地说,并查集是一种数据结构,它专门用来处理集合的合并操作和查询操作。并查集巧妙地借用了树结构,使得编程复杂度降低到了令人难以置信的地步;用上 一些递归技巧后,各种操作几乎都能用两行代码搞定。而路径压缩的好主意,更是整个数据结构的画龙点睛之笔。并查集的效率极高,单次操作的时间复杂度几乎可 以看作是常数级别;但由于数据结构的实际行为难以预测,精确的时间复杂度分析需要用到不少高深的技巧。并行查找,最终占据了此份榜单的第一名。

    补充:前三名的投票数,只相差4票,8票。所以这个排名日后还会不断有所变化。但不管最终结果怎样,这前十名的算法已经基本敲定了。 原投票网址http://cstheory.stackexchange.com/questions/189/algorithms-from-the-book

第二部分、当今世界最为经典的十大算法--投票进行时     怎么样,上文那些投票产生出来的来自圣经的算法,你是否熟悉?你是否熟悉?或者, 如果要您选出您心目中,当今世界最为经典的十大算法,您肯定也、绝对不一定认同上述十个所谓来自圣经的算法便是当今世界最为经典的十大算法,对吧? ok,那么,现在,我给你一个投票权,你会把票投给哪一个算法列?好的,咱们也来一次投票吧,请把你的意见,决定权写在本文下面的评论里。

    我把已经产生的前十名的算法,再写在下面,方便投票(投票截止日期 :后 年的今天,即二零一三年三月七日 ):

、Huffman coding(霍夫曼编码)。 、Binary Search (二分查找)。 、Miller-Rabin作的类似的试验测试。 、Depth First Search(深度优先搜索)。 、绅士完全同态加密机制 、Floyd-Warshall all-pairs最短路径算法。 、Quicksort(快速排序)。 、BFPRT 算法。 、Knuth-Morris-Pratt字符串匹配算法。 、Union-find。

为了让大家有更多的选择,我再贴出其它几种同样经典但暂时未能排进上述榜单前十名的候选算法:

十一、Cooley-Tukey FFT 算法。快速傅里叶变换算法。关于傅里叶变换算法的介绍,请参考此文:十、从头到尾彻底理解傅里叶变换算法、上 ,及十、从头到尾彻底理解傅里叶变换算法、下

十二linear programming ,线性规划。 十三Dijkstra 算法。与上第五一样,又一种最短路径算法。具体介绍,请参考:二之续、彻底理解Dijkstra算法 ,和二(再续)、Dijkstra 算法+fibonacci堆的逐步c实现

十四Merge Sort 。归并排序。 十五Ford–Fulkerson 算法。网络最大流算法。 十六辗转相除法 。       在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法,即求两个正整数之最大公因子的算法。此算法作为TAOCP第一个算法被阐述,足见此算法 被重视的程度。它是已知最古老的算法, 其可追溯至3000年前。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。扩 展的辗转相除法则构造性地证明了,对任意整数a和b ,存在一对x、y使得 ax + by = gcd(a, b) 。

十七RSA加密演算法 。一种加密算法,日后再做详细介绍。 十八遗传算法 。可参考本人写的关于GA 算法的这篇文章:七、遗传算法 透析GA本质

十九最大期望(EM)算法 。     此算法入选数据挖掘领域十大经典算法 。 在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量 (Latent Variable)。最大期望经常用在机器学习计算机视觉的数据聚类(Data Clustering)领域。最大期望算法经过两个步骤交替进行计算,第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;第二 步是最大化(M),最大化在 E 步上求得的最大似然值来计算参数的值。M 步上找到的参数估计值被用于下一个 E 步计算中,这个过程不断交替进行。

二十、数据压缩     数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术。数据压缩在文件存储和分布式系统领域有着十分广泛的应用。数据压缩也代表着尺寸媒介容量的增大和网络带宽的扩展。

二十一、Hash函数     Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。关于hash表的详细阐述,请参考此篇文章:十一、从头到尾彻底解析Hash表 算法

二十二、Dynamic Programming (动态规划)。关于动态规划的粗略介绍,请参考此文:三、dynamic programming

二十三、堆排序算法 。     堆排序算法作为一种快速稳定的算法,其平均时间复杂度(最坏也为)O(n*lgn)。当然,在实际应用中,一个实现的好的快速排序算法仍然要优于堆排序算法。不过,堆数据结构还可以作为高效的优先级队列。对堆排序算法作简单了解,可参考这:堆排序算法

二十四递归与回溯算法 。此俩个算法,相信各位比较熟悉,在此不做赘述。  

二十五最长公共子序列     最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个数列 S ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 动态规划的一个计算最长公共子序列的方法如下:     以两个序列 X、Y 为例子: 设有二维数组 f[i][j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:

      f[1][1] = same(1,1)       f[i][j] = max{f[i-1][j-1]+same(i,j),f[i-1][j],f[i][j-1]}

    其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。 此时,f[i][j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。

    该算法的空间、时间复杂度均为O(n2),经过优化后,空间复杂度可为O(n),时间复杂度为O(nlogn)。更多详情,参见之前写的一篇拙文(不过,鉴于写的糟,日后会重写):三、dynamic programming

二十六、红黑树的算法与实现     关于红黑树,linux内核中有实现,本BLOG内也已经写了4篇红黑树系列的文章。详情,请参考:五(续)、教你透彻了解红 黑树

二十七、A*搜寻算法 。     相对于BFS、Dijkstra 等算法,A*搜寻算法作为一种高效的最短路径搜索算法,如今,已得到日益广泛的应用。初步了解A*搜寻算法的高效及与其它最短路径算法的比较,请参考此文:一(续)、A*,Dijkstra,BFS算法性能比较及A*算法的应用

二十八、图像特征提取与匹配之SIFT算法     sift,尺度不变特征转换,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。关于此算法,请参考如下,粗略介绍:九、图像特征提取与匹配之SIFT算 ,利用第三方库编译过程:九(续)、sift算法的编译与实现 ,c语言一步一步实现sift算法:九之再续:一步一步用c语言实现sift算法、上 九之再续:教你一步一步用c语言实现sift算法、下

候选经典算法一直在不断增补中,估计最后能达到上100种。...

     还犹豫什么列?快投上您宝贵的一票吧。每人可投多次 票,只要您认为哪个算法是最为经典的算法,您就在下面的评论里写上它的序号,及算法名称。     当然,如果上文中不曾出现你认为最经典的算法,你也可以写在评论里,为你钟爱的它投上一票。而后我将考虑您的意见,把您钟爱的算法也作为一种候选算法,添补上去。:D。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
夯实基础,常考的数据结构 5 类经典算法
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
掘金安东尼
2022/09/22
3970
夯实基础,常考的数据结构 5 类经典算法
细数二十世纪最伟大的十大算法
参考论文: The Best of the 20th Century: Editors Name Top 10 Algorithms。 By Barry A. Cipra。地址:http://www.uta.edu/faculty/rcli/TopTen/topten.pdf。
黄规速
2022/04/14
4970
细数二十世纪最伟大的十大算法
掌握这些核心算法,拿不到10+个offer你来找我,我锤飞你个不争气的
不得不说现在算法岗的热门程度已经到了一个空前绝后的程度,所以这一岗位的就业形势也是非常严峻。
北游
2021/07/26
4950
程序员应该知道的十个基础算法
作为一名程序员,掌握各种算法可以帮助我们解决各种复杂的问题,提高代码的效率和性能,同时也是面试中常被考察的重要内容之一。无论是开发新的软件应用、优化现有的算法逻辑还是解决各类计算问题,算法都是不可或缺的工具。因此,程序员必须掌握一系列常用的算法,以确保能够高效地编写出稳定、功能强大的软件。
小齐来了
2023/10/27
2.9K0
程序员应该知道的十个基础算法
30 个重要数据结构和算法完整介绍(建议收藏保存)
话虽如此,我决定在CSDN新星计划挑战期间将我所了解的数据结构和算法集中起来。本文旨在使 DSA 看起来不像人们认为的那样令人生畏。它包括 15 个最有用的数据结构和 15 个最重要的算法,可以帮助您在学习中和面试中取得好成绩并提高您的编程竞争力。后面等我还会继续对这些数据结构和算法进行进一步详细地研究讲解。
海拥
2021/08/23
4.2K0
30 个重要数据结构和算法完整介绍(建议收藏保存)
面试常问的小算法总结
需要说明的是,由于算法的代码实现主要注重思路的清晰,下方有代码实现的文章主要以Python为主,Java为辅,对于Python薄弱的同学敬请不用担心,几乎可以看作是伪代码,可读性比较好。如实在有困难可以自行搜索Java代码
蛮三刀酱
2019/03/26
5650
面试常问的小算法总结
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
帅地
2019/10/23
3.6K0
中国高校计算机考研:计算机数据结构核心考点解析
栈是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶。表中无元素时为空栈。栈的修改是按后进先出的原则进行的。通常栈有顺序栈和链栈两种存储结构。
张哥编程
2024/12/19
1400
算法很美,听我讲完这些Java经典算法包你爱上她
对于编程来说的话,只有掌握了算法才是了解了编程的灵魂,算法对于新手来说的话,属实有点难度,但是以后想有更好的发展,得到更好的进阶的话,对算法进行系统的学习是重中之重的。
浅羽技术
2021/04/26
5790
程序员必须掌握的算法
作为程序员,掌握一些基本的算法是非常重要的,因为它们可以帮助你更高效地解决编程问题。以下是一些程序员必须掌握的基本算法:
楠羽
2023/10/17
2000
数据结构与算法入门手册
图片 第一部分:算法概述 算法定义:一系列解决问题的清晰易行的步骤和规则。以编程实现,输入为问题实例,输出为问题解。 算法特征:输入、输出、有穷性、确定性、可行性。算法必须有清晰的输入与输出,步骤必须能在有限时间内结束,为任意输入都可以给出解,并且解得出的结果是正确的。 算法类族:递归算法、迭代算法、确定算法、非确定算法、Exact算法、Heuristic算法等。递归算法通过递归解决子问题,迭代通过循环;确定算法对每组输入都给出同样的输出,非确定算法输出随输入变化。Exact算法可以给出最优解,Heuri
疯狂的KK
2023/05/23
5910
数据结构与算法入门手册
Python实现从零开始学习数据结构与算法
数据结构与算法是计算机科学中至关重要的概念之一,对于任何想要成为优秀程序员的人来说,深入理解它们是必不可少的。本文将介绍如何从零开始学习数据结构与算法,并使用Python语言实现一些基本的数据结构和算法,帮助读者入门。
一键难忘
2024/05/01
3170
应用软件开发的基础知识-数据结构与算法
数据结构与算法是计算机科学的基础,是软件开发中必不可少的知识。对于应用开发人员来说,掌握数据结构与算法的基本概念和原理,以及常见数据结构和算法的应用场景,是十分必要的。
行者深蓝
2023/11/18
3500
算法01-算法概念与描述
本系列为C++算法学习系列,会介绍 算法概念与描述,入门算法,基础算法,数值处理算法,排序算法,搜索算法,图论算法, 动态规划等相关内容。本文为C+算法概念与描述部分。
IT从业者张某某
2023/10/16
2330
算法01-算法概念与描述
一位算法工程师的自我修养
数据结构与算法 基本算法思想 动态规划 贪心算法 回溯算法 分治算法 枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度 平均复杂度 基础数据结构 数组 动态数组 树状数组 矩阵 栈与队列 栈 队列 阻塞队列 并发队列 双端队列 优先队列 堆 多级反馈队列 线性表 顺序表 链表 单链表 双向链表 循环链表 双向循环链表 跳跃表 并查集 哈希表(散列表) 散列函数 碰撞解决办法: 开放地址法 链地址法 再次哈希法 建立公共溢出区 布隆过滤器 位图 动态扩容 树 二叉树: 各种遍历,递归与非递归 二
攻城狮Chova
2022/01/22
4790
程序员常用的几种算法
在软件开发中,算法是程序员必备的利器之一。它们是解决问题的方法论,能够在海量数据、复杂逻辑中找到最优解。本文将介绍几种程序员常用的算法,包括排序算法、搜索算法、图算法、动态规划和贪心算法。
用户11293412
2024/10/09
1350
【聊聊开发中十分重要的“必抓!”算法】
这两种递归排序算法的思想都是将排序问题拆分为更小规模的子问题,然后递归求解,并通过合并或分区操作将子问题的结果合并成最终的排序结果。
再见孙悟空_
2023/07/17
1840
【聊聊开发中十分重要的“必抓!”算法】
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
乔戈里
2019/10/28
6290
必抓!程序员必备的关键算法:探索编程世界的珍宝
嗨,亲爱的编程同道们!在这个码农的世界里,算法就像我们的剑与盾,为我们打开问题的大门。不论你是新手刚踏入编程领域,还是老手早已颇有心得,总有那几种算法是我们绝对不能错过的,它们是你编程路上的指南针,也是你驰骋代码世界的翅膀。今天,让我们一起来探讨一下这些至关重要的“必抓!”算法,让我们的编程之旅更充实、更从容。
繁依Fanyi
2023/10/12
2180
必抓!程序员必备的关键算法:探索编程世界的珍宝
程序员必须知道的十大基础实用算法及其讲解
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1. 从数列中挑出一个元素,称为「基准」(pivot),
CSDN技术头条
2018/02/06
1.1K0
程序员必须知道的十大基础实用算法及其讲解
推荐阅读
相关推荐
夯实基础,常考的数据结构 5 类经典算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档