一、二分查找
二分查找的输入是一个有序的元素列表。如果元素在列表中,返回其位置,否则返回null
二分查找每次都将列表分成两半,分别与查询元素对比。舍弃其中一半。然后再另一半中查找元素。
每次都可以排除一半的元素。所以其效率为O(logn以2为底)
二分查找查询的速度非常快,但是要求也比较严格,需要有序的列表。如果是无序的列表,就不能每次排查一半了。
二、递归
递归应该不算算法的一种,但是还是稍微提一下
递归其实就是循环调用某个函数,直到满足条件才退出。
递归中很重要的是基线条件和递归条件
基线条件是退出递归的条件,如果没有基线条件,那么递归不会停止。陷入无限的循环中。
递归条件是满足这些条件才循环调用函数。
两者缺一不可
三、快速排序(排序算法的一种,简称快排)
快排经常会和递归一起使用
其基线条件为,数组为空或者只包含一个元素。因为为空和只有一个元素就不需要排序了,直接返回。
递归条件为,从数组中取出一个元素,将其他元素分成两部分,一部分大于该元素,一部分小于该元素(等于可以包含再大于或者小于之中,都可以),然后递归调用大于该元素的数组和小于该元素的数组。返回大于元素的数组(递归调用结束后有序)+元素+小于元素的数组(递归调用结束后有序)。
快排的最好情况效率是O(n*logn),最坏情况是O(n*n)
假设传入的是一个有序的数组
我们选择的元素是数组第一个元素。
那么就会出现最坏情况,递归次数为n次,每次对比n-1,n-2,到1次,那么就是n*n
如果我们选择元素是数组中间元素
那么就会出现最佳情况,递归次数为logn次,那么就是n*logn
最佳情况其实也是平均情况,只要每次随机选择一个数组元素作为基准值。
四、广度优先搜索
广度优先搜索时一种用于图的查找算法,可邦族回答两类问题
1、从节点A出发,有前往节点B的路径吗?
2、从节点B出发,前往节点B的那条路径最短?
广度优先搜索经常搭配队列使用,
首先将出发点的所有邻居加入队列,遍历每个邻居,找到终点直接返回,否则把每个邻居的邻居加入队列,一直循环往复,直到找到终点或者队列为空。
广度优先搜索的效率为O(V+E),V时顶点数,E为边数
五、狄克斯特拉算法
狄克斯特拉算法通常用来处理加权图,包含四个步骤
1、找出最便宜的节点,即可在最短时间内到达的节点
2、更新该节点的邻居开销
3、重复这个过程,直到对图的每个节点啊都这样做了
4、计算最终路径
狄克斯特拉算法不能处理环,因为环会导致无限循环。陷入我也是我的邻居的邻居的无限循环中。
环其实就是无向图。所以狄克斯特拉算法只能处理加权有向图。权重不能为负
五、贪婪算法
贪婪算法很简单,每步都采取最优的做法,最终得到一个局部最优解(可能是全局最优解)
NP完全问题(很难找到快速解决方案)
判断问题是否为NP完全问题一些方法
1、元素少时算法运行速度非常快,但是元素数量增加,速度变得非常慢
2、涉及“所有组合”的问题通常都是
3、不能将问题分为小问题,必须考虑各种可能的情况。可能是NP完全问题
4、问题涉及序列且难以解决,可能就是NP完全问题
5、问题涉及集合且难以解决,可能就是NP完全问题
6、问题可转换为集合覆盖问题或旅行商问题,肯定是NP完全问题
六、动态规划
动态规划通过将问题分为若干个离散的子问题,分别解决各个子问题,然后得到最终答案。
七、K最近邻算法(机器学习常用)
特征抽取,分类时抽取元素的特征,根据特征绘图。如果有多个特征,建议通过降维将维度缩小到二维或者三维。
通过毕达哥拉斯公式,计算其他元素跟该元素的距离。将该元素分类为与该元素距离越近的分类
分类就是编组
回归就是预测结果