
06数据结构与算法
文章平均质量分 86
数据结构与算法专栏
CodingW丨编程之路
打造一个懂技术+懂业务+懂管理+略懂英语的社区
→ 高级后端架构师
能够独立负责项目0~1展开到落地
归纳为一句话
目标就是 技术 + 业务 + 管理 + 英语 -> 实现自我价值 -> 带领团队能够开展0~1项目到落地
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
01绪论 + 递归+分治+搜索+回溯+原码反码补码+进制+位运算+位图(D1_基础理论学习)
字符类型:char布尔类型:boolean数值类型:byte、short、int、long、float、double。如果系统自定义的数据类型不够,可以自定义数据类型。例如:Person、Animal、. . .算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。算法代表着用系统的方法描述解决问题的策略机制。原创 2024-10-05 20:01:36 · 1090 阅读 · 0 评论 -
01绪论 + 递归+分治+搜索+回溯+原码反码补码+进制+位运算+位图(D2_刷题练习)
例如:第一次选择1,接着可以在1前面和后面插入2,则变为 1,2 和 2,1;只能是[2,2,3]的全排列接在1后面,对于2开头的分支达不到,因此也需要回溯:将临时数组刚刚加入的数字pop。一个皇后的行号与列号,则相当于接下来在n−1n-1n−1行中查找n−1n-1n−1个皇后,这就是一个子问。例如:1开头的有,[1,2,3],接着3撤销,2撤销,然后选择3,再选择2,就有了[1,3,2]。如果是线型递归,子问题直接回到父问题不需要回溯,但是如果是树型递归,父问题有很多分支,我需要从子问。原创 2025-01-26 22:28:25 · 1341 阅读 · 0 评论 -
02数组+字符串+滑动窗口+前缀和与差分+双指针(D2_字符串(D1_基础学习))
进位制其实是一种记数的方式,所以也称为进位记数法/位值计数法,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数(英文:radix)或底数,基数为n,即可称n进位制,简称n进制。例如平常生活中我们经常用到的十进制,就是使用10个阿拉伯数字0-9进行记数,所以它的基数就是10,称为十进制。在计算机的世界里,计算机语言就是二进制,计算机能直接识别二进制数据,其它数据都不能直接识别。对于任何一个数,我们可以用不同的进位制来表示,他们是等价的,只是表示形式不同而已。原创 2024-10-05 20:04:17 · 1519 阅读 · 0 评论 -
02数组+字符串+滑动窗口+前缀和与差分+双指针(D2_字符串(D2_刷题练习))
有符号整数,就是int,因为有正负之分,所以16位的第一位表示正负,0为正,1为负所以能表示的范围是-32768~+32767(-2e15~2e15-1)而无符号整数,就是定义为unsigned int,因为第一位不用代表正负了,没有符号,全是正的啊,所以16位全为有效位,所以范围是0~65535(0~2e16-1)原创 2025-01-27 15:56:39 · 1154 阅读 · 0 评论 -
02数组+字符串+滑动窗口+前缀和与差分+双指针(D4_前缀和与差分)
前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式0.输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,5 32 1 3 6 41 21 32 4123453610这是一道很简单的题,只用依次将他们循环遍历后加起来即可,但若数据量很大呢?原创 2025-01-28 00:33:18 · 1088 阅读 · 0 评论 -
02数组+字符串+滑动窗口+前缀和与差分+双指针(D5_双指针)
双指针是一种应用很广泛且基础的算法,严格来说双指针不是算法更像是一种思想。双指针中的“指针” 不仅仅是大家所熟知的C/C++里面的地址指针,还是索引、游标。原创 2025-01-28 00:36:03 · 345 阅读 · 0 评论 -
03链表+栈+队列(D1_链表(D1_基础学习))
链表是一种用于存储数据集合的数据结构。相邻元素之间通过指针连接最后一个元素的后继指针值为 NULL在程序执行过程中,链表的长度可以增加或缩小链表的空间能够按需分配(直到系统内存耗尽)没有内存空间的浪费(但是链表中的指针需要一些额外的内存开销)原创 2025-01-29 02:35:23 · 571 阅读 · 0 评论 -
03链表+栈+队列(D1_链表(D2_刷题练习))
int n = 0;//遍历链表,统计链表长度while(p!p = p.next;//长度过小,返回空链表if(n < k)p = pHead;//遍历n-k次i < n - k;return p;原创 2024-10-08 23:21:37 · 1261 阅读 · 0 评论 -
03链表+栈+队列(D2_栈)
栈(stack)是一个有序线性表,只能在表的一端(称为栈顶,top)执行插人和删除操作,后插入的元素将是第一个被删除。所以,栈也称为后进先出(LastInFirstOut,LIFO)或先进后出(First In LastOut,FILO)线性表。一个称为入栈(push),表示在栈中插入一个元素;另一个称为出栈(pop),表示从栈中删除一个元素。试图对一个空栈执行出栈操作称为下溢(underflow);试图对一个满栈执行人栈操作称为溢出(overflow)。通常,溢出和下溢均认为是异常。原创 2025-01-29 02:51:22 · 662 阅读 · 0 评论 -
03链表+栈+队列(D3_队列)
队列是一种只能在一端插入(队尾),在另一端删除(队首)的有序线性表,队列中第一个插人的元素也是第一个被删除的元素。所以,队列是一种先进先出(FIFO,First In First Out)或后进后出(LILO,Last In Last Out)线性表。与栈类似,两个改变队列的操作各有专用名称。在队列中插入一个元素,称为入队(EnQueue)从队列中删除一个元素,称为出队(DeQueue)试图对一个空队列执行出队操作称为下溢(underflow),原创 2025-01-29 02:52:40 · 281 阅读 · 0 评论 -
03链表+栈+队列(D4_综合刷题)
可以将 “未形成窗口” 和 “形成窗口后” 两个阶段拆分到两个循环里实现。一个栈的入栈序列是a,b,c,d,e则出栈的不可能的输出序列是:C。代码虽变长,但减少了冗余的判断操作。原创 2025-01-29 02:55:23 · 1544 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D1_基本介绍))
树是一种类似于链表的数据结构,不过链表的结点是以线性方式简单地指向其后继结点,而树的一个结点可以指向许多个结点。树是一种典型的非线性结构。树结构是表达具有层次特性的图结构的一种方法。对于树ADT(抽象数据类型),元素的顺序不是考虑的重点。如果需要用到元素的顺序信息,那么可以使用链表、栈、队列等线性数据结构。原创 2025-01-31 04:47:33 · 436 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D2_二叉树(BT)(D1_基础学习)))
如果一棵树中的每个结点有0、1或者2个孩子结点,那么这棵树就称为二叉树。空树也是一棵有效的二叉树。一棵二叉树可以看作由根结点和两棵不相交的子树(分别称为左子树和右子树)组成。为了对树结构进行处理,需要一种机制来遍历树中的结点。访问树中所有结点的过程叫作树遍历。在遍历过程中,每个结点只能被处理一次,尽管其有可能被访问多次。我们已经知道,在线性数据结构(例如,链表、栈、队列)中,数据元素是以顺序方式被访问的。但是,在树结构中,有多种不同的方式。原创 2025-01-31 04:01:00 · 1116 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D2_二叉树(BT)(D2_刷题练习)))
【代码】04树 + 堆 + 优先队列 + 图(D1_树(D2_二叉树(BT)(D2_刷题练习)))原创 2025-01-31 04:02:34 · 640 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D3_二叉搜索树(BST)))
上图表示了问题的一个实例。红色结点自上而下组成答案,边缘以访问顺序标号。上图表示了同一个示例,红色结点自上而下组成答案,边缘以访问顺序标号。用 index 记录正整数的取值进度,用优先队列保存后续加入的值。以下代码通过迭代实现前序遍历。原创 2024-10-08 23:37:29 · 1717 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D4_平衡二叉搜索树(AVL)))
图(Graph)是由顶点的有穷非空集合V ( G ) 和顶点之间边的集合E ( G )组成,通常表示为: G = ( V , E ) ,其中,G表示个图,V 是图G中顶点的集合,E是图G中边的集合。若V = { v 1 , v 2 , . . . , v n } ,则用∣ V ∣表示图G中顶点的个数,也称图G的阶,E = { ( u , v ) ∣ u ∈ V , v ∈ V } ,用∣ E ∣表示图G中边的条数。注意:线性表可以是空表,树可以是空树,但图不可以是空图。原创 2024-10-06 21:59:45 · 1707 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D5_红黑树(RBT)))
树是一种类似于链表的数据结构,不过链表的结点是以线性方式简单地指向其后继结点,而树的一个结点可以指向许多个结点。树是一种典型的非线性结构。树结构是表达具有层次特性的图结构的一种方法。对于树ADT(抽象数据类型),元素的顺序不是考虑的重点。如果需要用到元素的顺序信息,那么可以使用链表、栈、队列等线性数据结构。原创 2024-10-06 22:03:05 · 664 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D6_B树(B)))
前面我们已经讲解过了二叉树、二叉搜索树(BST)、平衡二叉搜索树(AVL树)、红黑树,接下爱就让我们了解下B树到底是什么?在计算机科学中,B树是一种自平衡的树形数据结构,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数量级的时间复杂度内完成。B树,其实是一颗特殊的二叉查找树(binary search tree),可以拥有多于2个子节点。与自平衡二叉查找树不同,B树为系统大块数据的读写操作做了优化。原创 2025-02-01 23:35:00 · 1266 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D7_B+树(B+)))
B+树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树被用于MySQL数据库的索引结构。这里为了便于大家理解,我基于内存(因为数据量的原因,实际上的B+树应该基于磁盘等外存,基于内存的比较适合作为Demo,同时还可以作为一种多路搜索树)实现了B+树的增删查改操作(包括节点分裂和节点合并)原创 2025-02-01 23:38:41 · 1001 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D8_B*树(B*)))
B*树是B+tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B树中非根和非叶子结点再增加指向兄弟的指针;B树定义了非叶子结点关键字个数至少为(2/3)M,即块的最低使用率为2/3(代替B+树的1/2),B*树分配新结点的概率比B+树要低,空间使用率更高。原创 2025-02-01 23:42:24 · 478 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D9_替罪羊树))
替罪羊树是一种基于部分重建的自平衡二叉搜索树。它的主要思想是在树失去平衡时,通过重建特定子树来恢复树的平衡状态。这种思想通过在每次操作后检查操作路径上的节点,并重建满足一定条件的子树来实现。这些条件通常包括子树的大小与整个树的大小之间的比例。替罪羊树中的平衡因子(alpha)用于判断子树是否需要重建,其值通常在0.5到1之间,一般选择0.75以避免过度重建。在替罪羊树上,插入和删除操作的时间复杂度最坏情况下为O(log n),搜索操作的时间复杂度也是O(log n)。原创 2025-02-03 00:12:24 · 292 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))
了决策树算法的基本原理,并提供了一个Java代码示例来说明其实现过程。决策树算法基于“分而治之”的思想,通过对特征进行条件判断,将数据集划分为多个子集,直至子。决策树算法是一种常用的机器学习算法,可用于分类和回归问题。决策树算法是一种简单而有效的机器学习算法,通过构建一棵树来进行分类和回归任务。建一棵树,树的每个节点代表一个特征,每个叶节点代表一个类别或回归值。本文将介绍决策树算法的基本原理,并提供了Java代码示例来说明其实现过程。单、易于理解和解释的特点,且在处理大规模数据时具有较高的效率。原创 2025-02-03 00:13:34 · 986 阅读 · 2 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D11_伸展树))
伸展树是一种二叉搜索树,伸展树也是一种平衡树,不过伸展树并不像AVL树那样对树的平衡有很严格的要求(左右孩子高度之差不能超过1),伸展树通过一系列的伸展操作,可以保证对伸展树的任意连续M次操作,其时间复杂度不会超过MlogN级别,并且伸展树的实现相较于AVL树也简单了很多,不论是插入还是删除算法。原创 2025-02-03 00:14:33 · 451 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D12_线段树))
线段树(又名区间树)也是一种二叉树,每个节点的值等于左右孩子节点值的和,线段树示例图如下以求和为例,根节点表示区间0-5的和,左孩子表示区间0-2的和,右孩子表示区间3-5的和,依次类推。原创 2025-02-04 01:03:53 · 657 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D13_表达式树))
用来表示表达式的树叫作表达式树。在表达式树中,叶子结点是操作数,而非叶子结点是操作符。也就是说,表达式树是一棵内部结点为操作符,叶子结点为操作数的二叉树。表达式树由二元表达式组成。但是,对于一元操作符,一个子树将为空。下图为表达式:(A+B*C)/D所对应的一个简单表达式树。原创 2025-02-04 01:05:00 · 426 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D14_异或树))
这个概念与前面所说的存储高效的双向链表类似。并且,与线索二叉树类似,这种表示方式不需要栈或队列来遍历树。这种表示利用异或操作来进行后向遍历(至双亲结点)和前向遍历(至孩子结点)。每个结点的left字段为其双亲结点与其左孩子结点的异或。每个结点的right字段为其双亲结点与其右孩子结点的异或。根结点的字段结点为空(NULL),并且叶子结点的孩子结点也是空(NULL)结点。该表示方法的主要目的是能够方便地找到结点的双亲结点和孩子结点。下面讨论如何利用该表示方法遍历整棵树。原创 2025-02-04 01:06:09 · 518 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D15_哈夫曼树/霍夫曼树))
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)路径:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径路径长度:通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。原创 2025-02-04 01:07:25 · 763 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D16_通用树(N叉树)))
前面讨论的是每个结点最多有2个孩子结点的二叉树,这种树很容易用两个指针来表示。但是若一棵树中每个结点可以有任意多个子结点,而且并不知道一个结点到底有多少个子结点,该如何表示它们?例如,考虑上图所示的树。原创 2025-02-04 01:08:53 · 739 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D1_树(D17_综合刷题练习))
上图表示了问题的一个实例。红色结点自上而下组成答案,边缘以访问顺序标号。上图表示了同一个示例,红色结点自上而下组成答案,边缘以访问顺序标号。用 index 记录正整数的取值进度,用优先队列保存后续加入的值。以下代码通过迭代实现前序遍历。原创 2025-02-04 01:11:26 · 1639 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D2_堆)
堆是一棵具有特定性质的二叉树。堆的基本要求是堆中所有结点的值必须大于或等于(或小于或等于)其孩子结点的值。这也称为堆的性质。堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h 或 h一1层(其中 h 为树的高度,完全二叉树)。如图:在下面的例子中,左边的树是堆(每个元素都大于其孩子结点的值),而右边的树不是堆(因为5大于右孩子1)。加强堆与系统给的PriorityQueue不同的是,具备反向索引表。原创 2025-02-05 00:50:55 · 506 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D3_优先队列)
在有些情况下,可能需要找到元素集合中的最小或最大元素。可以利用优先队列ADT来完成该操作。优先队列ADT是一种数据结构,它支持插人(Insert)和删除最小值(DeleteMin)操作(返回并删除最小元素)或删除最大值(DeleteMax)操作(返回并删除最大元素)。这些操作等价于队列的EnQueue和 DnQueue操作。区别在于,对于优先队列,元素进入队列的顺序可能与其被操作的顺序不同。作业调度是优先队列的一个应用实例,它根据优先级高低而不是先到先服务的方式来进行调度。原创 2025-02-05 00:52:56 · 825 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D4_图(D1_基础学习))
图(Graph)是由顶点的有穷非空集合V ( G ) 和顶点之间边的集合E ( G )组成,通常表示为: G = ( V ,E ) ,其中,G表示个图,V 是图G中顶点的集合,E是图G中边的集合。若V = { v 1 , v 2 , . . . , v n} ,则用∣ V ∣表示图G中顶点的个数,也称图G的阶,E = { ( u , v ) ∣ u ∈ V , v ∈ V } ,用∣ E ∣表示图G中边的条数。注意:线性表可以是空表,树可以是空树,但图不可以是空图。就是说,图中不能一个顶点也没。原创 2025-02-06 00:50:31 · 952 阅读 · 0 评论 -
05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D1_并查集(D1_基础学习))
中,我们需要记录沿途的所有节点,在查找结束后,我们将沿途的这些节点,在fatherMap中的进行修改,直接。这里是创建一个 sizes 的数组,来存放每一个集合中的元素的数量,初始化时,每个集合的数量都是 1 个。下面在合并函数中,判断两个集合中的元素数量大小,小的集合合并到大的集合中,最重要的是,合并之后要更。基于rank 的优化,在一定程度上保证树的相对平衡,但是在不断的合并过程中,整个树的高度是。参考树的结构,把元素挂到父节点下,若两个元素的父节点相同,则是同一块区域,两个元素的父。原创 2025-02-07 01:52:06 · 1208 阅读 · 0 评论 -
05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D1_并查集(D2_刷题练习))
【代码】05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D1_并查集(D2_刷题练习))原创 2025-02-07 01:53:00 · 523 阅读 · 0 评论 -
05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D2_散列表(D1_基础学习))
哈希表(Hash Table),又叫散列表,是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。也就是说,把关键字映射到一个表中的位置来直接访问记录,以加快访问速度。通常,我们把这个关键字称为 Key,把对应的记录称为 Value,所以也可以说是通过 Key 访问一个映射表来得到 Value 的地址。而这个映射表,也叫作散列函数或者哈希函数,存放记录的数组叫作散列表。其中有个特殊情况,就是通过不同的 Key,可能访问到同一个地址,这种现象叫作碰撞。原创 2025-02-08 02:05:49 · 1007 阅读 · 0 评论 -
05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D2_散列表(D2_刷题练习))
【代码】05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D2_散列表(D2_刷题练习))原创 2025-02-08 02:06:37 · 599 阅读 · 0 评论 -
05并查集 + 散列表 + 布隆过滤器 + 跳表 + 自动机(D3_布隆过滤器)
以下定义来自百度百科:布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。布隆过滤器是由很长的二进制向量(即可以理解成很长的0、1数组)与一系列随机映射函数(Hash函数)构成。布隆过滤器的作用是检索一个元素是否存在我们的集合之中。优点是空间效率和查询时间都比一般的算法要好的多;原创 2025-02-12 17:44:07 · 681 阅读 · 0 评论 -
04树 + 堆 + 优先队列 + 图(D4_图(D2_刷题练习))
下面的代码使用两个一维数组进行状态转移。原创 2025-02-06 00:52:05 · 1389 阅读 · 0 评论 -
06排序 + 查找(D1_排序(D1_基础学习))
所谓排序,就是整理表中的数据元素,使之按元素的关键字递增/递减的顺序排列。排序(Bubble Sort)是一种简单的排序算法,它的基本思想是通过不断交换相邻两个元素的位置,使得较大的元素逐渐往后移动,直到最后一个元素为止。冒泡排序的时间复杂度为 O(n^2),空间复杂度为 O(1),是一种稳定的排序算法。从序列的第一个元素开始,对相邻的两个元素进行比较,如果它们的顺序错误就交换它们的位置,即将较大的元素往后移动,直到遍历到序列的最后一个元素。对剩下的元素重复上述步骤,直到整个序列都已经有序。原创 2025-02-23 12:51:56 · 1550 阅读 · 2 评论 -
06排序 + 查找(D1_排序(D2_刷题练习))
下面的代码使用两个一维数组进行状态转移。原创 2025-02-06 00:51:29 · 878 阅读 · 0 评论