算法实践第二次作业

news/2025/11/2 21:56:24/文章来源:https://www.cnblogs.com/HaungCanran/p/19185501

一、找第 k 小的数的分治算法描述(伪代码 + 自然语言)
伪代码
plaintext
function findKthSmallest(arr, low, high, k):
if low == high: # 子数组仅1个元素,直接返回
return arr[low]
# 步骤1:选基准元素(此处选数组最后一个元素),划分数组
pivotIndex = partition(arr, low, high)
# 步骤2:计算基准元素在有序数组中的最终位置(从low开始计数)
rank = pivotIndex - low + 1
# 步骤3:分治递归
if rank == k: # 基准元素就是第k小,直接返回
return arr[pivotIndex]
elif rank > k: # 第k小在基准左侧子数组,递归左半部分
return findKthSmallest(arr, low, pivotIndex - 1, k)
else: # 第k小在基准右侧子数组,递归右半部分(k更新为k - rank)
return findKthSmallest(arr, pivotIndex + 1, high, k - rank)

辅助函数:划分数组(按基准元素分,左小右大)

function partition(arr, low, high):
pivot = arr[high] # 基准元素
i = low - 1 # 小于基准区域的右边界
for j from low to high - 1:
if arr[j] <= pivot:
i += 1
swap(arr[i], arr[j]) # 扩大小于基准的区域
swap(arr[i + 1], arr[high]) # 基准元素放到最终位置
return i + 1 # 返回基准元素索引
自然语言描述
终止条件:如果当前处理的子数组只有 1 个元素,这个元素就是第 k 小的数,直接返回。
划分步骤:选数组中一个元素作为基准(如最后一个元素),通过划分操作将数组分成两部分 —— 左半部分元素都小于等于基准,右半部分都大于基准,基准元素落在最终有序数组的确定位置。
确定递归方向:计算基准元素在当前子数组中的 “排名”(即它是子数组中第几个最小的数)。
若排名等于 k,基准元素就是目标答案。
若排名大于 k,目标在基准左侧的子数组,递归处理左半部分。
若排名小于 k,目标在基准右侧的子数组,递归处理右半部分(此时 k 需减去左侧子数组的长度,即基准的排名)。
二、算法时间复杂度分析
核心前提
算法的时间复杂度主要由 “划分步骤” 和 “递归深度” 决定,划分步骤的时间复杂度为 O (n)(n 为当前子数组长度)。
最好时间复杂度:O (n)
理想情况:每次划分后,基准元素恰好是当前子数组的 “中间位置” 元素(即划分后左右子数组长度接近相等)。
递归深度:log₂n(每次子数组长度减半),每一层的总划分时间为 O (n)(所有子数组长度之和为原数组长度 n)。
总时间:O (n) + O (n) + ... + O (n)(共 log₂n 层)= O (n log n)?不,实际是 O (n)—— 因为每一层的总操作量是 O (n),而 log₂n 层的总和为 n + n/2 + n/4 + ... + 1 = 2n - 1 = O (n)(等比数列求和)。
最坏时间复杂度:O (n²)
极端情况:每次划分后,基准元素是当前子数组的 “最值”(如数组已升序,每次选最后一个元素为基准,划分后左子数组长度为 n-1,右子数组为空)。
递归深度:n(每次子数组长度仅减少 1),第一层划分时间 O (n),第二层 O (n-1),...,最后一层 O (1)。
总时间:O (n) + O (n-1) + ... + O (1) = O (n²)。
三、对分治法的体会和思考

  1. 分治法的核心逻辑
    分治法的本质是 “化繁为简”,将一个规模为 n 的复杂问题,分解为 k 个规模更小的子问题(子问题与原问题结构相同),分别求解子问题后,合并子问题的解得到原问题的解。它的核心是 “分解 - 求解 - 合并” 三步,但部分场景(如找第 k 小的数)可省略 “合并” 步骤,直接通过子问题的解得到原问题答案。
  2. 分治法的优势与适用场景
    优势:能将高复杂度问题拆解为低复杂度子问题,充分利用递归或迭代的方式降低编码难度,同时在理想划分下能大幅提升效率(如排序算法中的快速排序、归并排序,均基于分治法实现高效排序)。
    适用场景:问题可拆分为结构相同的子问题、子问题相互独立(无依赖关系)、子问题的解可合并为原问题的解。例如数组查找、排序、大数乘法、矩阵乘法等问题。
  3. 分治法的关键与局限
    关键:划分策略直接决定算法效率。如找第 k 小的数中,“基准元素的选择” 是核心 —— 若能每次选到中间元素(如随机选基准、三数取中法),可将最坏时间复杂度优化为 O (n)(概率意义上);若划分失衡,会导致效率骤降。
    局限:递归实现时会产生额外的栈空间开销,若划分不当(如极端划分),时间复杂度会退化到平方级;部分问题的 “合并” 步骤开销较大(如归并排序的合并步骤需 O (n) 时间)。
  4. 学习体会
    分治法教会我们 “拆分问题的思维”—— 面对复杂问题时,不必急于求成解决整体,而是先思考如何拆解为可解决的小问题。同时,它也体现了 “平衡” 的重要性:划分的平衡性直接影响算法效率,这启示我们在设计分治算法时,需重点关注划分策略的合理性。此外,分治法与递归紧密结合,但递归并非唯一实现方式(可通过迭代优化栈开销),需根据实际场景选择合适的实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP2025总结

J组: 应该是最有机会 AK 的一次。 T1,T2 都是一眼题,用 30min 简单写完后看 T3

hello!

第一篇!第一篇博客园博客! 之前用Astro搭建了个人博客,但是没有评论区的反馈确实博客就像写学习笔记一样,中间出现了很多错误也没人说。。所以来博客园了! 希望这里能见证自己剩下两年半xcpc的学习时光o( ̄▽ ̄)ブ…

docker 交付方案AI设计备份

基于当前项目结构,Docker 交付和在线升级计划如下: Docker 交付与在线升级方案 一、总体架构设计 1.1 容器化策略应用镜像:为 FastAPI 主应用构建独立 Docker 镜像服务编排:使用 Docker Compose 编排所有服务数据持…

2025 CSP-S 游记

Day 0: 大巴上基本啥也没干,发会呆,看会b站就到了。 带了笔记本,晚上CS启动!打了两把小镇一把没赢。/ll 22:30算早睡吗。 Day 1: 上午6:14突然醒了,上了个厕所又睡下去了,7:30再次醒来,感觉睡得比去年好。 因为…

[题解]CSP-S 2025 T1~T3 题解

T1. P14361 [CSP-S 2025] 社团招新 / club Tag:贪心、排序。 因为要求每个社团不超过 \(\dfrac{n}{2}\) 个人,所以无论怎么分配,最多只会有一个社团超出限制。 因此,我们先让每个人选最满意的社团。若存在超出限制…

关于git关联github问题

本地GIT绑定GITHUB 配置本地GIT信息 #配置用户名 git config --global user.name "test"#配置邮箱 git config --global user.email abc@163.com生成本地密钥和公钥 生成ssh文件夹(生成ssh秘钥)(输入$ s…

AT ABC285E Work or Rest 题解

SolutionLink 有趣的 DP 题,难点在于从哪里开始入手以及优化(也许)。 显然 DP 可以方便地处理这个 \(\max\) 值的转移,但是从哪个位置开始 DP 呢?注意到周期呈现环状,也就是说一周的第 \(n\) 天和下一周的第 \(1…

代码复杂度的代价远比你想象得大

引言:复杂度的代价远比你想象得大 在 Java 后端系统演进过程中,代码复杂度是影响可维护性、稳定性和迭代效率的核心因素。然而,复杂度往往被忽视,直到一次“小改动”引发线上事故,才被重新审视。 本文以“复杂度战…

CSP2025 - S 年度总结大会报告

各大 oj 估分:洛谷:\(100+52+10+8=170\)。 小图灵:\(100+60+?+8=168+?\),当时他 \(T_3\) 数据还没有造。 梦熊:\(100+92+30+8=230\),感觉不准。自己估分:\(100+[48,70]+[0,40]+8=[156,218]\)。 第一:明确自己…

25CSP退役游记(11.1更新)

关于我在考虑要不要把S1的P话也加进来这件事 day—— -5 今天天气晴朗,不很像秋天,更不像济南今年的秋天。 考前焦虑期也是要休息的。它从一周之前来,从三四天之后来,这么算三个周能休七八天,比我的假期多多了。但…

第二章实践作业

第二章实践作业分治法找第 k 小的数:基础理解与思考 一、用分治法找第 k 小的数 找第 k 小的数,用分治法来解决其实思路还挺直观的。大概可以分成这几步: 先选一个 “基准数”,随便从数组里挑一个就行,比如选第一…

(补11月)代码大全阅读笔记2

第6-9章的架构设计内容,彻底解答了我长期以来的核心困惑:为何同样实现了基础功能的代码,有的在后续迭代中能轻松响应需求变化,有的却如同“牵一发而动全身”的乱麻,修改一个小功能就引发连锁bug。书中系统阐述的“…

java 基础语法一

java 基础语法一 一、基本概念 冯诺依曼结构,Java三大版本、编译型和解释型语言 1、五大组成部分:运算器、控制器、存储器、输入设备和输出设备;核心特点:采用二进制表示、存储程序原理、顺序执行指令 2、javaSE(…

VisualStudio 2022如何打开.slnx文件格式的解决方案

打开VisualStudio 2022,菜单中设置-选项-环境 > 预览功能 > 勾选最下方的“使用解决方案文件持久性模型”设置,再手动对.slnx文件进行关联设置即可。

(补11月)代码大全阅读笔记3

研读第23-25章关于测试与调试的内容后,我彻底摒弃了“开发负责写代码,测试负责找bug”的错误认知,建立起“开发者是质量第一责任人”的核心意识。书中一组数据让我尤为震撼:单元测试阶段发现并修复bug的成本,仅为…

CSP2025 - S 游记

Day -14 那天的模拟赛考得不错,拿了全校第二。 Day -13 太阳神开家长会骂了我们竞赛生。 心情不爽。 Day -11 晚上上厕所偶遇 xz,xz说我状态不错继续保持。 心情大好。 Day -7 集训,但是状态明显降低。 Day -5 没有…

CSP-S游记

CSP-S游记 首先读题,T1感觉直接贪心即可,T2应该不难,T3没想法,T4是计数我比较喜欢。 T1很快想出来代码也很好写20分钟过掉。 T2很容易想到 \(O(2^kn\log n)\) 的做法,但不确定能不能过就想优化把log去掉,想了一个…

小组作业1

小组作业1这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13471姓名 学…

C语言字符串及其函数

字符串及其函数c语言 没有字符串类型,所以大多用字符数组代替。 1. 字符串的输入输出 使用 scanf 和 printf 的通用输入输出。 #include <stdio.h> #include <stdlib.h>/* run this program using the co…

CPULOAD建模设计

背景: 1.中断周期的建模 在单片机中中断和任务是两类处理数据的主要形式,中断的形式主要分为周期和时间两类。比如,LIN中断是根据调度表的周期去响应的,滚轮这种则是根据外部事件响应的。 2.响应时间的建模 中断的…