- 一般方法
- 二分检索
- 找最大和最小元素
- 归并分类
- 快速分类
- 选择问题
- 斯特拉森矩阵乘法
一、一般方法
思想:将整个问题分成若干个小问题之后分而治之
- 通常情况下,子问题与原问题具有相同的类型
- 可以反复使用分治策略,直到可以求解子问题为止
- 适合采用递归过程来表示
重要三步:分(divide)、治(conquer)、合(combine)
如果当前问题的规模足够小直接对其进行处理,否则执行以上三步:
- small函数判断p-q+1个是否足够小,当前问题的规模足够小
- divide函数在实现中一般使用二分法,把p-q这个区间的问题分解成p-m和m+1-q进行求解
- combine函数将问题的解进行合并然后返回
关于上述的式子对T(n)进行求解得到关于n算法的时间复杂性
二、二分检索
二分检索算法的求解原理
n为问题的求解规模,a[]代表在此求解规模中的每一个元素,x代表我现在要求解的元素。k是选择将整个表分成两份的位置,这个位置一般为中间位置。
算法描述:返回的不是元素,是元素的下标index
这里判断区间足够小是通过low和high的关系进行的;分治检索的合并步骤在这里没有进行
三、二分检索算法的正确性
覆盖到了所有的可能情况,针对每种可能情况都有其相应的处理方法。
四、二分检索算法复杂度分析
究竟属于哪种情况取决于待检索元素与A中的元素的关系;
这样的分析过程可以用二元比较树来进行,上例中成功和失败的每种情况的概率看作相等。
检索成功次数就是从根节点到内节点的路径长度+1
检索不成功次数就是对应的路径长度
二元比较树是一棵高度平衡树,因为每一次都是从middle选取的,保证了左右子树的高度之差的绝对值小于等于1
k为二元比较树的高度,最小为0层,最多为k-1层,所以上面的n是在这样一个范围内。给出了有序表长度和比较次数的关系。
成功检索的平均次数
二分检索算法改进
能否改进这种情况,每次只比较一次?
包含两个与两个以上元素才可以进入while循环
这个算法的复杂度就在于当找到最终的答案节点之后还是得等while循环结束之后才可以进行,而在普通的比较的时候只是每次比较次数都-1但是只是线性的减少实际上还是需要树的深度。
以比较为基础检索的时间下界
以比较为基础的检索算法只进行比较操作而不实行其他的运算。
在研究和分析任何以比较为基础的算法的时候都是以二元比较树的方式进行研究