第2章作业——对分治法思想的体会及组队编程情况
1.对分治法思想的体会
基本概念:
分治,字面上的解释是“分而治之”。分治法的基本思想是将一个规模为n的问题分解为k个规模较小的问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
收获:
(1)对分治法的基本操作有所了解。分治法的一般设计模式涵盖递归算法,分治法的计算效率可以用递归方程来进行分析。一个分治法会将规模为n的问题分成k个规模为n/m的子问题去解。
(2)学习到运用分治策略的一些典型例子:(简单概括)
①二分搜索算法
二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,即一个完整的数组被分成两个数组,先从原本的整个数组的中间位置开始找,匹配则输出,不匹配则根据数字大小比较的条件在某一半的数组继续寻找。对该算法进行循环操作的同时将待搜索数组的大小减小一半。该算法时间复杂度为O(logn)。
②Strassen矩阵乘法
通过对矩阵进行分块成大小相等的n个子矩阵,压缩乘法运算的次数,虽然加法运算的次数增加了,但是多个加法运算的速度会快于1个乘法运算的速度。
③合并排序&快速排序
合并排序基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,在递归的过程中使一段数据变成有序序列,是对冒泡排序的一种改进。
比较两种排序的异同点:
相同点:
两者均采用由小极大的分治法;
均采用了递归调用来实现排序。
不同点:
归并排序:
是从局部的角度开始排序的,递归发生在处理整个数组之前;每一轮排序后需要归并,以达到局部的上一层有序;由于先递归后排序,得到的是一个局部有序的数组。
快速排序:
是从整体的角度开始排序的,递归发生在处理整个数组;当两个子数组有序的时候整体也就有序,不需要归并这一步;先排序后处理数组,得到的是整体有序的数组。
存在问题:
(1)仍然不太清楚如何根据分治法的分割原则按多大的规模把原问题分成多少个子问题。
(2)虽然说在做第二章相关题目的时候能按照自己的思路把关键的算法写出来,不过对分治思想掌握得还不够透彻,只掌握了基本概念,在后续动态规划相关内容的学习中遇到了困难,不懂得如何灵活应用之前学过的分治思想。
2.结队编程情况汇报
成员:
唐伟严、王恬萌和我
编程情况:
第一次组队上机编程,整体情况还不错。我负责书写代码,其余俩人负责梳理题目及实现代码的思路,彼此之间比较有默契,也相对高效地完成了上机的实践作业。遇到一个比较大的问题是在做7-3两个有序序列的中位数这道题的时候,由于快到下课时间而且没有拓宽自己思考的空间,所以匆匆忙忙之中没有考虑到用时间复杂度为O(logn)的算法完成这个作业,导致整个代码段看起来比较繁琐。所以下次组队上机实操的时候会根据题目要求先思考清楚代码实现的过程再在配合的过程中完成作业。
浙公网安备 33010602011771号