简述一些算法:回溯法、堆、分治算法、动态规划、贪心算法、哈希算法、字符串匹配算法、B树和B+树、冒泡排序、基数排序

1.回溯法:

        回溯法是采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。

应用:

组合问题

切割问题

寻找子集

排列问题

棋盘问题,比较经典的便是8皇后问题

2.堆

        把一个元素的集合按照完全二叉树的顺序存储方式存储在一个一维数组中,并满足任意节点不大于或者不小于其父节点的值叫做堆,任意节点不大于父节点的就做大根堆,任意节点不小于父节点的叫做小根堆。

 堆的应用:

        最普遍的应用就是在堆中找几个最大的值或者最小的值,还有堆排序,时间复杂度比较友好,对于问题规模n,时间复杂度为nlogn

3.分治算法

        将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

适用场景:

1 该问题可以分解为若干个规模较小的相同问题

2该问题的规模缩小到一定的程度就可以容易地解决

3利用该问题分解出的子问题的解可以合并为该问题的解

应用问题:快速排序、归并排序

4.动态规划

        对一个给定问题,我们可以问题分成若干个小问题,在求解的过程中,由于有的小问题不是相互独立的,所以可能存在相同的解答过程,而动态规划的思想就是将这个过程的结果记录下来,再次碰到该过程时就找出已经求得的答案,这样的话就可以避免大量重复计算。

动态规划对于那些经常重复子问题的问题非常有效。

应用:最大连续回文子串问题,回文就是正着读和倒着读结果都一样,比如说abcba,反过来还是abcba,暴力的话就是求出每个字串再判断是不是回文,找到最长的那个。用动态规划思想的话,就是先遍历长度为1的子串,当然每个都是回文字串,在遍历长度为2的子串,把这些子串的初始和结束的位置记录下来,在开始遍历长度为3的字串,当字串的初始字母和结束字母相同时,只需要在已有的记录中查看是否除去头部和尾部的子串是不是回文就知道该长度为3的是不是子串,长度为4的就按照这个原理向下推,就能求出最大连续子串了。

        像KMP算法也用到了动态规划

5.贪心算法

        贪心算法就是在对问题求解时,总是做出在当前看来是最好的选择,就是把问题分成若干个子问题,对于子问题的求解最优解,然后把子问题的解合起来就是问题的解答。一般能产生最优解或者是最优解的近似解。

        贪心算法适用于比较复杂,但是对结果不是特别苛刻的情景,贪心算法里面也有一定的分治思想,就是想一步做一步,将问题缩小。

        应用:钱币找零问题问题,指定币值和相应的数量,用最少的数量凑齐某金额,利用贪心算法,我们优先选择面值大的钱币,以此类推,直到凑齐总金额。

        数据结构里面求最小生成树的普里姆算法用的就是贪心算法,就是一个顶点出发,寻找路径最短的顶点,然后形成一个顶点的集合,再求离这个集合最近路径的顶点,最后生成最小生成树,这个应该就是用的贪心算法的思想。

6.哈希算法

         哈希算法就是将任意的一系列的数值映射成固定的一系列数值,这个映射的规则就是哈希算法,而通过原始数据映射之后的值就是哈希值。

         应用的领域主要用于对数据的保护,比如

(1)防止被篡改,如果发送消息,发送前结果是a,发送后结果是b,那么就被篡改了。

(2)防止直接看到明文,比如你在某个系统登陆时用的密码时111,但是系统保存时密码是被哈希算法映射之后的值。

7.字符串匹配算法

一、朴素匹配算法,就是暴力求解,从第一个字母开始,去比较模式串,如果不成功的话就从第二个字母开始匹配。依次这样比较,直到比较成功为止。

二、KMP算法,KMP算法有用到动态规划的思想,就是它通过模式串能够得到一个next数组,每次匹配失败的时候都查看已经存储的next数组,然后就知道从模式串的第几位开始重新匹配。

三、Sunday算法,在匹配的过程中,如果匹配失败,就看下个字符,如果下个字符不在模式串中,就直接跳过该字符开始新的匹配,如果下个字符出现在模式串中,那就将模式串移动到模式串中字母和下个字符相同的位置,再继续匹配,直到匹配成功为止。

8.b树与b+树区别

(1)在B树中,具有n个关键字的结点有n+1颗子树,而B+树中,具有n个关键字的结点有n颗子树。

(2)在B树中,所有结点都包含信息,在B+树中,叶结点包含信息,所有非叶结点仅起到索引作用,非叶结点只含有对应子树的最大关键字和指向该子树的指针

(3)在B树中所有结点内关键字的出现时不重复的,在B+树中,叶结点包含了所有的信息。B+树叶结点本身依照关键字从小到大链接,因此可以支持顺序查找,而B树不支持。

应用领域:

都可以应用于搜索,性能类似于二分搜查找,B树是从根节点出发,找到关键字就可以停止搜索,而B+树必须搜索到叶子结点才结束

但是B+树比B树更适合实际应用中操作系统的文件索引和数据库索引

(1) B+tree的磁盘读写代价更低,B+tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

(2)B+tree的查询效率更加稳定.任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当而B树对不同的关键字查找有很大的出入。

(3)B树没有解决元素遍历效率低的问题,只能从根出发,一个一个遍历,B+树只要从最小的关键字就可以遍历叶子节点实现整棵树的遍历。

9.冒泡排序

        冒泡排序思想就是相邻的元素两两比较,较大的数下沉,较小的数冒起来,一趟下来,最大的数就会在排列的一端。

        冒泡排序的核心部分是双重嵌套循环,时间复杂度是n2,相对于其他算法,时间复杂度较高,但是对于基本有序的数列,用冒泡排序还是非常有效的,而且时间复杂度甚至可以达到O(n)。

10.基数排序

        基数排序是基于关键字每个位数的大小进行排序,就是先按照个位的大小进行排序,在按照十位的大小进行排序,直到比到最高位,然后得到的序列就是有序序列。

应用场景:

        当元素的个数非常大,元素本身的位数不是很多,就可以使用基数排序,比如将10万个手机号码排序,只需要从第一位个位排序,再按照第二位排序,经过11次排序手机号码就有序了,而总次数就是11乘以n,时间复杂度就近似于O(n)。

11.算法与程序

算法就是处理解决问题的思路和办法。

算法的特点:

(1)可行性,算法的任何计算步骤都是可执行的具体操作。

(2)确定性,每一步都是明确定义的,不应该有模棱两可的解释。

(3)有穷性,算法必须能够在有限的时间内做完

(4)最后就是有输入项和输出项。

算法和程序的区别和联系

区别:

(1)定义不同,算法是解决问题的思路,程序是解决问题的具体的代码。

(2)书写规范不同,算法在描述上一般使用办形式化的语言,程序使用规范化的语言来描述。

联系:

        程序是算法的载体,算法是程序的灵魂。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈浩的大哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值