算法第二次作业
一、找第 k 小的数的分治算法描述(基于快速选择思想)
核心思路:
分治算法的核心是 “分而治之”,即通过将原问题分解为规模更小的子问题,递归解决子问题后直接得到原问题的解(无需合并步骤)。对于 “找第 k 小的数”,具体步骤如下:
自然语言描述:
终止条件:若当前处理的数组只有 1 个元素,则该元素就是第 k 小的数(此时 k 必为 1)。
分解(选择基准与划分):
从数组中选择一个基准元素pivot(如随机选择、选第一个元素等)。
将数组划分为三部分:
左部分:所有小于pivot的元素;
中间部分:所有等于pivot的元素(至少包含pivot本身);
右部分:所有大于pivot的元素。
递归求解子问题:
设左部分长度为L,中间部分长度为M(M ≥ 1)。
若k ≤ L:第 k 小的数在左部分,递归在左部分中找第 k 小的数;
若L < k ≤ L + M:pivot就是第 k 小的数(因中间部分所有元素等于pivot);
若k > L + M:第 k 小的数在右部分,递归在右部分中找第k - (L + M)小的数(需调整 k 值,因右部分是 “剩余” 的元素)。
二、时间复杂度分析
最好时间复杂度:O (n)
最好情况是每次选择的pivot能将数组均衡划分(如左右部分长度接近相等)。此时,每次递归处理的子问题规模约为原问题的 1/2,总时间为
总耗时为n + n/2 + n/4 + ... ≈ 2n,即 O (n)。
最坏时间复杂度:O (n²)
最坏情况是每次选择的pivot为当前数组的最小或最大元素(导致划分极不平衡)。例如,每次选到最小元素时,左部分为空,右部分长度为n-1,递归需处理规模为n-1, n-2, ..., 1的子问题:总耗时为n + (n-1) + (n-2) + ... + 1 = n(n+1)/2,即 O (n²)。
三、对分治法的体会与思考
核心价值:简化问题规模分治法通过将复杂问题分解为结构相似的小问题,利用递归 “逐个击破”,避免了直接处理原问题的高复杂度。例如,“找第 k 小的数” 若用排序后查找需 O (n log n),而分治思想通过仅处理必要的子区间,最优可降至 O (n),体现了 “分解即优化” 的思路。
关键依赖:划分的平衡性分治法的效率极大依赖于子问题的划分是否均衡。若划分失衡(如快速选择的最坏情况),时间复杂度会急剧恶化。因此,实际应用中常通过优化划分策略(如随机选择pivot)降低最坏情况的概率,这也说明 “如何分解” 是分治法的核心设计点。
适用场景:问题可分解且子问题独立分治法仅适用于 “可分解为相似子问题” 且 “子问题结果可直接推导原问题结果” 的场景(如排序、查找、矩阵乘法等)。对于子问题依赖强或合并成本极高的问题(如某些图论问题),分治可能不如贪心或动态规划高效。
与递归的关系:递归是实现手段,分治是思想分治法常通过递归实现,但递归并非必需(也可迭代)。分治的本质是 “将大问题拆小”,而递归只是简化代码的工具。例如,二分查找的迭代实现仍属于分治思想。
综上,分治法是一种 “以空间换时间”(递归栈开销)或 “以简单换复杂”(子问题处理)的思想,其核心在于合理分解问题,平衡子问题规模,从而高效解决复杂问题。

浙公网安备 33010602011771号