常用的算法

递归算法
排序算法
二分查找算法
回溯算法
贪心算法
动态规划算法
分治算法
字符串匹配算法

1.递归算法

        递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或者间接调用自身方法的算法。注意:递归必须要有一个退出的条件!

简言之:在定义自身的同时又出现自身的直接或间接调用。

        递归使我们能够以一种优雅而有效的方式解决许多问题。但是由于时间或空间的限制,并不是所有的问题都可以用递归来解决。递归本身可能会带来一些不希望看到的副作用,如栈溢出。

2. 排序算法

        排序算法可以分为内排序和外排序,内排序是数据记录在内存中进行排序,而外排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。不同的排序算法,适用于不同的场景。

        常见的内排序算法有:冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等。

 

3.二分查找算法

        二分查找就是折半查找,是一种适用于大量数据查找的方法,但是要求数据必须的排好序的,每次以中间的值进行比较,根据比较的结果可以直接舍去一半的值,直至全部找完(可能会找不到)或者找到数据为止。

4. 回溯算法

        回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,因此有“通用解题方法”的美称。

        回溯算法的核心思想是“走不通退回再走”。

二叉树的遍历就是一种回溯。

 

5. 贪心算法

        有人说贪心算法是最简单的算法,原因很简单:你我其实都很贪,根本不用学就知道怎么贪。有人说贪心算法是最复杂的算法,原因也很简单:这世上会贪的人太多了,那轮到你我的份?

        贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。

贪心算法基本思路

(1)建立数学模型来描述问题;

(2)把求解的问题分成若干个子问题;

(3)对每一子问题求解,得到子问题的局部最优解;

(4)把子问题的解局部最优解合成原来解问题的一个解。

贪心算法的三步走!

第一步

明确到底什么是最优解?明确下来之后用小本本记下来!

第二步

明确什么是子问题的最优解?再用小本本记下来!

第三步

分别求出子问题的最优解再堆叠出全局最优解?这步不用记!

6. 动态规划算法

        动态规划过程:每一次决策依赖于当前的状态,即下一状态的产生取决于当前状态。一个决策序列就是在变化的状态中产生的,这种多阶段最优化问题的求解过程就是动态规则过程。

        基本思路:将待求解的问题划分成若干个子问题(阶段)求解,顺序求解各个子问题(阶段),前一子问题(阶段)为后一子问题(阶段)的求解提供有用的信息。

动态规划的应用

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

                      每次走1级台阶                                            每次走2级台阶

 假设只差最后一步就走到第10级台阶,这时会有以下两种情况:

 

010级台阶的走法数量= 09级台阶的走法数量+ 08级台阶的走法数量

记为:F(10)=F(9)+F(8)

以此类推:F(9)=F(8)+F(7),F(8)=F(7)+F(6)……F(3)=F(2)+F(1),F(2)=2,F(1)=1

显然这是一个斐波那契数列,利用求斐波那契数列的方法求解即可。

贪心算法与动态规划算法的区别

        贪心算法得到的是一个局部最优解(即有可能不是最理想的),而动态规划算法得到的是一个全局最优解(即必须是整体而言最理想的)。

        动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。

7. 分治算法

        分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

分治算法的应用

 

分治算法与动态规划算法的区别

        分而治之得到的若干子问题(阶段)一般彼此独立,各个子问题(阶段)之间没有顺序要求。而动态规划中各子问题(阶段)求解有顺序要求,具有重叠子问题(阶段),后一子问题(阶段)求解取决于前一子问题(阶段)的解。 

8. 字符串匹配算法

假如李白会编程,夸张字符随意配;

暴力美学最简易,KMP经典最美丽。

        字符串匹配算法,通常输入为原字符串(string)和子串,要求返回子串在原字符串中首次出现的位置。比如原字符串为“ABCDEFG”,子串为“DEF”,则算法返回3。常见的算法包括:BF(Brute Force,暴力检索)、RK(Robin-Karp,哈希检索)、KMP(教科书上最常见算法)、BM(Boyer Moore)、Sunday等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值