28个不得不看的经典编程算法!!

前十个是来自圣经的十大算法:
发起人的描述:《来自圣经的证明》收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧。如果还有一本《来自圣经的算法》,哪些算法会列入其中呢?
第一名:Union-find
严格地说,并查集是一种 数据结构 ,它专门用来处理集合的合并操作和查询操作。并查集巧妙地借用了树结构,使得 编程 复杂度降低到了令人难以置信的地步;用上一些递归技巧后,各种操作几乎都能用两行代码搞定。而路径压缩的好主意,更是整个数据结构的画龙点睛之笔。并查集的效率极高,单次操作的时间复杂度几乎可以看作是常数级别;但由于数据结构的实际行为难以预测,精确的时间复杂度分析需要用到不少高深的技巧。
第二名:Knuth-Morris-Pratt字符串匹配算法
    关于此算法的介绍,请参考此文:六、教你从头到尾彻底理解KMP算法。KMP算法曾经落选于二十世纪最伟大的十大算法,但人们显然不能接受,如此漂亮、高效的KMP算法竟然会落选。所以,此次最终投票产出生,KMP算法排到了第二名。
第三名:BFPRT 算法
    1973 年,Blum、Floyd、Pratt、Rivest、Tarjan集体出动,合写了一篇题为 “Time bounds for selection” 的论文,给出了一种在数组中选出第 k 大元素的算法,俗称"中位数之中位数算法"。依靠一种精心设计的 pivot 选取方法,该算法从理论上保证了最坏情形下的线性时间复杂度,打败了平均线性、最坏 O(n^2) 复杂度的传统算法。一群大牛把递归算法的复杂度分析玩弄于骨掌股掌之间,构造出了一个当之无愧的来自圣经的算法。

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

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

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

    各位可参考在:算法导论上,第九章中,以期望线性时间做选择,一节中,
我找到了这个 寻找数组中第k小的元素的,平均时间复杂度为O(N)的证明:上述程序的期望运行时间,最后证明可得O(n),且假定元素是不同的。
第四名:Quicksort(快速排序)
快速排序算法几乎涵盖了所有经典算法的所有榜单。它曾获选二十世纪最伟大的十大算法(参考这:细数二十世纪最伟大的10大算法)。关于快速排序算法的具体介绍,请参考我写的这篇文章:一之续、快速排序算法的深入分析,及十二、快速排序算法之所有版本的c/ c++ 实现。
第五名:Floyd-Warshall all-pairs最短路径算法
关于此算法的介绍,可参考我写的此文:几个最短路径算法比较( http://blog.csdn.net/v_JULY_v/archive/2011/02/12/6181485.aspx )。
d: 二维数组. d最小花费、或最短路径的邻边。
for k from 1 to n:
for i from 1 to n:
for j from 1 to n:
d = min(d, d + d)
第六名:Gentry's Fully Homomorphic Encryption Scheme(绅士完全同态加密机制)算法。
此算法很漂亮,它允许第三方执行任意加密 数据 运算得不到私钥(不是很了解)。
第七名:Depth First Search、Breadth First Search(深度、广度优先搜索)
它们是许多其他算法的基础。关于深度、广度优先搜索算法的具体介绍,请参考此文:教你通透彻底理解:BFS和DFS优先搜索算法。
第八名:Miller-Rabin作的类似的试验测试
这个想法是利用素数的性质(如使用费马大定理)的小概率寻找见证不数素数。如果没有证据是足够的随机检验后发现,这一数字为素数。
第九名:Binary Search (二分查找)
在一个有序的集合中查找元素,可以使用二分查找算法,也叫二分搜索。二分查找算法先比较位于集合中间位置的元素与键的大小,有三种情况(假设集合是从小到大排列的):
1.键小于中间位置的元素,则匹配元素必在左边(如果有的话),于是对左边的区域应用二分搜索。
2.键等于中间位置的元素,所以元素找到。
3.键大于中间位置的元素,则匹配元素必在右边(如果有的话),于是对右边的区域应用二分搜索。
另外,当集合为空,则代表找不到。
第十名:Huffman coding(霍夫曼编码)
霍夫曼 编码(Huffman Coding)是一种编码方式,是一种用于无损 数据 压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文。
十一、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  表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:

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

    其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。
此时,f中最大的数便是 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算法、下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOA——ESPRIT算法

相位phei 2*pi*f*d*sind(theta),因此理论上来讲测向的算法都可以用来测频。 ESPRIT:Estimating signal parameters viarotational invariance techniques,中文为旋转因子不变法。 ESPRIT用于测频: %Example_esprit clear all;clc…

为什么别人有微粒贷,而你没有?

大家都知道,微粒贷纯线上申请,500-30万额度,利息低至日息0.045%,手续简单方便,额度高,因此想借钱的朋友都希望自己有微粒贷,但是截至目前为止,只有几千万人有微粒贷,大部…

步进电机实验

步进电机实验 #include "step_motor.h"void Step_Motor_Init(void) {EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK 1;// 开启GPIO时钟//Step_MOTOR端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO20;GpioCtrlRegs.GPADIR.bit.GPIO21;GpioCtrlRegs.GPAMUX1.bit.GPIO30;GpioCt…

常用IP核

前言 记录自己用到的模块,随时补充。 主要分类: 一、常用模块 1-FIFO FIFO分为两种,一是输入输出时钟相同(Common clock)的 fifo ;二是输入输出时钟不相同(Independent clocks)FIFO常用于&#…

OpenCL优化应用项目

1、计算机视觉相关 基于局部域考察的图像模糊化算法的加速实现(表面模糊,高斯模糊)图像模糊化 图像模糊化算法的特点是根据被考察点的局部域特征对被考察点的颜色进行调整,由于各被考察点的局部域相对独立,这类算法比较…

F28335中断系统

F28335中断系统 DSP中断管理分为3个层次:外设级,PIE级,CPU级

notepad++与ISE/Vivado关联

转自:http://www.cnblogs.com/ninghechuan/p/6172237.html 1、notepad与vivado关联 打开vivado软件,选择菜单栏“Tools——>Options…”,在弹出的对话框中,选择General选项卡,如图1所示。 拉动右边的滚动条到Text E…

花呗不还会怎样?

现如今花呗以其短平快俘获很多网购朋友的心,随借随还,确实很好用,但是问题来,如果花呗忘记还了,或者不还会有什么后果呢?先来看下一个网友的真实经历:3个月前,我拖欠了花呗2000多块钱…

外部中断实验

外部中断实验 #include "exti.h" #include "leds.h" #include "key.h"void EXTI1_Init(void) {EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK 1; // GPIO input clockEDIS;EALLOW;//KEY端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO120;GpioCtrlReg…

有法院被执行人记录还能贷款吗?

贷款除了看个人的资质之外,还会查看借款人的一些社会信息,比如法院被执行人记录。通常来说,有法院被执行记录的人是很难通过贷款申请的。1、什么叫法院被执行人记录?被执行人指的是通过法院判决,需要承担对应执行义务的…

如何找到安全的贷款机构

贷款谁都希望找一家安全可靠的机构,不希望碰到骗子或不正规的公司,但是对于很多缺乏贷款经验的朋友来说,他们并不知道哪些贷款机构是正规的,也不知道哪些贷款是安全的,下面我们就来给大家说下如何找一个正规安全的贷款…

梅森增益公式

梅森增益公式 式中 P——从源节点到阱节点的传递函数(或总增益); n——从源节点到阱节点的前向通路总数; pk——从源节点到阱节点的第条前向通路总增益; △——流图特征式 式中

为什么销售员贷款比较难?

销售员其实是一个相对高收入的群体,按道理来说去贷款应该是比较好下的,但是在实际的贷款审批过程中,销售人员去贷款要么比较难下,要么就是额度比较低。为什么会这样呢?这其实跟销售员的工作性质有关。第一、销售员工作…

Ubuntu系统下bash和dash的区别(修改默认sh为bash)

什么是bash ? Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,当您学会一种Shell以后&#xff0c…

老公贷款还不上,妻子有偿还责任吗?

如果贷款不还,可能会涉及到夫妻共同还款的情况,也就是说,如果一方的贷款是用于家庭所需或者双方有共同利益的项目,一旦贷款还不上,那夫妻中的另一方就需要承担偿还责任,这就是我们通常所说的夫妻共同负债。…

银行流水你真的会看吗?

(1)银行流水的的构成每个银行流水的构成要素可能有所差距,但是总整体上来说,银行流水的构成基本是差不多的。正常的银行流水一般都会包含以下几个构成因素:账号、户名、交易日期、对方帐号、对方户名、交易代码&#x…

SYNOPSYS VCS常用命令使用详解

VCS对verilog模型进行仿真包括两个步骤: 1. 编译verilog文件成为一个可执行的二进制文件命令为:vcs source_files2. 运行该可执行文件:./simv 类似于NC, 也有单命令行的方式:vcs source_files -R-R 命令表示, 编译后立即执行。 vc…

Cisco Wireless Controller 5508 Configuration Step by Step – Part 1 (CLI and GUI Access, Upgrade)

As the industry’s most deployed controller, the Cisco 5500 Series Wireless Controller provides the highest performance, security, and scalability to support business communications today and in the future. Cisco 5500 Series Wireless Controller • Support …

求解单位冲激响应的笔记

求解单位冲激响应的笔记 冲激响应的定义 求解方式 正常的方式 另一种方法 再看下一个例子