本周的学习主要是搜索
复习递归,总结一下递归形式1.找到递归关系,前一状态与后一状态的关系,直到已知状态。2.设置边界,找到初末递归状态。(知道什么时候停止)3.设计递归函数。(主要运用的是二分法的有关知识)。
做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类:
1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置。这种题目继续进阶一下就是在有序数组中查找元素的上下限。继续做可以求两个区间的交集。
2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况。
3.在杨氏矩阵中利用二分查找,针对矩阵性质的不同,有多种解法,可以对每一行遍历然后进行二分,也可以从左下角进行二分查找,也可以从右上角进行二分查找。
4.函数的极大值问题,就是在一个数组中求极大值,极大值就是某个数大于数组当中左右两边的数,位于端点的元素只需大于它挨着的元素就行。典型的例题就是寻找峰值问题。
5.利用极限和二分查找的思想,进行幂运算,开平方根和对数函数的求解,对于浮点数和整数有何异同。
工作流程
将中间元素与target进行比较如果匹配,则返回true如果不匹配, 如果中间元素比target大,则继续搜索左半部分; 如果中间元素比target小,则继续搜索右半部分不断搜索,直到找到target或者查找区间变为04、伪代码以下是二分查找的伪代码,当数组没有重复元素时,返回target的下标或者查找失败的标志;当数组有重复元素时,返回其中一个元素的下标,具体返回哪个取决于数组中数据的分布状况5、性能分析二分查找是一种高效的查找算法,当数据规模为n,由于每次迭代数据都会缩小为原来的一般,所以被查找区间的大小变化依次为:n, n/2, n/4, n/8, …, n/2^k, …。也就是按等比数列的形式缩小。由于当数据量大小为1时,停止迭代,所以,另n/2^k = 1,即可计算出总共迭代次数为k = logn。而时间复杂度无非就是循环次数,所以时间复杂度为O(logn)。空间复杂度比较次数 最坏最好。
而且在此想说一下运用递归的条件,问题可用递归来解决需具备的条件:
子问题需与原问题为同样的事,且规模更小;(在此回顾一下,纯属防止忘记),而且本周主要学习二分 所以总结也只能从这种方面了。希望以后继续深入学习。