算法图解学习笔记之算法

一、二分查找

二分查找的输入是一个有序的元素列表。如果元素在列表中,返回其位置,否则返回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最近邻算法(机器学习常用)

特征抽取,分类时抽取元素的特征,根据特征绘图。如果有多个特征,建议通过降维将维度缩小到二维或者三维。

通过毕达哥拉斯公式,计算其他元素跟该元素的距离。将该元素分类为与该元素距离越近的分类

分类就是编组

回归就是预测结果

 

posted @ 2019-09-28 15:22  菲菲菲菲菲常新的新手  阅读(...)  评论(... 编辑 收藏