中级职称软考设计师笔记之【数据结构及算法应用】

目录

数据结构及算法应用——分治法

数据结构及算法应用——分治法——递归技术分治法

数据结构及算法应用——分治法——二分法查找分治法

数据结构及算法应用——回溯法

数据结构及算法应用——贪心法

数据结构及算法应用——动态规划法

数据结构及算法应用——案例分析

数据结构及算法应用——案例分析——案例分析A

数据结构及算法应用——案例分析——案例分析B


数据结构及算法应用——分治法

对于一个规模为n的问题,若该问题可以容易的解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题相互独立且与原问题形式相同,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解。

  • 该问题的规模缩小到一定的程度就可以容易的解决
  • 该问题可以分解为若干个规模较小的相同问题
  • 利用该问题分解出的子问题的解可以合并为该问题的解
  • 该问题所分解出的各个子问题是相互独立的
  • 分解
  • 解决
  • 合并

数据结构及算法应用——分治法——递归技术分治法

数据结构及算法应用——分治法——二分法查找分治法

数据结构及算法应用——回溯法

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标,但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。这种走不通就退回再走的技术就是回溯法。

数据结构及算法应用——贪心法

总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择知识当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不必为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。

数据结构及算法应用——动态规划法

在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解。

数据结构及算法应用——案例分析

数据结构及算法应用——案例分析——案例分析A

【说明】

设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别为(S_{1},S_{2},...,S_{n}),且有s_{i}\leq C(1\leq i \leq 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):O(n^{2})

(8):O(n^{2})

【问题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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vin Cente

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值