登录社区云,与社区用户共同成长
邀请您加入社区
在学习红黑树之前,我们首先需要知道它到底解决了什么问题。4/ \2 6/ \ / \1 3 5 7log₂NO(logN)但是普通二叉搜索树并不会主动维护自己的结构。12345O(N)O(N)所以我们需要一种能够自动控制高度的二叉搜索树。AVL 树是一种解决方法,而红黑树则是另一种非常经典的解决方案。红黑树并不像 AVL 树那样严格要求左右子树高度差不超过 1,而是通过一些颜色规则间接约束树的高度
摘要:本文对比了C语言中的sizeof和strlen函数。sizeof是操作符,计算变量或类型所占内存大小(字节),不关心数据内容;strlen是库函数,统计字符串中\0之前的字符个数,可能越界查找。文章还解析了数组和指针的笔试题,强调数组名在不同上下文中的含义差异:单独使用表示整个数组,否则通常表示首元素地址。通过多个代码示例展示了sizeof和strlen在一维数组和字符数组中的具体应用与区别
红黑树为什么能够保持近似平衡?插入以后为什么需要变色和旋转?这一篇正式进入代码实现。1. 红黑树结点2. 左旋与右旋3. BST 插入4. 红黑树插入修复5. Find 查找6. 红黑树合法性验证红黑树的代码虽然看起来比较长,但真正复杂的部分其实只有插入修复。第一阶段:BST 插入第二阶段:新结点染红第三阶段:如果父结点为红,修复红红冲突→ 变色→ 向上继续→ 判断 LL / RR / LR /
左子树中的关键字小于根右子树中的关键字大于根左右子树仍然是二叉搜索树借助这个规则,我们可以根据关键字大小决定向左还是向右查找。但是,普通二叉搜索树有一个明显的问题:它只规定了关键字之间的大小关系,却没有限制树的形状。查找7O(log N)O(N)AVL 树就是为了解决这个问题而出现的。普通二叉搜索树↓树高决定操作效率↓限制左右子树高度差↓引入平衡因子↓按照 BST 规则插入↓沿祖先路径更新平衡因子
按照 BST 规则插入↓沿祖先路径更新平衡因子↓平衡因子为 0:停止平衡因子为 ±1:继续平衡因子为 ±2:旋转真正实现 AVL 树时,难点主要集中在旋转。二叉搜索树的大小关系左孩子指针右孩子指针父指针整棵树的根指针局部子树与上一层的连接结点的平衡因子右单旋左单旋左右双旋右左双旋最后给出一套可以直接在 Linux 环境中编译运行的完整 C++ 实现。假设失衡结点为parent说明 parent 左
在学习普通二叉树时,我们主要关注的是树的结构,以及前序、中序、后序、层序等遍历方式。但普通二叉树有一个问题:结点之间没有统一的大小关系。假设现在要在一棵普通二叉树中查找数字13,除了把整棵树遍历一遍,我们通常没有更好的办法。因为站在某个结点上时,并不知道目标应该在左子树还是右子树。较小的数据放在左边较大的数据放在右边正是这条看起来很简单的规则,让树具备了定向查找、插入和删除的能力。这时树的方向会与
int main()students.insert({1003, "张三"});students.insert({1001, "李四"});students.insert({1002, "王五"});return 0;
GitHub使用指南:从工具下载到商业机会挖掘(150字摘要) GitHub不仅是代码仓库,更是优质工具库和需求金矿。新手需掌握四个核心:1)看README了解功能,Releases下载安装包;2)通过Issues发现真实痛点,比官网更诚实;3)关注项目维护状态而非Star数,避免失效工具;4)警惕源码与成品区别,绿色按钮慎点。进阶用户可将反复出现的用户抱怨转化为选题(如数据迁移难题),或挖掘商业
虽然ptr的类型是Base*编译器如何知道指针实际指向哪种对象?静态绑定和动态绑定有什么区别?什么是虚函数表和虚函数表指针?派生类重写虚函数后,虚表发生了什么变化?为什么含有虚函数的对象可能会变大?为什么构造和析构期间不会调用更派生类版本?如何保存一组不同类型的多态对象?应该在什么时候使用?虚函数会带来多大性能开销?本文主要从底层原理和实际工程使用两个角度,继续讲解 C++ 多态。对象保存虚表指针
继承解决了类之间的代码复用问题,但仅仅有继承,还不能让程序根据对象的实际类型自动执行不同的行为。普通人:全价买票学生:优惠买票军人:优先买票如果程序通过大量if-elsecout << "全价买票" << endl;cout << "优惠买票" << endl;cout << "优先买票" << endl;多态提供了一种更自然的方式:调用者只面向统一的基类接口,具体执行哪个版本,由对象的实际类型决
继承是 C++ 面向对象部分非常重要的一块内容。在学习继承之前,我们已经接触过函数复用、模板复用和 STL。它们解决的都是“相同代码不要重复写”的问题,而继承解决的是类层面的复用。例如,学生和老师都具有姓名、年龄、电话和地址,也都需要进行身份认证。如果分别在Student和Teacher中定义这些成员,不但代码重复,后续修改起来也比较麻烦。继承允许我们把公共部分抽取到一个基类中,再让不同的派生类在
在数据结构中,栈算是比较容易理解的一种结构。它的规则很简单:最后放进去的元素,最先被取出来。后进先出LIFOC++ STL 已经提供了stack,使用起来并不复杂。但只记住push()和pop()栈为什么只能访问栈顶?pop()为什么不返回被删除的元素?stack为什么没有迭代器?什么是容器适配器?为什么 STL 默认使用deque作为底层容器?如何用已有容器简单模拟一个栈?栈是一种操作受限的线性
set某个关键字是否存在?而实际开发中,我们经常不只是想找到一个关键字,还想找到它对应的信息。英文单词 -> 中文解释学号 -> 学生成绩商品编号 -> 库存数量用户名 -> 用户资料文件名 -> 文件大小这种“一个关键字对应一个值”的关系,称为映射关系。C++ STL 中的map就是用来保存这种关系的有序关联式容器。key :用于查找和排序value :与 key 关联的数据map和set的关系
派生类构造时,基类部分由谁初始化?拷贝构造和赋值运算符是否需要处理基类?为什么构造顺序是从基类到派生类,析构顺序却正好相反?基类析构函数什么时候必须是虚函数?友元关系和静态成员会不会被继承?多继承为什么会产生二义性?菱形继承为什么会造成数据冗余?虚继承如何让多个路径共享同一个基类子对象?继承和组合到底应该如何选择?这些内容看起来比较分散,实际上都围绕一个核心问题:一个派生类对象中,不仅有派生类自己
C++ 的继承机制,初看就是"子类能访问父类的东西",但真到了同名隐藏、切片赋值、模板继承这些细节上,稍不注意就会写出 bug。别光看,一定要动手敲。把上面这些例子复制到 VS 里跑一遍,逐行设断点看调用栈,理解会深很多。
生活中排队是一件很常见的事。先到的人先接受服务,后到的人排在队尾等待。先进先出FIFOC++ STL 提供了queue容器适配器,可以直接实现队尾入队、队头出队。广度优先搜索二叉树层序遍历任务调度消息缓冲请求排队打印任务管理生产者和消费者模型本文从queue的基本接口开始,逐步讲解它的底层要求、典型应用、两个栈实现队列,以及一个简化版queue的模拟实现。队列是一种操作受限的线性数据结构。push
摘要:近期抖音热传的"豆包AI清理C盘"脚本引发热议,实则这类批处理文件(BAT)早在技术社区流传多年,并非AI独创。测试显示,主流AI模型(GPT、Kimi等)都能生成类似清理代码,并非豆包专属功能。所谓"必须电脑端使用"的设置,实则是Windows系统的权限隔离机制,防止AI未经授权访问本地文件。通过对比4款AI生成的代码发现,其核心清理逻辑(临时文件、
这篇文章探讨了Harness Engineering(驾驭工程)在AI代理开发中的关键作用,通过LangChain DeepAgents框架展示其落地实践。Harness Engineering作为Prompt Engineering和Context Engineering的进阶,专注于构建AI代理的完整运行环境,解决长周期、多步骤任务的系统级稳定性问题。文章详细介绍了DeepAgents框架的七
在 C++ STL 中,vector和list都是非常重要的序列式容器。如果说vector更像是“可以自动扩容的数组”,那么list更像是“一串用指针连接起来的节点”。很多同学刚学list的时候,会觉得它没有vector好用:不能下标访问,遍历起来还要用迭代器,看起来没有那么直观。但list适合频繁插入和删除插入时不会整体搬移元素删除某个节点时,通常只影响被删除节点对应的迭代器底层结构非常适合帮助
相信学过 C++ 的朋友都接触过模板。入门阶段我们一般就写个这种最基础的函数模板,感觉"就是那种感觉"。但当你真的在项目里用起来,或者读到一些库的源码时,会发现模板远比你想象的复杂——非类型参数、全特化、偏特化、指针比较的坑……这些东西不亲自踩一遍,光看理论是很难真正理解的。
本文介绍了如何在飞牛NAS上通过Docker部署EasyNVR视频监控管理系统,实现多品牌摄像头的统一接入与本地存储。主要内容包括:通过SSH连接NAS并部署EasyNVR容器,配置录像存储路径为NAS相册目录;讲解摄像头IP固定方法和RTSP/ONVIF协议区别;完成设备添加、录像计划设置及实时监控功能。最后通过cpolar实现公网访问,使外网也能查看实时画面和回放历史录像。该方案可替代厂商云存
本文介绍了「企悦抽」项目的功能演示(注册、登录、人员/奖品管理、抽奖等),并借助AI完成了接口设计文档,涵盖用户、奖品、活动、抽奖等模块,统一响应结构与鉴权约定,最后附上项目源码地址,便于后续实操。
本文档为「企悦抽」V1.0 PRD,定义活动配置、现场抽奖、结果公示与通知闭环。管理员可创建活动/奖品/人员,通过大屏滚动抽奖,异步落库并邮件通知中奖者,支持名单查询与分享,聚焦中小规模线下活动场景。
本文系统介绍了Java中的Set接口及其实现类,重点分析了TreeSet和HashSet的底层实现机制与区别。TreeSet基于TreeMap实现,使用红黑树结构保证元素有序性,插入/查找时间复杂度为O(logN);HashSet基于哈希表实现,通过哈希函数快速定位元素,平均时间复杂度为O(1)。文章深入探讨了哈希表原理,包括哈希函数设计、冲突解决方法(开放定址法和链地址法),并通过代码示例实现了
本文档为「企悦抽」V1.0 PRS,定义Spring Boot技术栈、数据表及枚举规格,详述管理员配置、异步MQ抽奖落库、邮件通知全流程,规定缓存策略、状态机扭转、安全加密与异常容灾标准,直接指导研发与测试实施。
本文主要探讨了Java中String类的字符串常量池机制和HashMap的源码实现。在字符串常量池部分,分析了字面量赋值和new String()的区别,指出字面量会复用常量池对象,而new会创建新对象;介绍了intern()方法的作用及其在不同JDK版本中的差异。在HashMap源码分析部分,详细解读了关键常量定义、节点结构、构造函数以及核心的putVal方法实现,包括哈希计算、扩容机制、链表树
本文为“企悦抽”抽奖系统设计数据库,包含用户、活动、奖品等6张核心表,通过中间表实现多对多关联,并采用冗余字段优化查询。脚本使用utf8mb4字符集、InnoDB引擎,完整支持活动管理与抽奖流程,为后续开发奠定坚实基础。
本期正式进入项目实战,完成环境搭建与工程分层,自定义了分层错误码及对应的ControllerException和ServiceException,并封装统一返回结果CommonResult,为后续业务开发奠定规范基础。
本文详细介绍了Java中二叉搜索树和Map结构的实现与应用。主要内容包括二叉搜索树实现,Map接口及其实现类TreeMap,底层结构(红黑树vs哈希表),使用建议。文章通过代码示例详细讲解了二叉搜索树和TreeMap的实现原理及使用方法,为理解Java集合框架中的搜索结构提供了实践指导。
最后看一下表上的索引清单。最终清单里有三条:联合索引,订单号唯一索引,主键索引。前面实验过的user_id单列索引没有留在最终清单里。这个结果也说明,索引不是按字段逐个堆上去。订单号唯一索引服务订单详情查询,主键索引服务主键访问,联合索引服务这个订单列表场景。至于单列user_id索引,要看系统里有没有其他只按用户过滤、不按状态和时间排序的查询。如果没有,它很可能被联合索引覆盖掉,保留反而增加写入
AI 编程工具正在重塑我们的工作方式,但从"个人尝鲜"到"团队落地"之间,隔着一道巨大的鸿沟。本文基于真实的团队推广经验,系统梳理了 AI 编程落地的四个阶段、五大杀手场景、Prompt 工程方法论、常见踩坑与解法,以及不同岗位的最佳实践。文章包含大量真实案例和可复制模板,适合正在或准备在团队中推广 AI 编程的技术管理者、一线开发者和运维人员阅读。那个下午,同事的一句话让我决定写这篇文章。那天下