算法学习
文章平均质量分 91
多加点辣也没关系
一个普通的程序猿
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构与算法总章
《数据结构与算法》系列文章系统性地介绍了数据结构与算法的核心知识,分为四个篇章:基础数据结构(线性表、链表、栈、队列等)、非线性结构(树、堆、图等)、算法设计(排序、查找、动态规划等)以及高级专题(字符串算法、位运算等)。内容由浅入深,涵盖从基础概念到高级应用的完整知识体系,适合不同层次的学习者系统掌握数据结构与算法知识,提升编程能力与算法思维。原创 2026-05-11 10:17:47 · 95 阅读 · 0 评论 -
数据结构与算法|第二十四章:算法思维总结与实战
本文总结了数据结构与算法中的十大核心策略,包括分治、贪心、动态规划、回溯、搜索、枚举、模拟、位运算、双指针和滑动窗口。每种策略都有其适用场景和解题框架,如分治的三步走、动态规划的四步法、回溯的剪枝优化等。文章还对比了不同策略的特点(如贪心与动态规划的区别),并列举了典型应用场景(如归并排序、背包问题、N皇后等)。这些策略不仅是算法解题的关键思路,也是大厂面试的高频考点,掌握它们能有效提升算法思维和实战能力。原创 2026-05-11 09:50:17 · 487 阅读 · 0 评论 -
数据结构与算法|第二十三章:高级数据结构
本文介绍了四种高级数据结构及其应用场景:并查集(解决动态连通性问题)、线段树(区间查询)、树状数组(前缀查询)和Trie(字符串前缀匹配)。重点讲解了并查集的实现原理,包括路径压缩和按秩合并两种优化策略,使其操作时间复杂度接近常数级。这些数据结构针对特定问题模式设计,在集合合并、区间聚合、前缀匹配等场景下具有高效性能,是算法设计和工程实践中的重要工具。原创 2026-05-11 09:37:15 · 86 阅读 · 0 评论 -
数据结构与算法|第二十二章:位运算技巧
本文介绍了位运算的核心技巧及其高效应用。位运算直接操作整数的二进制位,包括与、或、异或、取反、左移和右移六种基本操作,具有硬件原生支持、信息密度高和数学性质优美的特点。通过位运算可以快速实现判断奇偶、检测2的幂等操作,相比传统方法显著提升性能。文章详细解析了各种位运算的规则和应用场景,并阐述了补码表示负数的原理。位运算在算法和工程中应用广泛,是提升程序效率的重要工具。原创 2026-05-09 17:45:50 · 381 阅读 · 0 评论 -
数据结构与算法|第二十一章:字符串算法
本文介绍了字符串算法的核心概念与四大经典匹配算法。重点分析了暴力匹配、KMP算法、Boyer-Moore算法和Rabin-Karp算法的原理与实现,特别深入讲解了KMP算法的next数组构造过程。字符串匹配算法的核心在于利用已知信息避免重复比较,不同算法通过前缀函数、坏字符规则或哈希值等策略优化匹配效率。这些算法在文本搜索、数据压缩等领域有广泛应用,是计算机科学中处理字符串问题的基础工具。原创 2026-05-08 18:18:45 · 519 阅读 · 0 评论 -
数据结构与算法|第二十章:回溯算法
本文介绍了回溯算法的核心思想与解题框架。回溯算法通过深度优先搜索遍历解空间树,结合剪枝策略高效枚举所有可行解。文章详细阐述了回溯的三要素(路径、选择列表、结束条件)和通用代码框架,强调"做选择→递归→撤销选择"的核心步骤。针对排列、组合、子集三类经典问题,分别给出了对应的回溯模板:排列问题使用used数组标记已选元素;组合问题通过start参数避免重复;子集问题则记录所有中间路径。回溯算法特别适用于需要枚举所有解的排列组合、棋盘类问题,通过剪枝大幅提升搜索效率。原创 2026-05-08 17:27:59 · 697 阅读 · 0 评论 -
数据结构与算法|第十九章:动态规划(下)— 进阶篇
摘要: 本文深入探讨动态规划(DP)进阶问题,涵盖最长递增子序列(LIS)、最长公共子序列(LCS)和背包问题三大经典场景。LIS通过状态定义dp[i]表示以nums[i]结尾的最长递增子序列,时间复杂度为O(n²);LCS通过二维DP表解决字符串匹配问题,是编辑距离等问题的模板。背包问题部分重点对比0-1背包(逆序更新防止重复选择)和完全背包(正序更新允许无限选择)的状态转移差异,并提供空间优化方案。全文通过清晰的数学推导和代码示例,揭示了DP问题的核心——状态设计与转移方程的逻辑构建。原创 2026-05-08 16:18:18 · 362 阅读 · 0 评论 -
数据结构与算法|第十八章:动态规划(上)— 基础篇
本文介绍了动态规划(DP)的基础概念与解题方法。DP通过分解问题为子问题并存储结果,避免重复计算,将指数级复杂度降至多项式级。其核心思想包括最优子结构和重叠子问题,并通过斐波那契数列示例展示了记忆化搜索与递推两种实现方式。文章提出DP解题五步法:定义状态、推导转移方程、确定边界条件、计算顺序和空间优化,建议优先使用自底向上的递推方式以避免递归风险。DP是算法设计与面试中的高频考点,掌握其核心思想与解题框架对提升算法能力至关重要。原创 2026-05-08 14:47:57 · 341 阅读 · 0 评论 -
数据结构与算法|第十七章:贪心算法
《贪心算法:核心思想与经典应用》摘要 贪心算法是一种在每一步选择当前最优解的算法策略,通过局部最优决策期望达到全局最优。文章首先介绍了贪心算法的核心思想与三种数学证明方法(归纳法、交换论证法、拟阵理论),然后对比了贪心算法与动态规划的区别与适用场景。通过活动选择问题等经典案例,展示了贪心算法的实际应用。文章强调贪心算法虽然简单高效,但必须满足"贪心选择性质"和"最优子结构"才能保证正确性,否则可能陷入局部最优陷阱。最后提供了Java代码实现,演示如何用贪心策略解决活动原创 2026-05-08 13:58:23 · 547 阅读 · 0 评论 -
数据结构与算法|第十六章:二分查找与搜索
本文介绍了二分查找及其变体算法。二分查找通过每次排除一半候选区间,在有序数组中实现O(log n)的高效搜索。文章首先阐述了二分查找的前提条件和标准实现(闭区间写法),并分析了常见边界条件与陷阱。随后重点讲解了四种实用变体:查找第一个/最后一个等于目标值的元素,以及查找第一个大于等于/最后一个小于等于目标值的元素,通过调整搜索策略满足不同场景需求。这些变体在包含重复元素的数组中尤为实用,展现了二分查找的灵活性和强大功能。原创 2026-05-08 13:37:58 · 399 阅读 · 0 评论 -
数据结构与算法|第十五章:排序算法(下)— 非比较类排序
本文介绍了三种非比较类排序算法:计数排序、桶排序和基数排序,它们通过利用数据的特定分布特征,突破了比较排序O(n log n)的理论下限。计数排序适用于取值范围有限的数据,桶排序要求数据均匀分布,而基数排序则逐位进行稳定排序。这些算法以空间换时间,在特定条件下可达线性时间复杂度。文章还分析了JDK中排序算法的实现原理及海量数据处理策略,为非比较排序提供了深入理解和实践指导。原创 2026-05-08 11:02:03 · 566 阅读 · 0 评论 -
数据结构与算法|第十四章:排序算法(上)— 比较类排序
本文摘要: 本文系统介绍了比较类排序算法,重点分析了冒泡排序、选择排序和插入排序三种基础算法。文章首先定义了排序的基本概念和评价指标(时间复杂度、空间复杂度、稳定性等),然后详细讲解了每种算法的核心思想、实现代码及优化方案。冒泡排序通过相邻元素比较交换实现排序,时间复杂度O(n²);选择排序通过选择最小元素交换实现,同样O(n²)但交换次数少;插入排序则将元素插入已排序区的正确位置,在接近有序数据上效率较高。这三种算法都是原地排序,但稳定性各不相同。文章通过代码示例和分步图示直观展示了各算法的工作原理,为后原创 2026-05-08 10:36:19 · 591 阅读 · 0 评论 -
数据结构与算法|第十三章:递归与分治
本文系统讲解了递归与分治算法的核心原理和应用技巧。首先阐述了递归的三个必要条件(基准条件、递归推进、自身调用),通过阶乘和斐波那契数列示例演示递归执行过程与调用栈机制,指出递归树分析对复杂度评估的重要性。其次剖析了递归的常见陷阱(堆栈溢出、重复计算)及优化方案(迭代改写、记忆化、尾递归)。最后深入讲解分治法的"分解-解决-合并"范式,结合主定理分析分治算法的时间复杂度。全文通过代码示例和图示,帮助读者建立递归思维,掌握分治策略的应用场景与性能分析方法。原创 2026-05-07 23:16:46 · 350 阅读 · 0 评论 -
数据结构与算法|第十二章:图
本文摘要(150字): 第十二章介绍了图的基本概念与遍历算法。图由顶点集V和边集E组成,分为无向图、有向图、带权图等类型,包含度、连通性、路径等重要术语。图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS采用递归或栈实现,适合解决连通分量、环检测等问题;BFS使用队列,适合无权图最短路径等场景。两者时间复杂度均为O(V+E),但DFS空间复杂度取决于递归深度,BFS为O(V)。文章通过代码示例展示了两种算法的实现方式,并对比了它们的特性与应用场景。原创 2026-05-07 23:14:05 · 338 阅读 · 0 评论 -
数据结构与算法|第十一章:跳表
跳表(Skip List)是一种基于多层有序链表的随机化数据结构,通过构建稀疏的高层索引实现高效查找。其核心思想是"空间换时间",在原始链表上添加多级索引,使查找复杂度从O(n)降至O(log n)。跳表节点包含数据域和多层指针数组,查找时从最高层开始逐层下降。插入操作通过随机生成层数维持平衡,无需复杂调整。删除操作则在各层直接跨过目标节点。跳表相比平衡树实现更简单,性能接近,广泛应用于Redis等系统。原创 2026-05-07 22:20:40 · 333 阅读 · 0 评论 -
数据结构与算法|第十章:散列与哈希表
本文介绍了散列与哈希表的核心概念和应用。首先阐述了散列函数的设计原则(确定性、高效性、均匀性、雪崩效应),对比了非加密散列(如MurmurHash)和加密散列(如SHA-256)的特点。其次讲解了哈希表的基本原理,包括键值映射、负载因子和冲突处理。重点分析了两种冲突解决方法:开放寻址法(含线性/二次/双重哈希探测)和链地址法(拉链法)。文章还涉及Java HashMap的实现细节,强调散列技术在数据结构中的重要性,能够实现O(1)时间复杂度的查找操作。最后指出哈希表是工程实践中广泛应用的高效数据结构。原创 2026-05-07 18:23:34 · 411 阅读 · 0 评论 -
数据结构与算法|第九章:堆与优先队列
本文介绍了堆(Heap)这一重要数据结构及其应用。堆是一种特殊的完全二叉树,具有堆序性质,分为大顶堆和小顶堆两种类型。文章详细讲解了堆的核心操作,包括插入元素时的上浮(siftUp)和删除堆顶时的下沉(siftDown)操作,并给出了高效的Floyd建堆算法(O(n))。堆通过数组存储实现高效操作,适用于需要快速获取极值的场景,如任务调度、数据流处理等。文中还提供了大顶堆的完整代码实现,展示了堆的基本运算方法。原创 2026-05-07 18:14:48 · 336 阅读 · 0 评论 -
数据结构与算法|第八章:树-进阶篇
本文介绍了树结构的进阶应用,重点讲解二叉搜索树(BST)及其高效操作。BST通过中序遍历可得到有序序列,支持查找、插入和删除操作,时间复杂度在平衡状态下为O(log n)。查找通过比较键值逐步缩小范围;插入类似查找过程,在空位添加新节点;删除需处理三种情况,最复杂的是有两个子节点的情况,需用后继节点替代。文章还提供了BST的完整Java实现代码,包括节点定义和核心操作方法。这些高效操作是更高级树结构(如AVL树、红黑树)的基础。原创 2026-05-07 09:54:13 · 405 阅读 · 0 评论 -
数据结构与算法|第七章:树-基础篇
本文系统讲解树的基础:7.1树的概念与术语(根、叶子、深度、高度、度)及ADT定义;7.2二叉树特性与满/完全二叉树区别及五条性质;7.3顺序存储与链式存储;7.4四种遍历——前序/中序/后序的递归+迭代实现、层序BFS、Morris O(1)空间遍历;7.5经典实战——LeetCode 104最大深度、101对称、226翻转、105前中序构造。核心:树的递归本质使算法天然适配递归。原创 2026-05-06 17:35:22 · 212 阅读 · 0 评论 -
数据结构与算法|第六章:队列
摘要:队列数据结构详解 本文系统介绍了队列(Queue)这一先进先出(FIFO)的线性数据结构。主要内容包括: 基本概念:队列是限制性线性表,只能在队尾插入(enqueue),队头删除(dequeue),遵循FIFO原则 实现方式: 顺序队列:基于数组实现,使用front和rear指针标记队头和队尾 链式队列:基于链表实现,维护head和tail指针分别指向队首和队尾节点 核心操作:入队、出队、查看队头元素,时间复杂度均为O(1) 实际应用:操作系统任务调度、消息中间件缓冲池、图的广度优先搜索等场景 文章提原创 2026-05-06 11:57:10 · 367 阅读 · 0 评论 -
数据结构与算法|第五章:栈
本文介绍了栈(Stack)数据结构的基本概念与两种实现方式。栈是一种后进先出(LIFO)的线性结构,核心操作包括push(入栈)、pop(出栈)和peek(查看栈顶)。文章详细讲解了顺序栈(基于数组实现)和链式栈(基于链表实现)的具体代码实现,包括时间复杂度分析。顺序栈适合容量可预估的场景,访问高效;链式栈则无需考虑容量限制,但需要额外存储指针。栈在计算机科学中应用广泛,如编译器解析表达式、浏览器前进后退功能等。原创 2026-05-06 11:18:59 · 598 阅读 · 0 评论 -
数据结构与算法|第四章:数组与矩阵
《数据结构与算法:数组与矩阵》摘要 本文系统讲解了数组这一基础数据结构的核心特性和应用。首先剖析了数组的本质——连续内存空间带来的O(1)随机访问能力,通过内存寻址公式说明了其高效访问原理。随后详细分析了Java数组的三大特性:定长、协变和类型擦除限制。在操作层面,重点阐述了插入、删除、查找的实现及时间复杂度对比,揭示了数组在随机访问和修改操作上的性能差异。最后通过手写动态数组实例,展示了ArrayList自动扩容的核心机制。文章强调数组作为"连续基座"的基础地位,同时指出其在动态扩容方原创 2026-05-06 10:56:58 · 370 阅读 · 0 评论 -
数据结构与算法|第三章:链表算法实战
本文介绍了链表算法的实战应用,重点讲解了单链表节点的Java实现和反转链表的经典操作。首先定义了通用的链表节点类ListNode,包含构建链表和字符串转换的实用方法。随后详细解析了反转链表的迭代过程,通过prev/cur/next三指针的移动演示,展示了如何将链表1→2→3→4→5逐步反转为5→4→3→2→1。文章采用可视化表格逐步呈现反转步骤,强调每次操作都将当前节点的next指向前驱节点,直到完成整个链表的反转。该内容为后续更复杂的链表算法题奠定了基础。原创 2026-05-06 10:01:04 · 581 阅读 · 0 评论 -
数据结构与算法|第二章:线性结构
线性表(Linear List):是具有相同数据类型的n个元素的有序集合。a0a1aiai1an−1a0a1...aiai1...an−1表中的元素个数 n 称为表的长度,n=0 是称为空表当1in1 < i原创 2024-02-26 23:24:53 · 1234 阅读 · 0 评论 -
Java-布隆过滤器的实现
如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路,但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢 (O(n)O(logn)不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。于是乎,布隆过滤器便应运而生了。原创 2024-01-10 22:21:20 · 2348 阅读 · 0 评论 -
Java-红黑树的实现
数据结构可视化-红黑树因为红黑树中有变色左旋右旋等变化,不是很容易理解,如果能自己对红黑树进行操作,那么这些概念上的东西相对而言就好接受一点了。红黑树是一种自平衡二叉查找树,和AVL 树类似,都是在进行插入和删除时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。红黑树虽然复杂,但它的最坏情况运行时间仍非常好,并且在实践中效率很高,它可以在O(logn)实践内进行查找、插入和删除操作,其性能要优于AVL 树。(1)其节点要么是红色,要么是黑色(2)根节点是黑色的(3)每个叶子节点都是黑色的。原创 2023-04-12 00:14:45 · 1609 阅读 · 2 评论 -
Java-双向链表的实现
双向链表也称为双链表,是链表的一种,它的每个数据节点都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个节点开始,都可以很方便地访问它的前驱节点和后继节点。可以使用一个head和tail分别指向头部和尾部的节点每个节点由三部分组成:前一个节点的指针prev保存的元素data后一个节点的指针next双向链表的第一个节点的 pre 是 null双向链表的最后一个节点的 next 是 null双向链表在进行增加和删除元素的时候,只需要改变prev和next的指向即可完成相关的操作。原创 2023-04-03 01:18:23 · 1418 阅读 · 0 评论 -
算法题:求数组中连续和最大的值
求数组中连续和最大的值,例如数组:方式一:计算出所有可能的情况,留下最大值实现思路:将数组拆分出所有可能的子列,使用三层循环的方式去求每一个子列中连续和的值,第一层循环确定子列起始的位置【i】,第二层确定子列终止的位置【j】,第三层循环就是计算子列【i ~ j】的和,如果当前子列和大于之前的子列和,则更新最大值。这个算法的复杂度是 ,因为有三层嵌套的 for 循环,如果每一层循环都是从 0~N ,那么乘起来就是 N 的三次方方式二:方式一使用三层嵌套循环求每一个子列的和,其实第三个 for 循环可以去原创 2022-06-10 11:14:01 · 1857 阅读 · 0 评论 -
数据结构与算法|第一章:绪论
文章目录前言一、数据结构1. 什么是数据结构二、算法1. 什么是算法2. 什么是好的算法2.读入数据总结前言为什么要学习数据结构与算法?对于大部分的业务开发者来说,平常我们基本上都是利用现成已经封装好的接口,或者类库,加上一堆的业务逻辑来实现需求功能,很少会注意到数据结构与算法,比如说你用一个类库,你不懂得时间、空间复杂度的分析,写业务逻辑时什么时候用 AarryList 什么时候用 LinkedList,怎么让代码变得更加高效,为什么哪些很牛逼的框架能在高并发的情况下还能保持如此高的效率?学习数据原创 2022-03-09 00:14:33 · 832 阅读 · 0 评论
分享