常用算法

1
算法
算法.....................................................................................................................................1
1. 时间复杂度和空间复杂度..........................................................................................2
2. 排序..............................................................................................................................2
3. 查找..............................................................................................................................4
4. 布隆过滤器..................................................................................................................4
5. 字符串比较..................................................................................................................5
6. 深度,广度优先..........................................................................................................6
7. 贪心算法......................................................................................................................6
8. 回溯算法......................................................................................................................6
9. 剪枝算法......................................................................................................................6
10. 动态规划..................................................................................................................7
11. 朴素贝叶斯..............................................................................................................7
12. 推荐算法..................................................................................................................7
13. 最小生成树算法......................................................................................................7
14. 最短路径算法..........................................................................................................7
2
1. 时间复杂度和空间复杂度
时间复杂度
代码执行时间随数据规模增长的变化趋势
空间复杂度
算法的储存空间与数据规模之间的增长关系
2. 排序
选择排序
从数组中找到最小的值和第一个互换,第二小的和第二个互换,以此类推
时间复杂度:最好On2,最坏On2,空间复杂度:O1
不是稳定排序算法
冒泡排序
判断相邻两个大小,不满足排序规则则互换,N次之后,达到排序效果
时间复杂度:最好On,最坏On2,空间复杂度O1
是稳定排序算法
插入排序
分为已排序区和未排序区,未排序区依次在已排序区找到自己的位置
时间复杂度:最好On,最坏On2,空间复杂度:O1
是稳定的排序算法
3
快速排序
随便拿一个数,把小于这个数的放他左边,大于的放他右边,然后分治,直到
个数为1,再合并
时间复杂度:最好Onlogn,最坏On2,空间复杂度O1
不是稳定排序算法
归并排序
分治思想,中间分开为两部分,分到单个数字开始再两两比较合并
时间复杂度:最好Onlogn,最坏Onlogn,空间复杂度On
是稳定排序算法
希尔排序
堆排序
先建堆,然后依次把根节点拿出来
时间复杂度:Onlogn,空间复杂度:O1
是稳定排序
计数排序
桶排序的特殊情况,数组不大时候,直接用排序数字当数组下标,然后数组值
为对应下标的个数。
时间复杂度:On,空间复杂度:On
是稳定排序
桶排序
4
用N个桶划分数组,然后每个桶里的分开排序
时间复杂度:On,空间复杂度:On
是稳定排序算法
基数排序
先让所有要排序的数字位数相等,不足补0,然后,先万位,再千位,这样依
次排序
时间复杂度:On,空间复杂度:On
是稳定排序算法
3. 查找
二分查找
已经排好的序列,拿中间的判断在左还是在右,然后递归
二分查找依赖的是顺序表结构,也就是数组
二分查找针对的是有序数组
数据量太小不适合二分查找
数据量过大也不适合二分查找
4. 布隆过滤器
举例:10亿数字,插入判重,可以把每个插入的数字通过N个hash算法,算出N1,
N2,N3,N4...值,把bitset中的NUMS[N1],NUMS[N2],NUMS[N3]都置为1,这时候
插入一个数字A,同样通过这N个hash算法,算出N1N2N3,看看NUMS[N1],NUMS
[N2],NUMS[N3]是否都为1,为1则已有这个。
5
缺点:存在判错,因为可能出现A是N1,N2,N3,B是N3,N4,N6,这时候插入个C,
计算出结果是N1,N3,N6,但是这三个hash结果都是1,所以误判为已有C。
5. 字符串比较
BF算法
Brute Force(暴力匹配法)朴素匹配算法
主字符串依次判断是否有B字符串,双重遍历,暴力破解
时间复杂度较高,O(n*m)
实际中,代码简单,不易出错,较多使用
RK算法
Rabin-Karp
使用hash算法,例如:abcdefg中查找def,那么把原字符串通过hash算成abc
bcd cde...再通过比较特别的hash算法,比如字符串是az,
那么cba=c*26*26+b*26+a=2*26*26+1*26+0=1353,然后把hash算出来的值
放入数组,然后检测要比较的同样通过hash算出来的值是否在数组中。
时间复杂度:On
等于是借助hash算法对BF算法的改良。
BM算法(待定)
坏字符规则
abcdefghi匹配ghi,判断f和c,不相等再判断ghi中是否有c,没有,直接跳3位
,以此类推,3次判断出来
6
但是如果出现aaaaaaaa中找baa的情况,就会出现挪动位置为
好后缀规则
KMP算法
6. 深度,广度优先
广度优先(BFS)
一圈一圈向外扩散
深度优先(DFS)
走迷宫方式,一条道走到黑,发现没路就回到上一个路口再走,直到找到出口
7. 贪心算法
有限定值和期望值,满足限定值得情况下,期望值最大
每次选择当前情况下,在对限定值同等贡献量的情况下,对期望值贡献最大的数
据。
贪心算法并不能每次都给出最优解
8. 回溯算法
大部分情况都通过广义搜索
通过递归把所有的结果算出来,然后根据结果来决定最优解
可以通过剪枝来提高回溯效率
也可以通过加回溯备忘录的方式,来避免重复子问题。
9. 剪枝算法
7
10. 动态规划
把问题分成多个阶段,每个阶段对应一个决策,记录每个阶段可达的状态集合,
然后依次推导下一个状态的状态集合,动态推进
一般能用动态规划解决的问题,都可以通过回溯算法的暴力搜索解决,可以先用
回溯,定义状态,画出递归图,找规律,看看是否能用动态规划解决。
11. 朴素贝叶斯
通过概率统计过滤
事件B发生的前提下,时间A发生的概率P(A|B)=P(B|A)*P(A)/P(B)
12. 推荐算法
13. 最小生成树算法
Kruskal算法
1.把每条边按从小到大排序
2.选择代价最小的边,保证这条边的两个顶点不在同一棵树,连接这两个顶点

3.依次类推,把所有顶点都连接起来
Prim算法
加点法,也就是从顶点开始,找最短的那条边,连接,然后把连接的顶点加入
列表,然后依次找列表中顶点相邻的未连接的最短边。
14. 最短路径算法
Dijkstra算法
8
一层一层,不断比较更新每个顶点的距离,直到所有顶点都给出结果,最后根据
目的地的当前值,给出所走过的路径。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值