目录
数据结构及算法应用——分治法
对于一个规模为n的问题,若该问题可以容易的解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题相互独立且与原问题形式相同,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解。
- 该问题的规模缩小到一定的程度就可以容易的解决
- 该问题可以分解为若干个规模较小的相同问题
- 利用该问题分解出的子问题的解可以合并为该问题的解
- 该问题所分解出的各个子问题是相互独立的
- 分解
- 解决
- 合并
数据结构及算法应用——分治法——递归技术分治法
数据结构及算法应用——分治法——二分法查找分治法
数据结构及算法应用——回溯法
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标,但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。这种走不通就退回再走的技术就是回溯法。
数据结构及算法应用——贪心法
总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择知识当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不必为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。
数据结构及算法应用——动态规划法
在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解。
数据结构及算法应用——案例分析
数据结构及算法应用——案例分析——案例分析A
【说明】
设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别为(),且有。为节省运输成本,用尽可能少的集装箱来装运这n个货物。
下面分别采用最先适宜策略和最优适宜策略来求解该问题。
最先适宜策略(Firstfit)首先将所有的集装箱初始化为空,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中。
最优适宜策略(Bestfit)与最先适宜策略类似,不同的是,总是把货物装到能容纳它且目前剩余容量最小的集装箱,使得该集装箱装入货物后闲置空间最小。
【C代码】下面是这两个算法的C语言核心代码
(1)变量说明:
- n:货物数量
- C:集装箱容量
- s:数组,长度为n,其中每个元素表示货物的体积,下标从0开始
- b:数组,长度为n,b [ i ] 表示第 i + 1 个集装箱当前已经装入货物的体积,下标从0开始
- i,j:循环变量
- k:所需的集装箱数
- min:当前所用的各集装箱装入了第 i 个货物后的最小剩余容量
- m:当前所需要的集装箱数
- temp:临时变量
【问题1】:根据【说明】和【C代码】,填充C代码中的空(1)~(4)。
【问题2】:根据【说明】和【C代码】,该问题在最先适宜和最优适宜策略下分别采用了(5)和(6)算法设计策略,时间复杂度分别为(7)和(8)(用O符号表示)。
【问题3】:考虑实例 n = 10,C = 10,各个货物的体积为(4,2,7,3,5,4,2,3,6,2)。该实例在最先适宜和最优适宜策略下所需的集装箱数分别为(9)和(10)。考虑一般的情况,这两种求解策略能否确保得到最优解?(11)(能或否)。
答:
【问题1】:
(1):j = 0
(2):b [ j ] = b [ j ] + s [ i ]
(3):min = temp
(4):b [ m ] = b [ m ] + s [ i ]
【问题2】:
(5):贪心
(6):贪心
(7):
(8):
【问题3】:
(9):5
(10):4
(11):否
数据结构及算法应用——案例分析——案例分析B
【说明】
采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含 n / 2 个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排好的子数组得到排序结果。
下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下:
- arr:待排序数组
- p,q,r:一个子数组的位置从 p 到 q,另一个子数组的位置从 q + 1 到 r
- begin,end:待排序数组的起止位置
- left,right:临时存放待合并的两个子数组
- n1,n2:两个子数组的长度
- i,j,k:循环变量
- mid:临时变量
【问题1】:根据以上说明和C代码,填充(1)~(4)。
【问题2】:根据提干说明和以上C代码,算法采用了(5)算法设计策略。分析时间复杂度时,列出其递归式为(6),解出渐进时间复杂度为(7)(用O符号表示)。空间复杂度为(8)(用O符号表示)。
【问题3】:两个长度分别为 n1 和 n2 的已经排好序的子数组进行归并,根据上述C代码,则元素之间比较次数为(9)。
答:
【问题1】:
(1):k <= r 或 k < r + 1
(2):arr [ k ] = right [ j ]
(3):begin < end
(4):mergeSort ( arr,mid + 1,end )
【问题2】:
(5):分治
(6):T ( n ) = 2T ( n/2 ) + n 或 T ( n ) = 2T ( n/2 ) + f ( n ) ( f ( n )为线性函数)
(7):O ( nlogn )
(8):O ( n )
【问题3】:
(9):n1 + n2