常见算法大全

1.堆排序:

是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

2.哈希算法

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更
改该段落的一个字母,随后的哈希都将产生不同的值。要找到撒列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。

3.梯度下降:

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)
是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,
如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

4.离散微分算法

一种模拟调节器的离散化方法,常用差分变换法实现:模拟调节器采用微分方程来表示时,其导数可以用差分方程近似。

5.动态规划算法-例子

动态规划(Dynamic programming)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。 关于动态规划最经典的问题当属背包问题。

6.欧几里得算法

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。 计算公式gcd(a,b) = gcd(b,a mod b)。 … 欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。

7.期望-最大算法

EM 算法,全称 Expectation Maximization Algorithm。期望最大算法是一种迭代算法,用于含有隐变量(Hidden Variable)的概率参数模型的最大似然估计或极大后验概率估计。EM 算法的核心思想非常简单,分为两步:Expection-Step 和 Maximization-Step。E-Step 主要通过观察数据和现有模型来估计参数,然后用这个估计的参数值来计算似然函数的期望值;而 M-Step 是寻找似然函数最大化时对应的参数。由于算法会保证在每次迭代之后似然函数都会增加,所以函数最终会收敛。

8.快速傅里叶交换

快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

9.A搜索算法

A搜索算法,A*(A-Star)算法是一种静态路网中求最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。
公式表示:F(n)=G(n)+H(n)
其中F(n)是每个可能试探点的估值,它有两部分组成:
一部分,为G(n),它表示从起始搜索点到当前点的代价(通常用某结点在搜索树中的深度来表示)。
另一部分,即H(n),它表示启发式搜索中最为重要的一部分,即当前结点到目标结点的估值,
H(n)设计的好坏,直接影响着具有此种启发式函数的启发式算法的是否能称为A算法。
一种具有F(n)=G(n)+H(n)策略的启发式算法能成为A
算法的充分条件是:
1、搜索树上存在着从起始点到终了点的最优路径。
2、问题域是有限的。
3、所有结点的子结点的搜索代价值>0。
4、H(n)= 当此四个条件都满足时,一个具有F(n)=G(n)+H(n)策略的启发式算法能成为A*算法,并一定能找到最优解。

10.集束搜索

Beam Search(集束搜索)是一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。这样减少了空间消耗,并提高了时间效率,但缺点就是有可能存在潜在的最佳方案被丢弃,因此Beam Search算法是不完全的,一般用于解空间较大的系统中。

11.二分查找

二分查找算法 ,也称 折半搜索算法、对数搜索算法 ,是一种在 有序数组 中查找某一特定元素的搜索 算法 。. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。. 如果在某一步骤数组为空,则代表找不到。

12.分支界定算法

分支定界法(branch and bound)是一种求解 整数规划 问题的最常用算法。 这种方法不但可以求解纯整数规划,还可以求解 混合整数规划 问题。 分支定界法是一种搜索与迭代的方法,选择不同的分支变量和子问题进行分支。 对于两个变量的整数规划问题,使用网格的方法有时更为简单。 [1] 通常,把全部可行解空间反复地分割为越来越小的子集,称为分支;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界。

13.数据压缩

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少 存储空间 ,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。 数据压缩包括 有损压缩 和 无损压缩 。 在 计算机科学 和 信息论 中,数据压缩或者源编码是按照特定的编码机制用比未经编码少的数据位元(或者其它信息相关的单位)表示信息的过程。

14.密钥交换算法

又称“Diffie–Hellman 算法”。 这是两位数学牛人的名称,他们创立了这个算法。 该算法用来实现【安全的】“密钥交换”。 它可以做到 — — “通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥”。

15.Dijkstra算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

16.Buchberger算法

17.LLL算法

LLL算法是由A.K.Lenstra、H.W.Lenstra和L.Lovasz于1982年提出的一种在多项式时间内求格的近似最短向量的算法。 1996年,Coppersmith发现可以利用LLL算法解决RSA安全性分析的问题,之后各种相关算法被应用于RSA的研究,取得了大量的成果。

18.合并排序

归并排序. 归并排序 (Merge Sort)是建立在 归并 操作上的一种有效,稳定的 排序算法 ,该算法是采用 分治法 (Divide and Conquer)的一个非常典型的应用。. 将已有序的子序列 合并 ,得到完全有序的 序列 ;即先使每个子序列有序,再使子序列段间有序。. 若将两个有序表合并成一个有序表,称为 二路归并 。

19.RANSAC

RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。
RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

20.两次筛选

二次筛选 (Quadratic Sieve) 算法 是一个 整数分解 算法,在实际用途中为已知第二快的方法(目前第一快为 普通数域筛选法 )。 但对于大约 100 位数以内的整数,它仍然是最快的算法,而且比起普通数域筛选法来说简洁得多。

21.牛顿法

牛顿法的基本思想是利用迭代点
处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小值。牛顿法的速度相当快,而且能高度逼近最优值。牛顿法分为基本的牛顿法和全局牛顿法。

22.最大流量算法

最大流量问题时考虑在网络中各路径承受能力的情况下,最大限度的运送同种物品的问题,即在网络模型中给定各边容量的情况下,求从出发地到目的地的最大运送物品数量。

23.Karatsuba乘法

Karatsuba乘法是一种快速乘法。此算法主要用于两个大数相乘。普通乘法的复杂度是n2,而Karatsuba算法的复杂度仅为3nlog3≈3n1.585(log3是以2为底的)。

24.Q-learning学习算法

Q-Learning 是强化学习算法中 value-based 的算法,Q即为Q(s,a),就是在某一个时刻的 state 状态下,采取动作a能够获得收益的期望,环境会根据 agent 的动作反馈相应的 reward 奖赏,所以算法的主要思想就是将 state 和 action 构建成一张 Q_table 表来存储Q值,然后根据Q值来选取能够获得最大收益的动作。

25.RSA

RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

26.维特算法

维特比算法说白了就是动态规划实现最短路径,只要知道“动态规划可以降低复杂度”这一点就能轻松理解维特比算法
维特比算法之所以重要,是因为凡是使用隐含马尔可夫模型描述的问题都可以用它来解码,包括今天的数字通信、语音识别、机器翻译、拼音转汉字、分词等。

27.Strassen算法

Strassen算法证明了矩阵乘法存在时间复杂度低于 \Theta(N^{3}) 的算法的存在,后续学者不断研究发现新的更快的算法,截止目前时间复杂度最低的矩阵乘法算法是Coppersmith-Winograd方法的一种扩展方法,其算法复杂度为 \Theta(n^{2.375})

28.单纯型算法

单纯形算法(simplex method)是求解线性规划模型的一种通用方法。

29.奇异值分解

奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总结,并讨论在在PCA降维算法中是如何运用运用SVD的。

30.求解线性方程组

用克莱姆法则求解方程组实际上相当于用 逆矩阵 的方法求解线性方程组,它建立线性方程组的解与其系数和 常数 间的关系,但由于求解时要计算n+1个n阶行列式,其工作量常常很大,所以克莱姆法则常用于理论证明,很少用于具体求解。

31.合并查找算法

合并查找算法 (union-find)可以有以下几种: 1、快速查找算法 mark连通时遍历整个数组,使得连通指向最新的节点 2、快速合并算法 不需要遍历整个数组,只遍历已连通的子串,然后合并新加入连通节点对应的根节点 3、带权的快速合并算法

32.Strukturtensor算法

Strukturtensor算法——应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域( homogenous region),看看它是否属于边缘,还是是一个顶点。 合并查找算法(Union-find)——给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。

你可能感兴趣的:(数据结构与算法,算法)