数据结构与算法
文章平均质量分 94
Lion Long
一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
展开
-
深入理解C++中的堆:从基本概念到实际应用
堆是一种具有树形结构的数据结构,它遵循堆属性,即:每个节点必须小于其每个子节点。“堆”这个名字可能来自于这样一个事实:如果堆放一堆东西并希望它能保持平衡,人类更愿意把大的东西放在底部,小的东西放在顶部:请注意,这与包含动态分配对象的内存区域中的堆完全无关(与栈相对,栈也是一种数据结构的名称)。堆的一个最重要的特性是,其最小元素位于其根部,易于访问。在堆中,每个节点理论上可以有任意数量的子节点。但在STL中,堆的节点有两个子节点,因此在本文中将用堆来指代二叉堆。原创 2024-05-13 09:00:00 · 1741 阅读 · 1 评论 -
迷人的数据结构:揭秘数组和链表的不同
数据结构是组织和存储数据的方式,直接影响着程序性能、内存利用和资源管理等关键方面。数据结构提供了各种方法来组织和存储数据,包括数组、链表、栈、队列、树和图等。许多算法的设计和优化都与数据结构密不可分。合适的数据结构能够更有效地利用内存资源,减少资源浪费并提高程序性能。在软件工程和系统设计中,数据结构是构建复杂系统和解决实际问题的基础。数组和链表是两种常见的数据结构,本文旨在深入探讨数组和链表的区别,揭秘它们的异同点。原创 2024-01-27 21:16:11 · 834 阅读 · 2 评论 -
数据结构 | 为何红黑树在B/B+树之上仍然占据重要地位?
尽管红黑树可能导致树的高度相对较高,但其存储效率、数据局部性、平衡性能和范围查询效率等特点在内存中或需要更好的数据局部性时,红黑树更好。相比B树或B+树,红黑树的节点结构相对简单,每个节点只需额外存储一个颜色位。红黑树在插入和删除操作时能够通过旋转和重新着色来保持平衡性质。相比之下,B树或B+树的平衡调整操作(如节点的分裂和合并)可能更复杂。原创 2023-09-15 23:06:59 · 489 阅读 · 0 评论 -
探索树堆Treap和红黑树的优势和劣势
树堆(Treap)是一种组合了二叉堆和二叉搜索树特性的随机化平衡二叉树。它的基本特性和原理:键值特性:树堆的每个节点包含一个键值和一个随机的优先级值。键值用于节点的比较和排序,优先级值用于平衡树的结构。二叉搜索树性质:树堆维护了二叉搜索树的性质,即对于任意节点,它的左子树中的所有节点的键值小于该节点的键值,右子树中的所有节点的键值大于该节点的键值。堆性质:树堆也维护了堆的性质,即对于任意节点,它的优先级值大于其子节点的优先级值。随机化平衡:树堆通过随机生成节点的优先级值来实现平衡。原创 2023-09-02 17:21:56 · 363 阅读 · 2 评论 -
漫谈红黑树:红黑树的诞生与演变
追溯起来的话,红黑树的启蒙最早应该是由计算机科学家 Rudolf Bayer 和 Volker Weber 在 1972 年的一篇论文《Maintaining a Search Tree Under Dynamic Insertions and Deletions》引出的;他们的论文主要关注在外部存储器上维护平衡的二叉搜索树,用于数据库的索引结构。但是,真正的红黑树数据结构应该是Leo J. Guibas和Robert Sedgewick在1978年发布的一篇论文。原创 2023-08-20 00:00:02 · 708 阅读 · 23 评论 -
解开谜团:为什么红黑树胜过AVL树?
在文章中,着重比较红黑树和AVL树在插入、删除、查找、遍历以及内存占用等方面的性能,指出红黑树在某些应用场景下优于AVL树。同时,还将探讨两种树的优化策略和实际应用案例。原创 2023-08-13 11:57:10 · 944 阅读 · 3 评论 -
【算法题】动态规划中级阶段之买卖股票的最佳时机、三角形最小路径和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-30 22:57:29 · 323 阅读 · 0 评论 -
【算法题】动态规划中级阶段之不同的二叉搜索树、交错字符串
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 22:24:14 · 368 阅读 · 0 评论 -
【算法题】动态规划中级阶段之不同路径、最小路径和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:51:30 · 867 阅读 · 0 评论 -
【算法题】动态规划中级阶段之跳跃游戏、最大子数组和、解码方法
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:36:12 · 611 阅读 · 0 评论 -
【算法题】动态规划中级阶段之最长回文子串、括号生成、跳跃游戏
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:15:07 · 1309 阅读 · 0 评论 -
【算法题】动态规划基础阶段之 前 n 个数字二进制中 1 的个数、爬楼梯的最少成本、翻转数位
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 16:02:12 · 320 阅读 · 0 评论 -
【算法题】动态规划基础阶段之斐波那契数列、青蛙跳台阶问题、连续子数组的最大和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 13:18:46 · 492 阅读 · 0 评论 -
【算法题】动态规划基础阶段之获取生成数组中的最大值、传递信息、下载插件
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 12:43:56 · 248 阅读 · 0 评论 -
【算法题】动态规划基础阶段之斐波那契数、使用最小花费爬、除数博弈、第 N 个泰波那契数
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 11:32:01 · 312 阅读 · 0 评论 -
【算法题】动态规划基础阶段之买卖股票的最佳时机、比特位计数、判断子序列
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 09:40:17 · 734 阅读 · 0 评论 -
【算法题】动态规划基础阶段之 爬楼梯 和 杨辉三角
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-27 23:01:42 · 485 阅读 · 0 评论 -
【算法题】合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布
合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布原创 2023-06-26 11:33:15 · 199 阅读 · 0 评论 -
【算法题】剪绳子、计算二进制中1的个数、数值的整数次方
剪绳子、计算二进制中1的个数、数值的整数次方原创 2023-06-26 10:11:17 · 412 阅读 · 0 评论 -
【算法题】算法之动态规划系列(基础篇)
动态规划常常用于求解多阶段决策问题。一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。原创 2023-06-26 09:43:46 · 613 阅读 · 1 评论 -
【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径
【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径原创 2023-06-26 09:29:41 · 525 阅读 · 0 评论 -
【算法题】链表系列之从尾到头打印链表、重建二叉树、用两个栈实现队列
从尾到头打印链表、重建二叉树、用两个栈实现队列原创 2023-06-25 22:34:25 · 335 阅读 · 1 评论 -
【算法题】统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字
统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字原创 2023-06-25 22:01:16 · 676 阅读 · 0 评论 -
【算法题】数组系列(找出数组中重复的数字、二维数组中的查找)
一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。原创 2023-06-25 21:29:22 · 2132 阅读 · 0 评论 -
递归算法在编程中的重要应用
递归算法的核心思想就是函数自己调用自己。递归算法包括两个部分:基本情况和递归情况。基本情况是指一些简单、不需要继续拆分的子问题,而递归情况则是通过反复调用自身来处理较为复杂的子问题。终止条件:每个递归过程都应该有一个能够使得程序停止执行并返回结果的结束条件。逐层拆分:在每次递归中,问题规模应该比上一次缩小,并且与上一次规模相同但数据不同,以便于最终到达基本情况。传参调用:在每次调用时将参数传入函数内部,并对参数进行修改或者处理。合并结果:当遇到最小子问题时,应该直接返回结果;原创 2023-06-08 20:49:10 · 938 阅读 · 0 评论 -
贪心算法之最优装载问题
海盗截获了一艘装满各种各样古董的货船,每件古董都价值连城,一旦打碎就失去了它的价值,海盗船载重量为$C$,每件古董的重量为$w_i$,海盗们如何尽可能多数量的宝贝装上海盗船?原创 2022-10-28 14:37:08 · 1519 阅读 · 0 评论 -
算法之神奇的斐波那契数列(Fibonacci sequence)
1. 斐波那契数列起源于兔子数列,数学源于生活。斐波那契数列与黄金分割数有着千丝万缕的关系。2. 算法难学的一个原因是算法本身具有一定的复杂性,需要持之以恒的学习和拓展自己的思维原创 2022-10-22 12:50:20 · 598 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度计算
1. 将程序执行次数作为时间复杂度衡量标准。2. 时间复杂度通常用渐进上界符号$O(f(n))$表示。3. 衡量算法的好坏通常考察算法的最坏情况。4. 空间复杂度只计算辅助空间。5. 递归算法的空间复杂度需要计算递归使用的栈空间。6. 计算算法时要尽量避免爆炸级增量复杂度。原创 2022-10-18 10:19:12 · 594 阅读 · 0 评论