软件设计师备考-(十六)数据结构及算法应用(重要)

发布于:2025-09-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

16.1 前言

16.2 分治法

16.3 分治法(递归技术)

16.4 分治法(二分查找法)

  • 二分法:二分查找算法是一种在有序数组中查找某一特定元素的搜索算法,其思想就是不断地将有序查找表“一分为二”,逐渐缩小搜索区域,进而找到目标元素。
    • 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;
    • 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
      • 小于中间元素m:high = m-1
      • 大于中间元素m:low = m+1
    • 如果在某一步骤数组 为空,则代表找不到。
    • 这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)
    • 注:使用二分查找的前提条件是,数组已经是有序的

伪代码举例:

  • L:可以理解为数组
  • m:就是中间元素的下标
  • a:开始下标(左、low)
  • b:结束下标(右,hign)
  • x:查找的值

16.5 回溯法

16.6 贪心法

  • 贪心法最经典的示例:解决背包问题
    • 下图中,假设背包的贪心算法的规定是:每10体积的价值最优
    • 那么物品1每10体积价值:70
    • 物品2每10体积价值:60
    • 物品3每10体积价值:50
    • 贪心算法就会将物品以,物品1—》物品2—》物品3的顺序放入
    • 当开始放物品3的时候发现背包容量不足,就停止放入
  • 关于背包问题,需要注意的事项:
    • 物体唯不唯一(一个物体只有一个,只能放一个到背包中【零一背包问题】)
    • 物体如果可以重复放的话,那最优解结果又不一样了

  • 判断是否使用了贪心算法:每一步结果使用最优,但是最终结果不一定是最优解

16.7 动态规划法

动态规划法的特点是会创建一个表,进行填表

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


  • 问题一:

    • (1)j = 0

      • 由代码中可知,没有给j初始化赋值,所以这里的代码应该是j=0,初始化j的下标

    • (2)b[j] = b[j]+s[i]

      • s:表示货物的体积

      • b:表示集装箱当前已经装入货物的体积

      • 由题可知,最先适宜策略,是每次将一个货物装入第一个能够容纳它的集装箱中。

      • b(当前下标集装箱已经装入货物的体积) = s(当前下标货物的体积) + b(当前下标集装箱已经装入货物的体积)

    • (3)min = temp

      • 由题可知,最优适宜策略,总是把货物装到能容纳它,且目前剩余容量最小的集装箱【其实可以理解为,合理利用每一点资源,最佳利用资源】

      • temp = C - b[j] - s[i],表示集装箱容量-当前下标位置的货物的体积-当前下标已经装入货物的体积 = 剩余的体积

      • min = temp,题中说min表示当前所用集装箱装入货物后的最小剩余容量,起始就是上述计算出来的temp

    • (4)b[m] = b[m]+s[i]

      • 根据题可知,我们在计算出,temp的时候,下面给m = j ,赋了一个值,这个值就表示,当前容量最小且能容下物品的集装箱的下标位置。

      • 下面就要将物品添加到集装箱中,b[m] = b[m]+s[i],b当前集装箱的装入货物的体积 = b当前集装箱的装入货物的体积 + s所要添加货物的体积

    • 问题二:
      • (5)、(6)贪心法
      • (7)、(8)都是 o(n*n)——o(n²),双层for循环

    • 问题三:
      • 由题可知,n=10表示有10个货物
      • C=10,表示集装箱的容量为10
      • 最优:先从剩余量最小的箱子匹配
      • 最先:第一个可以容纳货物容量的
      • (9)5、(10)4
      • (11)否,因为无论是最先适宜策略,还是最优适宜策略,都是贪心算法,它只保证每一步是最优解,但并不保证整体能够达到最优解。

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

    • (5)分治
      • 由题可知,采用归并排序,将元素分成n/2个子元素,然后用归并排序对俩个子数组进行递归排序,最后再进行合并2个子数组【符合分治算法的理念,分解——解决——合并
    • (6)T(n) = 2T(n/2)+O(n)
      • 假设时间为T(n)的话,那么分治,解决俩个子问题(mergeSort),一个就为T(n/2),俩个就为2T(n/2)
      • 下面还有一个归并,merge(arr,begin,,mid,end),通过代码发现,归并,最多都是单程循环,所以时间复杂度为O(n)
      • T(n) = 2T(n/2)+O(n)
    • (7)O(n log n)
    • (8)O(n)
      • 空间复杂度:我们需要的空间有多少个,就有多少的交换空间
    • (9)n1+n2
      • 分治后n1与n2已经排好序了,然后进行归并,其实就是n1的每个数据与n2的每个数据一一比较,最终是n1+n2

    文档说明:希赛教育王勇老师软件设计师教学课程,这里学习整理后进行分享


    网站公告

    今日签到

    点亮在社区的每一天
    去签到