- 博客(270)
- 收藏
- 关注
原创 线程池学习(六)实现工作窃取线程池(WorkStealingThreadPool)
工作窃取线程池(WorkStealingPool)是一种高效的多线程任务调度方案。其核心思想是:每个工作线程维护自己的双端任务队列,优先处理本地队列任务(LIFO策略);当线程空闲时,会随机窃取其他线程队列头部的任务(FIFO策略)。这种设计减少了线程间的锁竞争,提高了CPU利用率。实现上采用双端队列支持两端操作,本地线程操作队列尾部,其他线程窃取队列头部任务。通过线程局部存储记录队列索引,并采用随机窃取算法避免集中竞争。该方案特别适合CPU密集型、可分解的并行任务,如数据处理、递归计算等场景。相比传统线程
2026-01-07 17:24:15
565
原创 线程池学习(五) 单线程池(SingleThreadPool)
摘要:本文介绍了SingleThreadPool的设计与实现,该线程池具有严格FIFO执行顺序、自然线程安全等特点。核心实现包括同步队列(syncqueue)和单线程池(singlethreadpool)两个组件,使用条件变量和互斥锁保证线程安全。SingleThreadPool适用于需要顺序执行任务的场景,提供了execute和submit两种任务提交方式,支持停止控制和状态查询功能。与FixedThreadPool和CachedThreadPool相比,SingleThreadPool在简单场景和调试场
2026-01-06 22:32:12
392
原创 线程池学习(四)实现缓存线程池(Cached ThreadPool)
摘要:CachedThreadPool是一种动态调整线程数量的线程池实现。其核心机制是:当任务到来时优先复用空闲线程,若无空闲线程且未达上限则创建新线程;线程空闲超过60秒(默认)后自动销毁。实现要点包括:1)使用syncqueue管理任务队列;2)通过atomic变量跟踪线程状态;3)支持任务提交和返回值获取;4)动态扩缩容机制。相比FixedThreadPool,它适合处理大量短期异步任务,但需注意线程数量不受限可能导致资源耗尽。最佳实践推荐使用ThreadPoolExecutor进行更精细的控制,包括
2026-01-06 21:11:02
1028
原创 线程池学习(三) 实现固定线程池及优化(拒绝策略、改进addtask)
还要避免长时间去执行一个任务,会导致后面的任务大量堆积而得不到及时处理,对于耗时较长的任务可以考虑用单独的线程去处理。在调用者线程中执行该任务。该策略实现了一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将任务回退到调用者(调用线程池执行任务的主线程),由于执行任务需要一定时间,因此主线程至少在一段时间内不能提交任务,从而使得线程池有时间来处理完正在执行的任务。抛弃阻塞队列中最老的任务,相当于就是队列中下一个将要被执行的任务,然后重新提交被拒绝的任务。什么都不做,直接抛弃被拒绝的任务。
2026-01-05 23:15:36
568
原创 线程池学习(二)线程池详解
线程池是一种高效管理多线程任务的技术,通过预先创建和维护一组可复用线程来优化系统性能。其核心优势包括线程复用、并发控制、任务排队等,能显著降低线程创建销毁开销,提高响应速度。常见线程池类型包括固定线程池、缓存线程池、单线程池等,适用于不同场景。实现模式主要有领导者-跟随者模式(追求极致性能)和半同步/半异步模式(生产者消费者模式),前者通过动态角色切换实现无锁竞争,后者通过任务队列实现解耦。线程池通过同步队列管理任务分发,在保证线程安全的同时,需注意队列容量控制以防内存溢出。该技术广泛应用于高并发、定时任务
2026-01-04 22:01:00
1093
原创 线程池学习(一) 理解操作系统 进程 线程 协程及上下文切换
摘要:本文用公司部门类比操作系统中的进程和线程关系。进程相当于资源容器(部门),线程是实际执行单元(员工)。进程本身不执行代码,仅负责资源分配和隔离;线程使用进程资源完成具体任务。上下文切换开销因任务类型不同而异:进程切换开销最大(涉及内核态切换),线程次之,协程最小(用户态切换)。核心结论:进程确保资源隔离和稳定性,线程实现高效执行,二者缺一不可。在CPU密集型任务中应增加线程或进程,IO密集型任务则适合使用协程或增加线程。
2026-01-04 19:43:46
698
原创 数据结构 字典树
本文实现了一个支持小写字母的字典树(Trie)数据结构,包含以下功能:1)创建/释放字典树;2)插入/搜索单词;3)前缀检查;4)自动补全;5)删除单词;6)获取单词频率;7)统计单词总数。字典树节点使用26个子节点数组存储字母,支持单词计数和前缀匹配。主要函数包括:trie_insert()插入单词、trie_search()查找单词、trie_autocomplete()实现前缀自动补全、trie_delete()删除单词等。该实现还包含调试工具函数,如打印字典树内容和统计单词总数。所有操作时间复杂度为
2026-01-01 19:22:09
210
原创 数据结构 Trie树(字典树、前缀树)
Trie树(字典树/前缀树)是一种多叉树结构,用于高效存储和查询字符串集合。其特点包括:根节点不含字符,路径代表字符串,公共前缀共享路径。Trie树支持插入、查询完整字符串和前缀统计等操作,时间复杂度均为O(L),其中L为字符串长度。实现时使用动态分配的idx标识节点,通过二维数组存储子节点关系。应用场景包括单词查找、输入法提示等。虽然存在内存消耗大的缺点,但通过压缩优化(如RadixTree)可改善。Trie树在前缀处理方面具有独特优势,是字符串处理的重要数据结构。
2026-01-01 18:49:49
732
原创 数据结构 b+树
本文实现了一个B+树数据结构,包含完整的插入、删除、查找和范围查询功能。B+树采用M阶结构(示例中M=4),具有以下特点:1) 内部节点存储索引关键字;2) 叶子节点通过链表连接便于范围查询;3) 支持数据指针存储。核心算法包括节点分裂/合并处理上溢/下溢情况,通过递归调整保持树平衡。实现提供了详细的API接口,包括初始化、插入、删除、查找、范围查询和销毁操作,并包含调试显示功能。该实现采用C语言编写,使用动态内存管理,通过断言检查参数有效性,确保数据结构的正确性和健壮性。
2025-12-30 21:32:24
348
原创 数据结构 b+树详解
B+树是一种优化的平衡多路查找树,主要用于数据库索引。与B树相比,B+树所有数据存储在叶子节点,非叶节点仅作索引,且叶子节点通过指针连接形成链表。B+树的查找、插入和删除操作遵循特定规则,如节点分裂、合并等。其优势在于高效的磁盘I/O和范围查询能力,因为数据都在叶子节点且有序链接,避免了B树的中序遍历。这使得B+树成为数据库系统中理想的索引结构。
2025-12-30 19:56:55
1145
原创 数据结构 b树(b-)树
本文实现了一个M阶B-树数据结构,包含完整的基本操作。B-树采用平衡多路搜索树结构,支持高效查找、插入和删除操作。主要功能包括:初始化、关键字查找(优化二分查找)、插入(含节点分裂处理)、删除(含节点合并和借元素调整)以及中序遍历打印。实现中特别处理了节点上溢和下溢情况,通过分裂节点和合并节点维护B-树性质。代码结构清晰,分为头文件和源文件,包含节点结构定义和10个核心操作函数,确保B-树在动态更新时始终保持平衡状态,适合大规模数据存储和检索场景。
2025-12-30 18:16:12
230
原创 数据结构 b树(b-树)概念详解
本文摘要:B-树是一种适合外查找的多叉平衡搜索树,用于处理海量数据无法一次性装入内存的情况。文章详细介绍了B-树的概念、性质及操作:1. B-树特点包括多路平衡、节点关键字数量限制、绝对平衡性等;2. 插入操作通过分裂节点维持平衡;3. 删除操作需考虑关键字位置,可能涉及借节点或合并节点;4. 分析了B-树的高度范围及其性能优势;5. 验证了B-树的中序遍历有序性。相比二叉搜索树和哈希表,B-树通过降低树高度减少磁盘IO次数,显著提升大数据场景下的查询效率。
2025-12-30 14:40:38
1562
原创 数据结构 AVL树讲解
AVL树是一种严格自平衡的二叉搜索树,由Adelson-Velsky和Landis于1962年提出。其核心特性是通过平衡因子(左右子树高度差不超过1)和四种旋转操作(LL、RR、LR、RL)维护树的平衡性,确保最坏情况下操作时间复杂度为O(logn)。相比普通二叉搜索树,AVL树避免了退化为链表的风险;与红黑树相比,它提供更严格的平衡从而获得更优的查询性能,但维护成本更高。典型应用包括数据库索引和编译器符号表管理,适合查询频繁而更新较少的场景。实现时需处理节点高度更新和多种旋转情况,是理解自平衡数据结构的重
2025-12-29 20:40:24
689
原创 数据结构 布隆过滤器
本文介绍了一个布隆过滤器的C语言实现。布隆过滤器是一种空间效率高的概率型数据结构,用于判断元素是否存在于集合中。实现包含创建/销毁过滤器、添加元素、查询元素存在性、清空过滤器等功能。核心算法使用DJB2和FNV-1a两种哈希函数,通过双哈希法生成多个哈希值来降低冲突概率。实现还包括计算理论误判率的方法,该误判率随元素数量增加而上升。过滤器使用位数组存储元素信息,具有内存效率高的特点,但存在一定的误判可能(可能将不存在的元素误判为存在)。
2025-12-29 18:05:03
261
原创 数据结构 可扩展哈希
本文实现了一个可扩展哈希表,采用目录结构和桶分离设计。主要功能包括:1) 使用djb2算法的字符串哈希函数;2) 支持键值对的插入、查找和删除操作;3) 当桶溢出时自动分裂,必要时进行目录倍增;4) 实现局部深度和全局深度的管理。哈希表结构包含哈希节点、桶和目录三个层级,每个桶容量为4个元素。核心算法包括桶分裂时的数据重分配和目录扩展时的指针更新。该实现提供了完整的哈希表操作接口,并包含调试打印功能。
2025-12-29 17:25:59
143
原创 数据结构 可扩展哈希代码解析
可扩展哈希是一种动态扩容的哈希表实现方法,通过目录和桶的二级结构实现渐进式扩容。其核心思想是当桶满时仅分裂该桶,而非整个表重哈希。数据结构包含目录(存储桶指针)和固定大小的桶,通过全局深度和局部深度控制哈希值的使用位数。相比传统哈希,可扩展哈希优势在于扩容时仅移动一个桶的数据,避免全表rehash带来的性能问题,特别适合大规模高并发场景。代价是需要额外目录空间,实现复杂度较高。典型应用包括数据库索引和文件系统。
2025-12-28 15:24:23
899
原创 数据结构 哈希表(链地址法)
本文实现了一个基于链地址法的哈希表,采用djb2字符串哈希算法。主要功能包括:创建/销毁哈希表、插入/查找/删除键值对、获取表大小、判断空表、打印表内容、清空表等。哈希表支持自动扩容,当负载因子超过0.75时进行rehash操作,新容量为下一个质数。使用链表解决哈希冲突,包含节点创建/释放、哈希索引计算、质数判断等辅助函数。该实现具有基本的哈希表功能,采用C++编写但保持C风格接口。
2025-12-28 14:36:39
131
原创 数据结构 可扩展哈希讲解
可扩展哈希表是普通哈希表的优化版本,核心解决了扩容时的性能问题。它通过局部桶分裂替代全局rehash,仅迁移满桶数据而非全部数据,避免了扩容卡顿。主要改进包括:1)按需分裂桶而非整体扩容;2)取消链表冲突处理,通过桶分裂保持查询效率O(1);3)采用目录索引实现高效数据定位。适用于大数据量场景,在保持普通哈希表接口的同时,显著提升了扩容效率和查询稳定性。实现上包含桶和目录两个核心组件,支持动态调整,负载因子可控,是工业级应用的理想选择。
2025-12-27 16:28:09
715
原创 数据结构 布隆过滤器讲解
摘要: 布隆过滤器是一种基于二进制向量和哈希函数的高效数据结构,用于快速判断元素是否存在于集合中。其优点是时间复杂度低(O(N))、空间占用小且保密性强,但存在误判率且难以删除元素。适用于数据去重、缓存穿透防护、爬虫URL去重、安全黑名单等场景。核心原理是通过多个哈希函数将元素映射到位数组,查询时检查对应位是否全为1。误判率可通过调整数组大小和哈希函数数量控制,但无法完全避免。典型应用包括防止重复提交、拦截恶意请求等,在空间效率和查询速度间取得平衡。
2025-12-27 16:09:52
658
原创 数据结构 一致性哈希(弹性哈希)及虚拟节点
摘要:本文对比了普通哈希算法与一致性哈希算法在分布式缓存中的应用。普通哈希算法通过对服务器数量取模实现数据分布,但在服务器增减时会导致大量缓存失效。一致性哈希算法采用2^32环形空间,将服务器和数据映射到环上,通过顺时针查找确定数据位置,有效减少服务器变动时的影响。针对可能出现的哈希环倾斜问题,引入虚拟节点机制提高数据分布均匀性。一致性哈希算法具有更好的容错性和可扩展性,是分布式系统中解决数据分布问题的有效方案。
2025-12-27 15:30:01
971
原创 数据结构 哈希表(链地址法)
摘要:本文实现了一个基于链地址法的哈希表数据结构,支持字符串键和整数值的存储。主要功能包括创建/销毁哈希表、插入/查找/删除键值对、获取大小和负载因子等操作。采用djb2哈希算法,初始容量为16(自动调整为质数),负载因子阈值为0.75时自动扩容。通过链表解决哈希冲突,包含详细的错误处理和调试输出。实现特点包括动态扩容机制、质数容量优化和内存管理,适用于需要高效键值存储的场景。
2025-12-26 22:31:58
230
原创 数据结构 哈希基础 哈希函数 哈希冲突及解决
哈希表是一种通过哈希函数将键映射到存储位置的高效数据结构,支持O(1)时间复杂度的基本操作。其核心包括哈希函数设计(如djb2、FNV-1a算法)和冲突解决方法(链地址法和开放地址法)。链地址法使用链表存储冲突元素,实现简单但需要额外空间;开放地址法则通过探测序列寻找空槽,空间利用率更高但删除复杂。性能受负载因子影响,建议链地址法负载因子控制在0.75以下,开放地址法0.5-0.7。实际应用需考虑元素数量、内存限制和操作频率,现代优化包括动态扩容、链表转红黑树等技巧。
2025-12-26 22:00:02
673
原创 数据结构 跳表
本文实现了一个跳表(SkipList)数据结构,主要包括以下功能:1)初始化跳表并设置最大层数(16层);2)创建节点并随机生成节点层数;3)实现插入、查找和删除操作;4)提供两种打印方式(完整结构和分层显示);5)内存管理功能。跳表通过多级索引实现O(log n)时间复杂度的查找效率,代码包含节点创建、随机层数生成、插入/删除逻辑处理以及内存释放等完整实现。
2025-12-26 17:58:45
104
原创 数据结构 跳表讲解
跳表是一种基于有序链表的多层索引数据结构,通过随机化方式维护索引层级,实现高效的查找、插入和删除操作,平均时间复杂度为O(logn)。相比平衡树,跳表实现更简单,支持范围查询,并发性更好,被广泛应用于Redis、LevelDB等系统。跳表通过随机函数动态更新索引,避免数据堆积导致的性能退化。其核心结构包含多层链表,每层都是有序的,底层包含所有元素。虽然存在最坏情况下退化为O(n)的风险,但实际应用中跳表展现出优异的性能,特别适合需要频繁查找和有序访问的场景。文中还提供了跳表的C++实现代码,展示了其基本操作
2025-12-26 17:56:38
1105
原创 C++ STL bitset 位图
C++ bitset是一个高效处理固定大小位序列的STL容器类。它通过#include<bitset>引入,编译时确定位数,每位仅占1bit内存空间。支持整数、字符串等多种初始化方式,提供set()、reset()、flip()等位操作方法,以及各种位运算和类型转换功能。典型应用包括权限管理、质数筛选和状态标志系统。相比vector<bool>,bitset内存效率更高但大小固定。使用时需注意越界访问问题,[]运算符不检查边界而test()方法会抛出异常。bitset特别适合需要高性
2025-12-24 22:24:27
766
原创 STL_unordered_map
本文介绍了C++中unordered_map的核心概念、实现原理和使用方法。unordered_map是基于哈希表实现的无序关联容器,具有O(1)平均时间复杂度的查找、插入和删除操作。文章详细解析了其底层实现机制,包括哈希函数、桶数组和冲突处理方法,并提供了基本用法示例和性能调优建议。特别强调了自定义键类型需要提供哈希函数和相等比较函数,以及使用时需注意的陷阱,如[]运算符的副作用和迭代器失效问题。最后对比了unordered_map与其他容器的特性差异,并总结了其典型应用场景。
2025-12-15 20:49:58
560
原创 STL——set
摘要:std::set是C++ STL中的关联容器,基于红黑树实现,具有元素唯一性和自动排序特性(默认升序)。核心特点包括:O(logn)时间复杂度的查找/插入/删除操作,不可直接修改元素值(需先删后插),支持高效的范围查询(lower_bound/upper_bound)。与vector和unordered_set相比,set在需要有序访问和范围查询时更具优势,但内存开销较大。典型应用场景包括自动去重排序、快速存在性检查和区间数据查询。使用时需注意其迭代器的const特性和自平衡树结构带来的性能特点。
2025-12-15 20:35:37
848
原创 一篇带你手搓小小红黑树!!!
红黑树是一种自平衡二叉查找树,通过颜色标记和旋转操作维持近似平衡。相比AVL树,红黑树的旋转操作更少,插入删除效率更高。文章详细介绍了红黑树的五大特性、节点结构、旋转操作(左旋/右旋)以及插入删除时的调整策略。插入时默认新节点为红色,通过变色和旋转处理连续红节点问题;删除时若涉及黑节点则需调整黑高。文中提供了完整的C++实现代码,包括节点创建、旋转、插入删除及调整函数等核心操作。红黑树通过颜色标记和有限旋转实现了高效的平衡性能。
2025-12-08 21:31:31
1334
原创 数据结构 红黑树
本文实现了一个红黑树数据结构,包含插入、删除、查找等核心操作。红黑树通过颜色标记和旋转操作维护平衡性,确保最坏情况下时间复杂度为O(log n)。主要实现包括:1) 节点结构定义和基本操作;2) 左旋/右旋操作维护树结构;3) 插入后的平衡调整处理红黑冲突;4) 删除后的平衡调整保持黑高特性。代码详细处理了各种插入和删除情况,包括双分支节点删除、颜色调整等,并提供了中序遍历功能。红黑树通过约束节点颜色和旋转操作,在保持相对平衡的同时减少了旋转次数,优于AVL树。
2025-12-08 18:34:17
85
原创 数据结构 AVL二叉平衡树
该代码实现了AVL树(自平衡二叉查找树)的基本操作,包括节点插入、删除、查找和遍历。主要功能点包括:1. 使用高度平衡机制防止BST退化;2. 提供四种旋转操作(左旋、右旋、左右旋、右左旋)保持平衡;3. 实现递归插入和删除操作,自动调整树结构;4. 包含中序遍历功能。通过维护节点高度和平衡因子,确保树在动态操作后仍保持O(logn)的时间复杂度。
2025-12-06 23:56:43
393
2
原创 数据结构 BST二叉搜索树
本文实现了一个二叉搜索树(BST)的基本操作,包括初始化、插入、删除、查找等功能。其中插入操作通过比较节点值确定位置,删除操作处理了三种情况:无子节点、单子节点和双子节点(使用中序后继节点替换)。查找操作采用常规的BST搜索方式。此外还实现了获取前驱/后继节点、中序遍历打印等功能。代码采用C++实现,使用了结构体定义树节点,并通过指针操作维护树结构。删除函数的实现较为复杂,需要处理多种情况,是BST实现中的难点。
2025-12-06 16:11:07
140
原创 数据结构 二叉树的遍历及构造
本文介绍了二叉树的基本操作实现,包括递归和非递归方式的三种遍历方法(先序、中序、后序),以及二叉树的构造方法。主要内容:1)递归遍历实现;2)使用栈的非递归遍历实现,包括单栈和双栈方法;3)两种二叉树构造方式:通过单个前序序列(含'#'标记)构建,以及通过前序+中序或后序+中序两个序列构建。文中提供了完整的C++代码实现,包括节点创建、遍历算法和树构建函数。
2025-12-06 13:09:30
111
原创 排序日常练习
本文展示了C++实现的7种经典排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序。每种算法都包含完整的实现代码,其中快速排序作为示例在main函数中调用测试。排序算法从简单到复杂,涵盖了比较排序的主流实现方式,包括时间复杂度为O(n^2)的基础算法和更高效的O(nlogn)算法。测试数组为{9,8,7,6,5,4,3,2,1},通过调用quick_sort函数演示了排序前后的变化。代码结构清晰,每个排序函数都有明确注释,便于理解各算法的实现原理。
2025-12-03 18:53:11
113
原创 C++流类库 字符串流
C++字符串流(sstream)提供了内存中的流操作功能,主要包括istringstream(输入)、ostringstream(输出)和stringstream(双向)三类。它们继承自标准IO流,支持<<、>>等操作符,常用于字符串格式化、类型转换和数据解析。ostringstream用于构建格式化字符串,istringstream用于解析字符串数据,stringstream支持双向操作。使用时需注意性能优化(如重用流对象)和错误处理(检查流状态)。字符串流比直接字符串操作更灵活,
2025-12-02 16:27:09
1079
原创 C++流类库 文件流操作
std::cout << "修改后 - ID: " << rec.id << ", 数据: " << rec.data << std::endl;std::cout << "ID: " << rec.id << ", 数据: " << rec.data << std::endl;os << "学号: " << id << ", 姓名: " << name << ", 分数: " << score;std::cerr << "无法打开源文件: " << source << std::endl;
2025-12-02 15:56:22
1208
原创 C++流类库 标准输入流的安全性与成员函数 ostream 成员函数与自定义类型的IO
std::cout << "实际读取了 " << std::cin.gcount() << " 个字符" << std::endl;std::cout << "你说的是: " << buffer << std::endl;std::cout << "你说的是: " << str << std::endl;
2025-12-02 14:47:01
1127
原创 C++流类库 概述及流的格式化输入/输出控制
/ mask 常用值: ios::basefield (dec|oct|hex), ios::adjustfield (left|right|internal), ios::floatfield (scientific|fixed)std::fixed, std::scientific, std::defaultfloat (恢复默认)std::cout << num << std::endl;std::setw(int n) // 设置域宽 (类似width(),只影响下一次IO)
2025-12-02 14:43:02
707
原创 数据结构 循环队列
该代码实现了一个循环队列的数据结构,主要功能包括:初始化队列、入队、出队、获取队头元素、查找元素、判断队列空/满状态、清空队列、销毁队列以及打印队列元素等操作。队列使用数组存储数据,通过front和rear指针实现循环机制,最大容量为10。关键操作包括使用模运算处理指针越界,以及实现队列的基本功能如push/pop等。代码包含错误检查和内存管理,确保操作安全可靠。
2025-12-01 21:10:59
236
原创 数据结构 链式队列
本文实现了一个链式队列数据结构,包含初始化、入队、出队、判空、清空、销毁等基本操作。队列使用头尾指针管理节点,每个节点包含数据域和指针域。主要功能包括:初始化时设置头尾指针为空;入队时动态分配新节点并更新尾指针;出队时释放头节点并更新头指针;提供判空、清空队列和销毁队列的方法;支持打印队列元素、获取队列长度和查看队头元素值。代码通过断言确保指针有效性,使用动态内存管理,并处理了队列空/非空状态下的边界情况。
2025-12-01 19:45:18
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅