首先必须强调的是,我是个算法渣,多少年了~~还是渣/(ㄒoㄒ)/~~
这学期在上英文算法课,机缘巧合选了英文,觉得老师讲得还不错,所以没换到中文。想要通过这样总结一下加深算法理解,考试时也方便复习。
第一次课是对学习算法课需要的数学基础知识的复习,如集合以及集合的操作,函数,关系等,和一些数学证明方法的介绍,包括通过构造证明,通过对照证明(举反例,找矛盾),通过案例证明(可以理解为分情况讨论证明同一个结论对任一情况都成立),通过数学归纳法证明(包含最小反例法则,数学归纳的强法则)。
第二次课是接触算法必须的算法复杂度分析,包括时间和空间上的复杂度分析。通过列举了几个算法实际案例进行的分析,包括两种搜索方法(线性搜索,二分搜索),一个合并算法(将两个已经排好序的列表合并)和三种排序算法(选择排序,插入排序和合并排序)。
第一个详细讲的算法是分治算法,该算法主要用于解决这样条件下的问题:
(1) 可以被分解成若干个相同的更小的子问题,即该问题具有最优子结构性质;分解到一定的程度就会很容易解决;
(2) 可以循环解决这些子问题;
(3) 最后可以合适的将子问题的解合并为该问题的解;
(4) 该问题分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
实际问题就是逐一地解决这三个步骤:在将问题分解成子问题;在递归的最后一步,当问题变得足够小的时候,可以被直接解决了;以及将子问题的答案合并。
使用分治算法的经典例子如下:
(一) 乘法运算
(二) Merge排序
(三) 求中位数
(四) 矩阵的乘法
先就