算法第四周_深度优先搜索,广度优先搜索,贪心算法,二分查找

搜索和遍历

搜索和遍历做的事情是把所有节点都仅访问一遍,没有智能的功能在里面,
在这里插入图片描述
每个节点仅访问一次的内涵:我们在搜索中不想做过多无用的访问,不然访问的效率会比较低,
对于节点的访问顺序,常用的是深度 优先,广度优先,优先级优先,我们是可以自己定义的,优先级优先搜索也叫做启发式搜索,而估价函数和整个搜索效率的话属于机器学习的范畴,比如推荐算法,

深度优先搜索

深度优先搜索(DFS):使用递归方法,栈的数据结构
深度优先示例代码
二叉树:
在这里插入图片描述
多叉树:
在这里插入图片描述
代码解析:
递归终止条件–》处理当前层—》下转
DFS非递归写法
手动维护一个栈,手动把状态加进去
在这里插入图片描述

广度优先搜索

广度优先搜素(BFS):使用归纳方法,队列的数据结构,这里的队列可以是数组,链表或者双端队列deque(python中高性能的数据结构connections.deque)
解决问题:层序遍历,最短路问题
BFS代码示例:
在这里插入图片描述
也可以自己手动维护一个栈去实现。

层序遍历和BFS的区别:层序遍历输出的是一个二维数组,BFS输出的是一维数组

贪心算法

贪心算法与动态规划的区别:
在这里插入图片描述
贪心算法:当下做局部最优判断,不会做回退操作
回溯:能够回退
动态规划:最优判断+回退,动态规划会保存之前的运算结果,对当前选择有回退功能,

有时候局部最优并不能保证最终的全局最优,但是在某些情况是可以使用贪心算法的,有时候在某一步可以使用贪心算法,然后在全局的话可以再加一个搜索递归或者动态规划。

贪心算法解决的问题:

在这里插入图片描述

贪心法试用的场景

在这里插入图片描述

在这里插入图片描述
贪心法的反例如上,所以我们在使用贪心法的时候需要首先证明此应用场景能够使用贪心算法的正确性。

贪心法的应用

1.直接使用
2.稍微转化一下,再进行贪心求解
3.从后向前或者从前往后贪心

二分查找

二分查找的前提条件
在这里插入图片描述
二分查找的代码模板
在这里插入图片描述
这个模板,递归模板,分治回溯模板,动态规划模板都是需要形成肌肉式记忆。

二分法有点像二叉搜索树,不过是使用数组来实现的。

二分查找考察的重点
1.思维逻辑是否清晰
2.代码能力
3.debug能力是否达标
4.首先还得说明为什么能够使用二分查找,以求平平方根为例,因为y=x**2是抛物线右半部分,是单调递增的,并且有上下界,所以能够使用二分查找,

求平方根,实际使用中使用更多的是牛顿迭代法,而不是二分查找法。
牛顿迭代法介绍
fast invSqrt
牛顿迭代法讲解

leetcode练习题:
33. 搜索旋转排序数组
1.暴力法:还原成升序的数组(O(log(n)))–>二分–》(O(logn))
2.正解:二分查找
a.单调
b.边界
c.index
好的解题思路

猜你喜欢

转载自blog.csdn.net/a18829292719/article/details/111510524