算法第二章实践作业
找第 k 小数的分治算法通常称为快速选择,本质是快速排序划分思想的“减治”版本。
核心步骤:
在数组 A[l..r] 中选一个枢轴 pivot;
进行划分,使左边元素 ≤ pivot,右边元素 ≥ pivot;
设枢轴最终位置为 p,左半部分加枢轴共有 leftSize = p - l + 1 个元素;
若 k == leftSize,返回 A[p];
若 k < leftSize,只递归左半部分找第 k 小;
若 k > leftSize,只递归右半部分找第 k - leftSize 小。
时间复杂度:
最好情况:每次划分后问题规模迅速缩小,或直接命中,时间复杂度为 O(n);
最坏情况:每次枢轴都是最大或最小元素,只排除一个元素,时间复杂度为 O(n²);
平均/期望情况:随机选择枢轴时,期望时间复杂度为 O(n);
若用 BFPRT 等中位数选择算法,可保证最坏也为 O(n)。
分治法体会和思考:
分治法通常包括“分解—解决—合并”,但第 k 小问题每次只递归处理一个子问题,属于“减治”;
划分是关键,枢轴选择直接影响效率;
子问题越平衡,算法越快;划分极端会退化为 O(n²);
随机化可有效避免最坏情况,使期望时间达到 O(n);
分治思想的核心是:通过划分缩小问题规模,舍弃无关部分,只在可能包含答案的子问题中继续求解。
浙公网安备 33010602011771号