在刷题的过程中,积累了丰富的经验与深刻的思考,以下是我的练题刷题体会。
一、筑牢数据结构与算法基础
在开启刷题前,十分有必要先去学习和掌握常用的数据结构和算法知识。否则面对题目会有种无从下手的感觉,常常会去使用暴力算法直接解题,也不懂如何进行优化,会写出屎山代码。需要去了解常用的数据结构和他们的特点优势,以及作用场合。了解常用排序、查找等算法,以及一些常用的运算技巧,比如说异或、二进制左右移等。至少需要做到别人解题的代码能够看懂,能够明白思路和好的地方在哪。
一开始我也是一上来就直接刷题,对大部分题目都是有无从下手,然后去针对题目去复习数据结构和算法,然后按类别刷题以加深理解和解题。
二、刷题经历
刷题过程是一个不断深化对数据结构和算法理解,并将其应用于实际问题解决的过程。当面对一道编程题目时,首先要做的是透彻理解题意,分析题目所涉及的数据特点和操作要求,进而思考可以运用哪些数据结构和算法来解决。
由简单到难题是一个循序渐进的过程 在刷题过程中,对时间复杂度和空间复杂度的分析是不可或缺的。时间复杂度衡量算法执行所需的时间随着数据规模增长的变化趋势,空间复杂度则衡量算法执行过程中所需的额外存储空间。在某些情况下,可能需要在时间和空间复杂度之间进行权衡。给我的感触是大多数题目其实是能够在线性时间复杂度内进行解决,所以一上来就去思考怎么能在线性时间复杂度内进行解决这道题目。
然后是一些解题和优化的思想:什么双指针啊、递归调用、动态规划思想、二分查找优化、Map、Set数据结构优化这些是刷题依赖最常用的思想,其中递归和动态规划是一个比较难又很重要的内容。
随着刷题数量的增加,不仅要追求能够解决问题,更要注重对代码的优化。这包括优化算法的时间复杂度、减少不必要的空间占用、提高代码的可读性和可维护性等。通过不断地优化,逐渐培养出高效编程的思维习惯和能力。
三、常用数据结构和算法及其应用场景总结
-
数据结构:
- 数组:适用于数据量较小且需要频繁随机访问的场景,如存储一组固定大小的数据,如一周七天的名称。
- 链表:常用于需要频繁进行插入和删除操作的数据集合,如实现一个动态的任务列表,方便添加和移除任务。
- 栈:在函数调用、表达式求值、括号匹配等场景中有广泛应用,例如编译器在解析表达式时使用栈来处理运算符的优先级。
- 队列:常用于任务调度、广度优先搜索、消息队列等场景,比如操作系统中的进程调度,按照先来先服务的原则处理进程。
- 树:二叉树常用于搜索、排序和数据压缩等领域,如二叉搜索树可快速查找、插入和删除数据;平衡二叉树如 AVL 树和红黑树则在保证树的平衡以维持高效操作方面有重要应用;多叉树如 B 树常用于数据库索引,以减少磁盘 I/O 操作。
- 图:在社交网络分析、路由算法、推荐系统等方面有广泛应用。例如,社交网络中用户之间的关系可以用图表示,通过图算法分析用户之间的社交关系和互动模式。
-
算法:
-
排序算法:
- 冒泡排序:简单易懂,适用于小规模数据排序或作为教学示例。
- 插入排序:对于部分有序的数据表现较好,在数据量较小时效率较高,常用于一些简单的排序场景,如对扑克牌进行排序。
- 选择排序:简单直观,无论数据初始状态如何,时间复杂度较为稳定,适用于对小规模数据且对稳定性要求不高的排序任务。
- 快速排序:高效的通用排序算法,平均时间复杂度低,广泛应用于大规模数据排序,如对数据库中的大量记录进行排序。
- 归并排序:稳定的排序算法,时间复杂度稳定,适用于对稳定性要求较高且数据规模较大的排序场景,如在多线程环境下对数据进行排序时,归并排序的分治思想便于并行处理。
-
搜索算法:
- 线性搜索:适用于未排序数据或数据量较小的情况,逐个元素进行比较,如在一个小型数组中查找特定元素。
- 二分搜索:要求数据已排好序,具有极高的查找效率,常用于有序数组、数据库索引查找等场景,如在一本已按字母顺序排序的字典中查找单词。
-
动态规划算法:适用于解决具有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列问题等。在资源分配、路径规划等领域有广泛应用,例如在物流配送中,根据不同货物的重量、体积和价值,利用动态规划算法确定最优的装载方案。
-
贪心算法:在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最优。适用于一些具有局部最优解能导向全局最优解性质的问题,如活动安排问题、哈夫曼编码等。在数据压缩、任务调度等方面有应用,例如在视频编码中,通过贪心算法选择最优的编码方式以减少数据量。
-
四、AI 刷题解题的帮助
随着人工智能技术的发展,AI 在刷题解题过程中发挥着越来越重要的作用。
AI 可以快速分析题目要求,根据其庞大的知识储备和算法模型,提供多种解题思路和代码示例。当我在解决一道复杂的算法题时,AI 能够迅速识别出题目类型,并给出使用特定数据结构和算法的建议。
给我的感觉就是至少AI在数据结构这方面的还是挺正确的,大体的框架上错误挺少。
在代码编写过程中,AI 还可以对代码进行实时检查和优化建议。
当然过度依赖 AI 可能会导致自身思考能力和创新能力的削弱。在刷题过程中,我们应该将 AI 作为一种辅助工具,在借鉴其思路和代码的同时,深入理解背后的原理和逻辑,结合自己的思考进行代码的编写和优化,这样才能真正提升自己的编程水平。