算法第二章实践作业

1.用自然语言或伪代码描述找第k小的数的分治算法
答:从给定的一组数字中随机找一个数作为基准,把比这个数小的数字放在这个数左侧,比这个数大的数字放在这个数的右侧。假设排好后左边有n个数字,那么当前基准数就是数组中第n+1小的数。比较n+1与k,若n+1=k,那么直接返回n+1,如果n+1<k,从当前基准数左侧进行递归处理,重新随机找一个数作为新的基准数。若n+1>k,那么对当前基准数右侧数进行操作。随机选取一个数作为基准数进行递归处理。最后当n+1=k时,返回当前值。
2.分析该算法的最好时间复杂度和最坏时间复杂度
最好时间复杂度:最好的情况是每次选取的基准数都为当前一组数的1/2,这样问题规模每次都会缩小为原来的1/2,算出来的最小时间复杂度T(n)= O(n);最坏时间复杂度:最坏情况是对于一组有序数组,每次选取的基准数都是当前一组数的极值,这样问题规模只能-1,及缩小为n-1。算出来的最坏时间复杂度为T(n)= O(n^2).
3.结合本章的学习,谈谈你对分治法的体会和思考
分治法分为三个步骤:分,治,合。即拆分子问题,分别求解子问题,合并子问题。拆分子问题一般比较简单,难点在于分别求解子问题和合并子问题,用什么办法使用什么工具求解,合并。分治法一般思路比较清晰,可能可以想到,但是代码具体实现有些难。并且在求解某些问题上可能会浪费时间或者空间。这时候可以用备忘录,填表等方法解决。

posted @ 2026-10-13 22:07  林靖杰  阅读(5)  评论(0)    收藏  举报