自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 【数据结构】图论入门:从表示到遍历,手把手带你实现BFS/DFS

上述实现针对的是无权图。最短路径问题:如 Dijkstra 算法,用于计算一个顶点到其他顶点的最短路径。最小生成树:如 Prim 算法、Kruskal 算法,用于在连通图中找到一棵包含所有顶点且边权和最小的树。网络流:如最大流问题。在处理有权图时,邻接表中存储的不仅仅是邻居顶点,还需要存储边的权重。通常我们会定义一个内部类Edge,包含目标顶点和权重。遍历算法也需要相应调整(如 Dijkstra 使用优先队列)。由于篇幅限制,本文不展开有权图的算法,但希望读者了解,图的表示和遍历是学习这些高级算法的基础。

2026-03-09 12:54:36 372

原创 【数据结构】深入浅出字典树(Trie)与并查集(Union-Find):从原理到Java实现

字典树,又称前缀树或Trie树,是一种专门用于处理字符串集合的树形数据结构。它的核心思想是利用字符串的公共前缀来减少查询时间,最大限度地避免不必要的字符串比较。想象一个场景:我们要存储一个单词列表,比如,并快速判断某个单词是否在列表中,或者查找所有以某个前缀开头的单词。如果用哈希表存储,可以快速判断单词是否存在,但无法高效地查询前缀。而字典树通过将单词拆分成字符,逐层构建树结构,使得查找前缀变得极其高效。字典树的特点根节点不包含字符,除根节点外每个节点都包含一个字符。

2026-03-09 12:47:43 533

原创 【数据结构】高级树——红黑树太难懂?换个思路,从 2-3 树的分裂合并聊起

2-3树是一种多路查找2-节点:包含1个键和2个子节点(左子树所有键小于该键,右子树所有键大于该键),与BST节点类似。3-节点:包含2个键和3个子节点,通常记为(a, b),其中a < b。左子树所有键小于a,中间子树所有键介于a和b之间,右子树所有键大于b。重要性质:所有叶子节点都在同一层,因此树是完美平衡的。下图展示了2-3树的结构(用文字描述):[50]/ \这里根节点是2-节点(50),左子节点是3-节点(20,30),右子节点也是3-节点(60,80)。2-3树。

2026-03-08 14:41:37 403

原创 【数据结构】树基础——从 BST 到 AVL:手写实现二叉树的“平衡艺术”

二叉搜索树是一棵二叉树,满足以下性质:每个节点有一个键(key)和值(value),通常键是唯一的。左子树所有节点的键都小于根节点的键。右子树所有节点的键都大于根节点的键。左右子树也分别是二叉搜索树。这个性质使得我们可以在O(log n)(平均)时间内完成查找、插入和删除。但最坏情况下,如果插入的数据是有序的,BST会退化成一条链表,操作复杂度变为O(n)。这就是我们需要平衡树的理由。每个节点包含键、值、左子节点引用、右子节点引用。int key;// 这里用String作为值类型,方便演示。

2026-03-08 14:21:59 702

原创 【数据结构】进阶大厂必备:彻底搞懂堆(Heap)的结构、堆排序及优先队列实现

完全二叉树:除了最后一层,其他层的节点都是满的,且最后一层的节点尽可能靠左排列。堆序性质:对于最小堆,任意父节点的值小于等于其子节点的值;对于最大堆,任意父节点的值大于等于其子节点的值。下图是一个最小堆的示例(数字代表节点的值):5/ \8 9/ \12 11可以看到,每个父节点都小于它的子节点,根节点(5)是整个堆中最小的元素。最大堆则相反,根节点最大。// 存储堆元素的数组// 当前堆中元素个数size = 0;/**

2026-03-07 13:08:26 538

原创 【数据结构进阶版】从数组到哈希表:用五大基础数据结构拼出一台 LRU 缓存引擎

LRU 是的缩写,即最近最少使用。它是一种缓存淘汰策略:当缓存空间满时,优先淘汰最长时间没有被访问的数据。现实类比:手机后台 App 管理。当你打开多个应用,系统内存不足时,会关闭你最长时间没用的那个应用。应用场景:Redis 缓存、操作系统页面置换、浏览器历史记录等。每个节点存储 key、value 以及前后指针。存储 key 是为了在淘汰时能从哈希表中删除对应的条目。int key;int value;哈希表提供了 O(1) 的键值查找。双向链表保证了节点顺序的快速维护(移动、删除)。

2026-03-07 13:08:01 562

原创 【数据结构】当两个不同的 Key 撞在了一起:HashMap 的“事故”现场与急救指南

现实很骨感:不同的 key 经过哈希函数计算后,可能得到相同的下标。比如"apple"和"banana"都映射到了下标 3。这种情况称为哈希冲突(Hash Collision)。冲突是无法完全避免的,因为数组长度有限,而 key 的可能性无限。所以我们必须有办法解决冲突。K key;V value;// 指向下一个节点,用于拉链 public Entry (K key, V value, Entry<K, V> next) {// 默认数组长度// 桶数组// 当前存储的键值对数量。

2026-03-06 17:37:28 339

原创 【数据结构】栈的艺术:从括号匹配到 ArrayDeque 的数组迁移实现

LIFO 特性:通过push和pop在数组末尾操作实现。数组实现:用数组存储,size记录元素个数,栈顶在size-1处。动态扩容:当数组满时,创建新数组并复制原数据,保证栈可以无限增长。数据迁移:扩容时的复制操作,是数组实现动态容量的核心。

2026-03-06 15:18:01 575

原创 【数据结构】队列全家桶:数组实现、堆与延迟队列

本文深入探讨了队列数据结构及其变种实现。首先介绍了队列的FIFO特性及基本操作,然后详细讲解了基于数组的循环队列实现方案,解决了简单数组队列的"假溢出"问题。接着阐述了优先队列的概念,展示了如何通过最小堆实现优先队列及其应用场景。最后介绍了延迟队列的设计思路,结合优先队列和时间维度实现定时任务调度功能。文章通过具体代码示例,完整呈现了从基础队列到高级队列变种的实现路径,为开发各类队列相关应用提供了实用参考。

2026-03-05 11:03:18 383

原创 【数据结构】拆解 ArrayList:从内存布局到扩容机制实战

数组(Array)是一种线性表数据结构,它用一组连续的内存空间来存储相同类型的数据。每个元素占用相同大小的内存,通过下标(索引)可以直接计算出对应元素的内存地址。例如:一个会在内存中开辟一块连续的 5×4=20 字节的空间(假设 int 占 4 字节)。元素arr[0]的地址是起始地址,arr[1]的地址是起始地址+4,以此类推。// 存储元素的数组// 实际元素个数// 默认初始容量// 构造方法:指定初始容量// 无参构造,使用默认容量解释是实际存放元素的数组,由于泛型擦除。

2026-03-04 00:37:02 337

原创 【数据结构】三部曲:搞懂链表分类、掌握核心操作、复刻官方 LinkedList

如果你想找第 100 个元素,Java 会先看一共多少人。这意味着它既能当队列用(先进先出),也能当栈用(先进后出)。:手里有两张纸条,一张写着“下一站”,一张写着“上一站”。造一个新节点,让它的 next 指向 oldFirst。每个盒子要装三样东西:数据、前面的地址、后面的地址。把公司的“门牌号”(first)挂在新人头上。遍历链表,找到第一个匹配的元素并解除链接。:最后一个人手里拿着指向第一个人的纸条。记住现在的“老大”(oldFirst)。,方便垃圾回收(GC)赶紧把内存腾出来。

2026-03-01 23:11:18 424

原创 阿里巴巴编程规范---编程规约之常量定义与代码格式篇

1.【强制】不允许任何魔法值即未经预先定义的常量直接出现在代码中。反例:// 本例中,开发者 A 定义了缓存的 key,然后开发者 B 使用缓存时少了下划线,即 key 是"Id#taobao"+tradeId,导致出现故障尤其是Enum枚举类里2.【强制】在 long 或者 Long 赋值时,数值后使用大写字母 L,不能是小写字母 l,小写容易跟数字混淆,造成误解。说明:写的是数字的 21,还是 Long 型的 2?(三)代码格式1.【强制】

2026-02-07 10:20:57 592

原创 阿里巴巴编程规范---编程规约之命名风格篇

布尔属性加is前缀会导致框架通过 getter 反向推导的属性名(如deleted)与实际属性名(如isDeleted)不匹配,引发序列化 / 映射错误;MySQL 用is_xxx命名布尔字段是为了可读性,POJO 用xxx命名是为了适配框架解析规则;两者的衔接依赖 MyBatis 的,将数据库is_xxx字段映射到 POJO 的xxx属性,兼顾两种规范。Ⅹ.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

2026-02-07 10:05:25 741

原创 Java枚举、校验注解与MyBatis-Plus条件构造器方法

Java 枚举是一个特殊的类,一般表示一组常量。Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。(下面是JPA默认时的枚举,mybatis时存储的是name,可以看(3)⑥)enum Color// 执行输出结果//输出RED。

2026-01-30 23:55:51 729

原创 Socket通信基础原理(会话层核心)

本文系统介绍了Socket网络通信的实现与优化方案。首先讲解了Socket的基本概念及其在网络体系中的位置,然后详细演示了基础通信的实现步骤,包括服务器端和客户端的代码实现。针对单线程模式的局限性,提出了多线程解决方案,并进一步引入线程池优化,分析了线程池的核心参数、运行流程及四种拒绝策略。文章比较了单线程、多线程和线程池三种方案的优缺点,并指出线程池最适合生产环境高并发场景。最后拓展了OSI七层模型知识,强调Socket在会话层的关键作用。通过从基础到优化的完整演进,展示了构建高效网络应用系统的技术路径。

2025-12-07 01:38:24 848

原创 java基础深入:包装类的剖析

Java包装类将基本数据类型转为对象,实现面向对象特性。通过自动装箱(基本类型→包装类)和拆箱(包装类→基本类型)机制,使基本类型能参与对象操作。装箱调用valueOf()方法,在-128~127范围内会复用缓存对象;拆箱调用intValue()返回存储的int值。注意包装类比较时,"=="比较地址(相同值可能不同地址),equals()比较值。包装类解决了基本类型不能作为对象使用的问题,支持泛型等特性,是Java面向对象设计的重要补充。

2025-11-04 00:15:09 1651

原创 两个递增链表合并为一个递增链表(C++)

【代码】两个递增链表合并为一个递增链表(C++)

2025-10-21 00:32:39 101

原创 简易计算器(无优先级)

【代码】简易计算器(无优先级)

2025-10-20 22:14:35 369

原创 环境配置经验——pytorch-wheels-cu113安装报错解决+pycharm虚拟环境python版本不一致问题解决

摘要:用户尝试安装PyTorch时遇到文件路径错误,提示找不到指定版本的whl文件。建议从阿里云镜像下载正确版本并放置到对应目录。同时发现PyTorch虚拟环境存在Python版本冲突问题:conda list与python -V显示版本不一致。解决方法是先退出所有虚拟环境(包括.venv),再重新激活目标环境。其中.venv可能是之前配置其他项目时遗留的虚拟环境,与当前虚拟环境产生了冲突。

2025-09-25 00:04:42 313

原创 cf 1050 div4 C题题解具体分析

Farmer John 正在运行 FitnessGram 起搏器测试!农夫约翰花跑到体育馆的另一边。因此,在每一分钟开始时,FJ可以选择要么跑到健身房的另一边,要么留在原地。如果他选择跑到健身房的另一边,他会获得。FJ 将运行 Pacer 测试,直到开始m-第分钟。最初(在0-th minute),FJ 位于健身房的起始侧,我们将其表示为侧0.健身房的另一侧表示侧面1起搏器测试音频播放n次。在第aiminute,FJ 必须位于bi一侧。

2025-09-15 13:08:23 772

原创 洛谷-P1827

摘要:本文通过前序遍历和中序遍历结果重建二叉树,并输出后序遍历序列。前序遍历的第一个元素是根节点,在中序遍历中找到该节点位置即可划分左右子树。递归处理左子树和右子树后输出根节点,最终得到后序遍历结果。核心思路是利用前序确定根节点,中序划分左右子树边界,递归构建后序序列。代码实现中注意处理递归边界条件(l1>r1),确保正确输出所有节点。示例输入ABEDFCHG和CBADEFGH,输出后序结果为AEFDBHGC。

2025-07-15 13:49:04 1890

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除