自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL基础教程:数据库和表的操作

本文提供了MySQL基础操作指南,包含数据库和表的基本管理方法。主要内容包括:数据库登录、查看/创建/切换/删除数据库;表的创建、数据插入/查询/删除、表结构修改等常用操作。所有示例以实际操作为核心,省略复杂原理,适合初学者快速上手。文中特别强调SQL语句必须以分号结尾,并详细说明了各命令的参数使用。

2025-10-01 16:51:44 446

原创 C++异步编程

本文介绍了C++中的异步编程机制,重点解析了并发与并行的核心区别(逻辑同时vs物理同时)。详细讲解了std::future/std::async的异步结果获取机制,演示了std::promise的线程间值传递,以及std::shared_future的共享结果特性。还说明了std::packaged_task对可调用对象的封装方法。通过多个代码示例,展示了这些工具在异步任务启动、结果获取和线程间通信中的具体应用场景及实现方式。

2025-09-30 14:59:06 656

原创 Redis缓存

本文系统介绍了Redis缓存技术的核心原理与应用实践。首先从缓存概念入手,通过生活实例类比解释缓存本质;然后详细分析Redis的两种缓存更新策略(定期更新和实时更新)及其工作流程;重点探讨了Redis的过期策略(惰性删除+定期删除)和8种内存淘汰策略;最后针对缓存穿透、击穿、雪崩等典型问题提出了布隆过滤器、互斥锁、错峰过期等解决方案,并强调数据库与缓存一致性保障的关键在于"先更库再删缓存"。文章为高并发系统设计提供了全面的Redis缓存优化思路。

2025-09-29 22:38:01 640

原创 Redis集群模式

Redis集群模式通过哈希槽分区算法实现数据分布,解决了主从复制的单点写入瓶颈问题。该算法预设16384个哈希槽,平均分配给多个主节点,避免了传统哈希求余扩容时的数据大量迁移问题,同时比一致性哈希算法更均衡。集群采用心跳检测和投票机制实现自动故障转移,当主节点故障时,从节点通过选举晋升为新主节点。集群具有水平扩展、高可用等优势,但也存在不支持跨槽操作、异步复制导致数据不一致等局限。相比单节点或主从模式,集群模式需要更多资源但能更好地支持高并发场景。

2025-09-28 21:20:21 766

原创 Redis哨兵模式

摘要: Redis哨兵模式通过独立进程监控主从节点,实现自动故障转移,提升系统高可用性。其核心机制包括主观下线判定、客观下线投票、领头哨兵选举及从节点晋升流程。优点在于自动容灾、易用兼容;缺点包含写单点瓶颈、数据一致性风险及转移延迟。哨兵模式有效解决了主从复制的手动切换痛点,但需权衡其复杂度与性能局限。适用于对自动容灾有强需求的Redis主从架构场景。

2025-09-27 22:53:03 581 1

原创 Redis主从模式

本文详细介绍了Redis主从模式(Master-Slave Replication)的原理与实践。主要内容包括:1)通过"一主两从"架构演示配置过程和数据同步;2)主从模式的核心作用是提高系统可用性和并发能力;3)数据同步原理分为全量复制和增量复制两种方式,并详细说明其工作流程;4)分析了主从模式的优缺点,指出其在读多写少场景下的优势,以及存在主节点单点故障等问题。最后提到哨兵模式可解决自动故障转移问题,为后续内容做铺垫。文章从实践到理论全面解析了Redis主从复制机制。

2025-09-27 00:58:03 946

原创 Redis持久化:RDB和AOF

Redis作为高性能内存数据库,其持久化机制是保障数据可靠性的关键。本文详细解析了RDB和AOF两种持久化方式:RDB通过定时全量快照实现高效备份,但存在数据丢失风险;AOF则以追加日志方式提供更细粒度的数据保护,但文件体积较大。文章深入探讨了两种机制的工作原理、触发条件、执行流程及优缺点对比,特别分析了RDB的fork开销和AOF的刷盘策略对性能的影响。通过实际配置演示和故障模拟,验证了持久化机制的数据恢复能力,为Redis使用者提供了全面的技术参考。

2025-09-25 18:21:42 845

原创 哈希表深度解析

摘要:哈希表通过哈希函数将键(Key)映射到数组索引实现高效查找,时间复杂度接近O(1)。文章解析了哈希表的核心原理:哈希函数计算"门牌号"、两种冲突解决方法(开放定址法和链地址法),以及动态扩容机制。重点探讨了线性探测和二次探测的优劣,分析链地址法中头插法的优势,并解释了负载因子对性能的影响。理解这些底层机制有助于优化哈希表使用,解决查找性能问题。

2025-09-17 13:02:17 783 1

原创 设计模式:单例模式

本文介绍了单例模式的概念、实现方式及其应用场景。单例模式确保一个类只有一个实例,并提供全局访问点,适用于负载均衡器等需要全局唯一实例的场景。文章详细阐述了单例模式的结构和两种实现方式:饿汉式(类加载时创建实例)和懒汉式(延迟加载),并分析了各自优缺点及线程安全问题。单例模式的优点包括全局唯一性、节省资源等,但也存在扩展性差、耦合度高等缺点。最后指出单例模式适用于需要唯一实例对象的场景,是结构最简单的设计模式之一。

2025-09-14 21:33:53 1180

原创 设计模式:策略模式

本文介绍了使用策略模式优化影院售票系统中电影票折扣计算的方法。原系统直接将不同用户类型的折扣算法硬编码在MovieTicket类中,违反了开闭原则且耦合度高。通过引入AbstractDiscount抽象类和具体折扣子类(如StudentDiscount、VipDiscount等),将折扣算法封装为独立策略。优化后的MovieTicket类通过组合方式调用折扣策略,实现了算法与业务逻辑的解耦。策略模式的优点包括支持扩展不修改、降低耦合度,但也存在客户端需了解所有策略类、增加类数量的缺点。

2025-09-14 12:36:11 1178

原创 Linux线程:基于环形队列的生产消费模型

本文介绍了使用POSIX信号量实现线程同步的方法,重点讲解了其在环形队列中的应用。文章首先对比了条件变量和信号量的线程同步机制,指出信号量通过计数器实现资源管理。随后详细说明了POSIX信号量的初始化、销毁、等待、释放等基本操作。最后通过一个环形队列的代码实例,展示了如何利用信号量解决假溢出问题,其中使用两个信号量分别控制空间和数据的可用性,配合互斥锁实现生产者和消费者的同步访问。

2025-09-13 13:59:15 880

原创 Linux线程同步与互斥

本文介绍了线程同步与互斥的关键机制,重点讲解了互斥锁和条件变量的使用方法。通过生产者-消费者模型示例,展示了如何利用阻塞队列实现多线程并发控制。文章详细说明了互斥锁的初始化、加锁、解锁和销毁操作,以及条件变量的等待和唤醒机制。最后给出了一个基于C++的阻塞队列实现代码,该实现使用互斥锁保护共享队列,并通过条件变量协调生产者和消费者线程的同步操作,有效解决了多线程环境下的资源共享问题。

2025-09-12 19:32:31 805

原创 Linux线程

本文介绍了线程的基本概念和操作,通过对比进程与线程的特点,阐述了引入线程的必要性。文章详细讲解了pthread库中创建线程、线程退出、等待和分离等核心函数的使用方法,并通过一个综合编程题演示了线程的实际应用:主线程创建两个子线程,实现线程间等待和资源回收。线程相比进程具有创建开销小、切换效率高、利于多核利用等优势,但也存在健壮性降低和编程复杂度增加的问题。文末的代码示例展示了如何实现题目要求的线程同步操作,为读者提供了线程编程的实践参考。

2025-09-11 17:40:10 1245

原创 Linux进程死锁

本文通过生动案例和代码示例详细讲解了操作系统中的死锁问题。首先以朋友借钱为例形象说明死锁概念,并指出死锁产生的四个必要条件:互斥、请求与保持、不可剥夺和循环等待。接着分析哲学家就餐和违反锁顺序两个经典死锁案例。针对死锁处理,提出四种策略:破坏互斥条件、破坏请求与保持条件、破坏不可剥夺条件和破坏循环等待条件。重点介绍了资源排序策略和银行家算法,通过安全序列确保系统处于安全状态来避免死锁。全文以通俗易懂的方式系统阐述了死锁原理及解决方案。

2025-09-05 21:10:58 675

原创 Linux内核O(1)调度算法

本文探讨了Linux2.6系统中普通进程的调度机制。操作系统通过快速切换进程创建多程序同时运行的假象,关键在于调度策略和时间片分配。理想的调度策略需兼顾公平性和吞吐量,而时间片长短直接影响系统响应和切换开销。进程分为I/O消耗型和CPU消耗型,通过静态和动态优先级调整实现调度优化。动态优先级基于进程等待时间、运行时间和类型动态调整,而静态优先级决定时间片长度。Linux采用O(1)调度算法,使用活动/过期队列和优先级位图快速选择进程,通过交换指针实现高效队列切换。这种机制确保了交互性进程的快速响应,同时兼顾

2025-09-02 23:44:20 664

原创 设计模式:建造者模式

本文介绍了建造者设计模式(Builder Pattern),通过汽车制造案例阐释其核心思想。建造者模式将复杂对象的构建过程与表示分离,包括产品类、抽象建造者、具体建造者和指挥者四个角色。文中提供了C++代码示例,展示如何构建不同品牌和颜色的汽车。该模式优点在于解耦产品创建过程、便于扩展建造者,但缺点是不适合差异大的产品且可能导致类膨胀。文章最后用电影制作比喻生动说明了建造者模式的工作原理,强调其对复杂对象构建过程的封装优势。

2025-09-01 22:41:54 919

原创 进程间通信:SystemV信号量

本文介绍了使用System V信号量实现进程间通信的方法。信号量通过计数器机制控制多进程对共享资源的访问,主要操作包括P(wait)和V(signal)。文章详细讲解了信号量核心概念(如信号量集)、常用API(semget、semctl、semop)及其参数,并提供了一个生产者-消费者模式的完整代码示例,展示了如何结合共享内存实现进程同步。最后强调System V信号量是内核持久的,需显式删除以防资源泄漏。该机制能有效解决多进程环境下的同步与互斥问题。

2025-09-01 00:11:28 1114

原创 进程间通信:共享内存

本文介绍了进程间通信(IPC)中的共享内存机制。共享内存通过映射相同物理内存到不同进程的虚拟地址空间,实现高效通信。文章详细讲解了shmget、shmat、shmdt和shmctl等关键系统调用接口,并提供了C++封装的共享内存类实现示例,演示了生产者-消费者模型的应用。共享内存的优势在于性能最优(无需数据拷贝),但存在数据同步问题。文章指出共享内存体现了"消除中间层释放硬件性能"的系统设计理念,是进程间通信的重要方式。

2025-08-28 02:02:16 863

原创 设计模式:责任链模式

摘要:责任链模式通过将请求发送者与接收者解耦,使多个对象能依次处理请求。文章以请假审批为例,说明该模式的应用场景,区分纯(单处理器处理)与不纯(多处理器协作)两种实现方式,并通过文本处理(去除空格+转大写)的代码示例展示具体实现。分析其优点(灵活扩展、符合开闭原则)与缺点(可能遗漏处理、性能损耗),最终强调该模式在流水线式请求处理中的价值。全文约150字。

2025-08-25 01:11:16 643

原创 进程间通信:消息队列

本文介绍了进程间通信(IPC)中的消息队列实现方式。消息队列是一种先进先出(FIFO)的内核持久化通信机制,支持异步通信和选择性接收。文章详细讲解了SystemV消息队列的四个核心接口:msgget(创建/获取)、msgsnd(发送)、msgrcv(接收)和msgctl(控制管理)。通过server和client的示例代码演示了消息队列的实际应用:server创建消息队列并发送消息,client接收消息并在退出时删除队列。消息队列适用于需要解耦生产者和消费者的场景,能有效实现进程间的异步通信。

2025-08-16 17:15:29 733

原创 进程间通信:管道

本文介绍了进程间通信(IPC)中的管道技术,重点分析了匿名管道和命名管道的特性与实现方法。匿名管道仅适用于父子进程通信,具有半双工特性;命名管道通过文件系统实现,支持不相关进程间的通信。文章详细说明了两种管道的创建方式、通信机制及代码示例,并指出命名管道的阻塞特性可确保数据同步传输。通过对比两种管道的应用场景,展示了管道技术在进程通信中的实用价值。

2025-08-13 14:51:40 755

原创 解析进程:从原理到实践

本文介绍了进程的概念、本质及管理方法。进程是程序的执行实例,每个进程拥有独立的内存和资源。操作系统通过进程控制块(PCB/task_struct)管理进程。文章详细讲解了进程创建(fork)、状态(R/S/D/T/Z)、优先级(PRI/NI)以及进程切换等内容。特别分析了僵尸进程和孤儿进程的产生与解决方案。最后阐述了进程存在的意义,包括并发执行、资源隔离、权限控制等。通过系统调用和内核机制,进程实现了程序的高效运行和系统资源的合理分配。

2025-08-12 03:18:51 843

原创 一二维前缀和/差分详解

高效处理数组与矩阵的区间操作,本质是空间与时间的战略置换!从一维到二维逐级递进,详细阐述每一种类型。

2025-06-08 00:24:59 663

原创 页表:从虚拟地址到物理地址的转换

当程序尝试访问的页面不在物理内存中时,就会触发缺页中断。进程从用户态切换到内核态,将缺页中断交给操作系统处理,将所需的页面从磁盘调入内存。当缺页中断处理返回时,系统重新启动导致缺页中断的指令,该命令重新发出导致缺页中断的虚拟地址,然而这时,所需的页面已经存在于内存中了,程序就可以继续正常执行了。

2025-05-25 23:36:08 833

原创 【笔试强训day39】

本文摘要了三道算法题解:1. 统计字符串中出现频率最高的字母(使用哈希表);2. 基于字符频率构建哈夫曼编码求最短编码长度(优先队列);3. 用完全平方数凑整数的动态规划解法(空间优化版)。三道题分别考察了基础统计、贪心算法和动态规划的应用,代码实现简洁高效。

2025-05-24 09:37:10 800

原创 【笔试强训day38】

文章摘要:本文介绍了三个算法题目及其解决方案。第一题“天使果冻”要求在前x个果冻中找出美味度第二大的果冻,通过维护最大值和次大值数组实现快速查询。第二题“dd爱旋转”涉及矩阵的180度旋转和行镜像操作,通过统计操作次数并应用行镜像和列镜像来实现。第三题“小红取数”要求在数组中选择一些数,使其和尽可能大且为k的倍数,使用动态规划方法解决,通过状态转移方程计算最大和。每个题目都提供了详细的解题思路和代码实现。

2025-05-22 23:12:33 1106

原创 【笔试强训day37】

本文介绍了三个算法问题的解决方案。第一题是旋转字符串,通过将字符串A倍增并在其中查找字符串B来判断是否可以通过旋转得到B,时间复杂度为O(n)。第二题是合并k个已排序的链表,使用小堆(优先队列)将所有链表的头节点放入堆中,依次取出最小节点并合并,时间复杂度为O(nlogn)。第三题是滑雪问题,通过记忆化搜索计算矩阵中最长的递减路径,避免重复计算,时间复杂度为O(nm)。每个问题都提供了详细的解题思路和代码实现。

2025-05-20 22:25:22 914

原创 HTTPS核心机制拆解

因为HTTP协议是明文传输的,明文数据会经过路由器、WiFi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,进而导致隐私泄漏。

2025-05-19 19:50:32 1341

原创 智能指针:C++内存管理的现代解决方案

如果要用一句话来定义智能指针的话,就是:智能指针 = 对象化指针 + 自动生命周期管理。智能指针它实际上就是一个封装了原始指针的类模板,然后通过RAII机制来确保内存安全。RAII:核心就是将资源的生命周期与对象的生命周期进行绑定,确保对象在离开作用域时能够自动释放其资源。

2025-05-10 19:29:00 895

原创 【笔试强训day21】

区间两端的字符相同,那么去区间 [ i + 1,j - 1]找到该区间内最长的回文子序列,然后加上两端的那两个字符就得到了[ i , j ] 区间上的最长回文子序列。状态转移方程 ---------> dp [ i ] [ j ] = dp [ i + 1, j - 1] + 2;

2025-04-18 00:16:42 1039

原创 【算法基础】高精度加减乘除法

这里顺带说明一下数组要开多大,也就是下面代码中N要定为多大的值。高精度加减乘除法都是一样的道理。比如高精度加法中,数据大小不超过10^500,那么开501个长度就够用了。个位为10^0,十位为10^1,百位为10^2,长度为三的数组可以表示到999,所以3位长度已经足以表示不超过10^2的数了,进而501个长度也足以表示不超过10^500的数了。当然,我们也可以开大一点,N = 1e6 + 10,这样就绝对完全够用了。

2025-04-17 09:50:05 916

原创 【笔试强训day20】

根据上图,我们可以看到,对于 i 位置,它可以独立成一个子数组,那么它的最大和就是arr[ i ]。当然,i 也可以和前面的结合形成子数组,它可能和前面的一个元素结合,也可能两个三个甚至全部元素结合形成子数组,在那么多的情况中,只取以i - 1位置为结尾的子数组最大和,而这个最大和正好是存放在dp[i - 1]中。所以最大和就是dp[i - 1] + arr[i]。

2025-04-16 11:32:09 872

原创 【笔试强训day19】

双指针。两个指针分别从两端开始向中间靠拢,如果left对应的字符串和right指向的字符串中有相同的字符,那么就有可能组成回文串。反之,则不可能。

2025-04-14 22:46:03 905

原创 【笔试强训day18】

TopK问题。 这道题只需按照订制的排序方法排序,然后取前k个即可。关键在于制定排序方法——如果甜度不相等,甜度高的排在前面;如果甜度相等,对应酸度小的排在前面。然后注意数据范围即可。

2025-04-13 20:22:17 972

原创 【笔试强训day17】

这样,在遍历到(i,j)这个元素的时候,我们直接去存储行之和的数组和存储列之和的数组了拿数据就可以了,减少了很多计算。综上,第一天吃或者第三天吃得到的快乐值最大,但是第三题吃羞耻度会小于第一天吃,所以最终选择第三天吃。通过上面的演示,可以看到这题就是一道固定长度的滑动窗口问题,窗口长度为k(效果持续的天数)。如果第一天吃下,快乐值会持续两天(k = 2),快乐值总和为8(第一天获得快乐值为3,第二天获得快乐值为5),羞耻度总和为10.因为1+2+3=6,1+2+4=7,1+3+4=8,2+3+4=9。

2025-04-13 00:36:27 834

原创 【笔试强训day16】

遍历字符串A,遇到%则判断它的后面一个字符是不是s,如果是的话,就替换成arg中的字符。比如字符串A中 i 位置对应的字符是%,那么在确保 i + 1不越界的情况下去检查 i + 1位置的字符是否为s,如果是的话, 就把arg中对应的字符拿过来替换,然后指针指向arg的下一个位置。给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。14本身不是质数,但是14可以组合出41,是质数,所以14是神奇数。

2025-04-11 21:38:03 829

原创 【C++取经之路】lambda和bind

引用一位大佬的一句话——“Use lambdas if you can, and std::bind  if you must.”这句话出自 Scott Meyers 的经典著作《Effective Modern C++》,书中明确指出:与 std::bind相比,lambda几乎在所有方面更优越。

2025-04-11 15:30:29 1533

原创 【笔试强训day15】

dd当上了宣传委员,开始组织迎新晚会,已知班里有n个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好m组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望人数最多的小组的人尽可能少,除此之外,对组内人员分配没有其他要求,她希望你告诉她,这个值是多少,如果无法顺利安排,请输出-1。问题是,枚举到哪,也就是枚举的上限是多少?

2025-04-11 01:50:59 647

原创 【笔试强训day14】

预处理用做的就是:统计数组中每个数字的总和,存放进一个hash数组中,由题意,选中一个数以后,该数+1和-1的数就不能再选,在hash数组中的表现就是,选中一个数后,它的相邻位置就不能再选了(类似于打家劫舍问题,不知道也没关系)。如果选择 i 位置的值,那么前面i - 1位置就不能选,就是f [ i ] 的最大值就是i对应的和+不选i - 1位置的最大分数,而不选 i - 1的最大分数就是存在g[i - 1]中,故得到f[i]的状态表示。圈起来的数就是我们取到的最大的水平值。把取出的这些数加起来就是答案。

2025-04-10 00:23:16 1077

原创 【笔试强训day13】

题目描述:来源:牛客网牛牛最近在玩炉石传说,这是一款一对一对战的卡牌游戏,牛牛打算努力冲上钻五分段,获得丰厚的天梯奖励。炉石传说的段位可以用星数来表示,具体规则为:若牛牛本场失败,则扣除一星;若牛牛本场获胜,需要看牛牛是否触发了连胜奖励,若牛牛获得了至少三连胜(即本局对局的上一局和上上局都获胜)则获得kkk星,否则获得一星。现在给出牛牛游玩的nnn场记录,请你判断牛牛最终的星数和初始星数的差。

2025-04-09 00:24:42 1050

空空如也

空空如也

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

TA关注的人

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