`
- 浏览:
147704 次
- 性别:
- 来自:
北京
-
前十个是来自圣经的十大算法:发起人的描述:《来自圣经的证明》收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧。如果还有一本《来自圣经的算法》,哪些算法会列入其中呢?第一名: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算法、下。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### C经典算法之基数排序法 #### 知识点概览 1. **排序算法的基础概念** - 排序算法的基本定义与分类 - 比较性排序与非比较性排序的区别 - 稳定排序与不稳定排序的概念 2. **基数排序的原理** - 分配式排序的...
通过深度神经网络实现的图像识别算法,能够更加高效地进行图像特征的自动搜集与识别。该技术提高了信息技术的使用效率,并在一定程度上拓宽了其应用范围。深度神经网络通过分层采集图像信息的方式,有效地提高了图像...
1. **数据收集**:使用MNIST数据集,这是手写数字识别的经典数据集,包含60,000个训练样本和10,000个测试样本。每个样本是28x28像素的灰度图像,代表0到9的数字。 2. **数据准备**:将二值图像转换为向量。这一阶段...
DBCSAN(Density-Based Spatial Clustering of Application with Noise) 算法是一种非常经典的分类聚类算法,它是基于密度来进行分类聚类的。在该产品中,我们在上述技术之后得到的只是一个病变位置的大概区域,是以 ...
【IT互联网名企经典面试题汇总:Java篇】 在IT行业,尤其是互联网领域,Java作为一门广泛应用的编程语言,其面试题涵盖了多个方面,包括基础知识、设计模式、框架使用、数据库操作、并发处理、内存管理等。以下是...
这些图片由美国国家标准与技术研究所(NIST)在20世纪80年代和90年代收集,最初用于邮政服务自动识别手写数字。 MNIST数据集的结构如下: 1. 训练集(train):60,000张图片,每张图片都有一个对应的标签,表示...
MNIST(Modified National Institute of Standards and Technology)数据集是机器学习和深度学习领域中的一个经典基准,主要用于训练和评估图像识别算法,特别是针对手写数字的识别任务。这个数据集源于美国国家标准...
### 28个Unix/Linux的命令行神器 #### dstat & sar - **dstat**:这是一种多功能系统监视工具,可以同时提供CPU、磁盘、网络、内存等系统的实时统计数据。相较于传统的`iostat`、`vmstat`、`ifstat`等独立工具,...
在本文中,我们将深入探讨如何使用MATLAB实现手写数字识别GUI,主要基于经典的MINIST数据集。MINIST是一个广泛使用的计算机视觉数据集,用于训练和测试手写数字识别算法。MATLAB作为强大的数学和计算工具,提供了...
31. **能量收集技术**:研究如何利用环境能量(如光、热、振动)为单片机供电。 32. **低功耗设计**:在满足性能需求的同时,尽可能降低系统功耗,延长电池寿命。 33. **嵌入式软件开发流程**:理解从需求分析、...
16. **模拟信号滤波**:使用数字滤波算法处理模拟信号。 17. **USB通信**:作为USB设备与电脑通信。 18. **SPI/I²C通信**:与外部芯片通信,如EEPROM、传感器等。 19. **电机正反转**:通过GPIO和逻辑控制实现电机...
这些图像都是美国邮政服务在上世纪80年代自动读取信封上手写邮政编码时收集的,因此具有很高的现实应用场景。 每个图像都与一个对应的标签(0到9的整数)相关联,表示该图像所示的手写数字。MNIST数据集的这种结构...
本文将详细介绍由Kristóf Kovács收集的28个Unix/Linux命令行工具,这些工具因其独特性和实用性而被称为“神器”。 ### 1. dstat & sariostat & vmstat & ifstat dstat是一款集成了dstat、sariostat、vmstat和...
在机器学习领域,MNIST数据集是一个非常经典的手写数字识别数据集,广泛用于训练和测试各种图像分类算法。这个数据集包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的灰度图像,代表0到9的十个数字...
自动回收不再使用的内存,通过引用计数和垃圾收集算法实现。 28. 可变类型与不可变类型: 可变类型如列表、字典,可直接修改;不可变类型如字符串、元组、数字,修改会创建新对象。 以上只是问题的一部分解答,...
MNIST 数据集是一个广泛用于计算机视觉领域,尤其是深度学习模型训练的经典数据集。它包含了60,000个训练样本和10,000个测试样本,这些样本是28x28像素的手写数字图像。这些图像都是从美国邮政服务的信封上收集的,...
NMIST(Modified National Institute of Standards and Technology)是一个广泛用于机器学习和深度学习领域的经典手写数字数据集。这个数据集最初是由美国国家标准与技术研究所(NIST)创建的,后来被修改并简化为更...
- **强引用**:最普通的引用类型,通过对象名直接引用对象。 - **软引用**:当 JVM 认为有必要回收内存之前,即使内存不足也不会被回收。 - **弱引用**:更弱一些的引用类型,在下一次垃圾回收时会被回收。 - **...
### Java经典面试题知识点解析 #### 1. super()与this()的区别? - **super()**:用于调用父类的构造方法。在一个子类的构造方法中,如果要调用父类的构造方法,必须使用`super()`,并且这个调用语句必须放在子类...