- 博客(22)
- 收藏
- 关注
原创 快速排序算法的C++和C语言对比
两种语言实现的优势比较1. C++实现优势:使用vector容器,更安全且方便内置swap函数,代码更简洁支持函数重载,提供更友好的接口模板编程可轻松扩展为泛型实现2. C语言实现优势:更底层,运行效率可能更高不依赖标准库以外的功能,可移植性更强更适合嵌入式系统等资源受限环境更直观地展示算法本质分治思想将大问题分解为小问题,各个击破,这种思想在解决复杂问题时非常有效。快速排序的平均性能很好,但最坏情况性能较差,这提醒我们在设计系统时要考虑平均情况和最坏情况的平衡。
2025-05-24 22:16:05
262
原创 堆排序算法的C++实现
堆排序是原地排序算法,只需要常数级的额外空间。而相比快速排序和归并排序,堆排序在大数据量时表现稳定。堆排序展示了如何利用特定的数据结构(堆)来高效解决排序问题,提醒我们在解决问题时要考虑合适的数据结构。不同于快速排序和归并排序的显式分治,堆排序通过维护堆性质隐式地实现了问题的分解和解决,这也是分治思想的另一种体现。堆只需要满足父节点与子节点的大小关系,不需要完全有序,这种"部分有序"的思想在很多算法中都有体现。
2025-05-22 13:38:20
170
原创 希尔排序的C++实现
希尔排序展示了如何通过将大问题分解为小问题来解决复杂问题,这种分而治之的思想在算法设计中非常普遍。希尔排序的效率很大程度上取决于增量序列的选择,这提醒我们在解决问题时要寻找合适的"步长"或"节奏"。希尔排序是对简单插入排序的改进,说明即使是基本算法,通过巧妙的改进也能显著提升性能。希尔排序通过多轮逐渐缩小的排序,最终达到整体有序,这种渐进优化的思维方式在解决复杂问题时很有价值。希尔排序的存在提醒我们,在计算机科学和工程实践中,往往需要在理论完美和实际效率之间找到平衡点。
2025-05-20 22:40:32
307
原创 Kruskal算法的C++实现
Kruskal算法的贪心选择策略每次都选最小边,以此保证全局最优,通过局部最优(每次选最小边)达到全局最优,提醒我们某些问题可以通过分步最优解构造整体最优解。同时,该算法由于按边处理,在边数较少的时候,即稀疏图,比Prim算法更高效。Kruskal算法依赖并查集来维护连通性,体现了数据结构对算法效率的关键影响。而且,Kruskal适合稀疏图,而Prim适合稠密图,提醒我们没有万能算法,需根据问题特点选择策略。
2025-05-13 09:34:35
288
原创 Dijkstra算法的C++实现
Dijkstra算法采用了贪心的思想,每次选择当前最优的局部解,最终能够获得全局最优解。这提醒我们在某些问题中,局部最优的累积确实可以导向全局最优。同时该算法通过逐步扩展已知最短路径的集合,展示了复杂问题可以分解为一系列简单步骤来解决的思路。除此之外,Dijkstra算法还使用优先队列处理节点,这体现出了"重要的事情优先处理"的管理哲学,这种思维方式可以应用于许多生活和工作场景。但Dijkstra算法仅适用于非负权图,这提醒我们任何方法都有其适用范围和限制条件,理解这些边界至关重要。
2025-05-10 20:11:15
327
原创 Floyd算法的C++实现
Floyd的算法实现非常简洁,核心代码只有三重循环,可以一次性计算出所有顶点对之间的最短路径,还可以处理负权边。同时,该算法通过中间顶点k的逐步考虑,展现了分阶段解决问题的智慧。这提醒我们在解决复杂问题时,可以尝试将其分解为多个阶段或层次。与Dijkstra等单源最短路径算法不同,Floyd算法直接解决全局问题。这提醒我们有时直接解决更一般的问题可能比多次解决特定问题更高效。虽然Floyd算法时间复杂度为O(n³),但在适当规模的问题上,其简洁性和全面性使得它依然很有价值。
2025-05-08 15:14:11
338
原创 Prim算法的实现与应用
Prim算法采用的贪心策略表明,在某些问题中,通过每一步做出局部最优选择,最终能够达到全局最优解。这提醒我们在解决复杂问题时,可以尝试将其分解为一系列局部决策,即局部最优可以导致全局最优。该算法从单个顶点开始,逐步扩展生成树,这种"从小到大"、"从简单到复杂"的构建方式在许多领域都有应用,如软件开发、系统设计等。同时Prim算法还使用优先队列总是处理当前最优的选择,这提醒我们在生活和工作中也需要明确优先级,先处理最重要或最有利的事项。
2025-05-06 10:53:16
166
原创 C++实现图的广度优先搜索
BFS的逐层扩展方式提醒我们,复杂问题可以分解为多个层次,按顺序逐步解决。同时,BFS天然适合寻找最短路径的特性也告诉我们,在解决问题时,有时最简单直接的方法反而是最优解。除此之外,该种搜索方式中队列的使用展示了先进先出(FIFO)数据结构在实际问题中的强大应用。BFS的存在和应用不仅是一种算法工具,也是一种思维方式——它教会我们如何系统地探索问题的根源,如何公平地对待所有可能性,以及如何高效地寻找最优解。这种思维方式若是可以迁移到生活和工作中,那么我们遇到的许多问题都将迎刃而解。
2025-05-03 19:32:06
265
原创 C++中<stdexcept>头文件的应用
std::length_error:超出容器最大允许长度(如 `std::vector` 扩容失败)。- std::out_of_range:下标越界(如 `vector.at(100)` 访问越界)。- std::overflow_error:算术上溢(如 `INT_MAX + 1`)。- std::underflow_error:算术下溢(如浮点数接近零时的精度丢失)。- std::range_error:计算结果超出有效范围(如浮点数溢出)。(1) 逻辑错误(std::logic_error)
2025-05-01 23:51:32
177
原创 图算法——深度优先搜索的实现
深度优先搜索不仅仅是一种算法,更是一种独特的思维方式。DFS提醒我们在解决问题时要专注一个方向深入探索,而不是浅尝辄止。这种"深度优先"的思维方式在学习和研究中同样适用。当一条路走不通时,DFS会回溯到上一个分叉点。这提醒我们在生活中遇到困难时,可以回到上一个决策点重新选择,而不是一味坚持错误的方向。DFS确保不遗漏任何可能性,这种系统性的思维方式在解决复杂问题时尤为重要。DFS通常占用较少内存但可能花费更多时间,这体现了计算机科学中常见的时空权衡思想。
2025-04-29 22:28:20
310
原创 C++中的<vector>
虽然上述两种代码所实现的结果是一样的,但是vector仍然具备以下其他优势:1. 自动内存管理:vector自动处理内存分配和释放2. 安全访问:提供带边界检查的at()方法3. 内置功能:自动扩容、size查询等内置方法4. 异常安全:内存分配失败时会抛出异常5. 代码简洁:减少了约70%的代码量<vector>头文件展现了强大的抽象能力,它将复杂的内存管理细节封装起来,这提醒我们在实际问题的解决中应该将复杂实现细节隐藏起来,可以提供简单一致的接口,并且。
2025-04-26 11:02:22
318
原创 C++类与对象的实际应用:构建学生信息管理系统
我们要实现的学生信息管理系统具备以下基本功能:1. 存储学生的基本信息,如学号、姓名、年龄、成绩。2. 能够显示学生的详细信息。3. 提供修改学生成绩的功能。通过这个学生信息管理系统的简单示例,可以深入了解C++中类与对象的实际应用。类和对象的使用使得代码结构更加清晰,数据和操作得到了良好的封装,提高了代码的可维护性和可扩展性。将数据成员和成员函数封装在一起,体现了其中的“封装思想从具体的学生个体中抽象出共同的特征和行为,形成 Student 类,反映出“抽象思想。
2025-04-24 12:36:45
450
原创 归并排序算法的实现与思考
归并排序算法完美体现了"分而治之"的算法思想,将大问题分解为小问题,解决小问题后再合并结果,而这种思想可以应用于许多复杂问题的解决中,如大规模数据处理、分布式计算等。这其中也包含了递归的运用,归并排序算法通过递归自然地实现了问题的分解,递归思维帮助我们简化复杂问题的处理,关注当前层次的问题而暂时忽略细节。归并排序是稳定的排序算法,且时间复杂度稳定在O(nlogn),这告诉我们有时候牺牲一些空间复杂度(O(n))可以换来更好的时间性能和稳定性。
2025-04-22 21:53:21
213
原创 快速排序算法
快速排序算法的优越性在于时间复杂度平均情况下为O(n log n)空间复杂度平均情况下为O(log n)。快速排序算法是一种高效并且实用的排序算法,这种算法的核心思想是"分而治之先通过选择一个基准元素并将数组分为两部分,一部分小于基准,一部分大于基准,然后使用递归对这两部分进行排序。在实际应用中,快速排序通常是最快的通用排序算法,它的实现相对简单且高效,并且因为该算法属于原地排序算法,所以不需要额外的存储空间。
2025-04-19 23:06:07
332
原创 最长对称子串
解决题目时要考虑到回文串的本质:回文串是从中间向两边对称的字符串,可以分为奇数长度和偶数长度两种情况,因此在编写代码时要进行双重检查,即对每个位置同时检查奇数长度和偶数长度的回文可能性。而中心扩展法的巧妙之处体现在:通过枚举所有可能的中心点(字符或字符间位置),然后向两边扩展检查对称性,这种方法既直观又高效,时间复杂度仅仅只有O(n²)。同时也提示我们要学会将复杂问题(找最长回文)分解为多个简单步骤(枚举中心、扩展检查),化繁为简可以更好地帮助我们解决实际中面临的问题。
2025-04-17 14:59:20
683
原创 删除重复字符
1.使用string类和范围for循环2.利用string的find方法实现去重3.代码简洁,核心代码大概20行左右两种语言展现出了两种不同的思维方式:C++通过string类将字符序列抽象为一个整体对象,使用者可以更专注于整体题目的解题逻辑而非存储方面的细节。而C则需要使用者明确去定义和管理数据在内存中的存储方式,要自己规划内存空间,要亲自操作每个内存的位置,这种差异反映了两种语言截然不同的设计思想。
2025-04-15 23:37:51
236
原创 二分法求多项式单根
在实现二分法求多项式单根的过程中,采用栈结构模拟递归过程这一方法虽然在实际应用中可能不如直接循环高效,但却有着独特的价值。从算法的角度,这种实现方式巧妙地利用了栈的"后进先出"特性来模拟递归调用的过程。每次将待处理的子区间压入栈中,相当于递归调用中对新参数的处理;而从栈中取出区间则对应着递归返回的过程。这种对应关系让我更清晰地理解了递归在计算机中的实际执行机制,认识到递归本质上就是通过系统栈来实现的函数调用。同时,这种方法展示了如何用基本数据结构来实现复杂算法,体现了计算机科学中"一切皆可分解"的思想。
2025-04-12 15:27:26
800
原创 约瑟夫问题:猴子选大王——题解与总结
队列模拟的优势在于它完全模拟题目描述的实际过程,容易理解和验证,同时其不依赖特定的数学公式,适合不熟悉约瑟夫问题的开发者。但是这种方法的劣势在于空间复杂度高:需要O(N)的额外空间存储所有猴子,当N非常大时(如超过百万),可能因内存限制而无法使用数学递推公式的优势在于它的空间效率极高:只需要O(1)的额外空间,仅使用几个变量,可以轻松处理N非常大的情况(如N=1e9),也不需要模拟过程,直接通过计算得到结果。而它的劣势在于理解难度高,需要理解约瑟夫问题的数学推导,不易直观把握,
2025-04-10 20:34:11
552
原创 求链式线性表的倒数第K项——个人题解与总结
在解决此类问题时,应该注意对于K大于链表长度或者输入为空的边界情况的处理。利用队列数据结构的特性,只需要维护一个大小为K的队列,这种方法提醒我们要突破“必须要存储所有数据”的思维定式,能够想到若要确定倒数第K项元素,只需要知道最后K个元素即可。而队列的FIFO特性完美匹配了这个题目的需求。每当新元素加入时,如果A队列已满(size>K),就自动淘汰最早的元素,这种机制确保了A队列始终包含最新的也就是最后的K个元素。这种思维方式教会我们:有时候不需要掌握全部信息也能解决问题。
2025-04-07 16:37:26
389
原创 数据结构——银行业务队列简单模拟的题解与总结
这道题目要求实现一个银行客户服务的简单的优先级调度系统,其核心思想便是根据客户编号的奇偶性来分配不同的服务优先级。这种设计可以应用在现实场景VIP客户(奇数)比普通客户(偶数)享有更优先服务的功能。除去在银行业务方面的应用,这种设计还可以用于在游戏中的AI行为的优先级管理等方面。在功能实现代码中,运用count变量来处理输出中的空格问题,避免末尾出现多余空格,也保证输出格式的整齐与美观。
2025-04-05 21:56:34
315
原创 数据结构——二叉树的个人学习总结
1.树中结点数等于所有结点的度数+12.度为 m 的树第 i 层至多有m^(i-1)个结点3.高度为 h 的m叉树至多有个结点二、二叉树1、几种不同的二叉树。
2025-04-03 23:10:29
722
原创 有关C++的学习
C++极高的运行效率可以满足机器人需要实时响应和处理的需求,同时还提供了对内存的直接控制,允许开发者进行低级别的内存操作,C++可以直接访问硬件,这允许开发者编写低级别的驱动程序,丰富的库支持也有助于实现复杂的机器人应用。C++接近硬件底层,可以精细控制硬件资源,程序运行的效率高,同时它也是一种面向对象的编程语言,有利于组织和管理大型复杂的软件系统,而在标准模板库中的各种数据结构和算法也可以减少开发的时间与工作量。C++中cin的作用与C语言中scanf的作用相同,与cout的区别在于cin使用的是“
2024-12-13 11:40:38
780
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人