自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第十六届蓝桥杯复盘

第十六届蓝桥杯题解

2025-05-19 22:24:48 1420 1

原创 启发式算法-模拟退火算法

模拟退火算法是一种基于概率的启发式优化算法,用于解决大规模组合优化问题,其灵感来源于金属退火过程中的物理现象。其基本原理是从一个初始解开始,然后在当前解的邻域内随机生成一个新解,如果新解的目标函数值优于当前解,那么就将新解作为当前解,如果新解的目标函数值比当前解差,那么以一定的概率选择新解,这个概率随着算法的进行而逐渐降低,类似于退火过程中温度逐渐降低,物质逐渐趋于稳定状态,通过这种方式算法可以在一定程度上避免陷入局部最优解,搜索到全局最优解。

2025-05-06 23:56:10 1161

原创 启发式算法-禁忌搜索算法

禁忌搜索是一种可以用于解决组合优化问题的启发式算法,通过引入记忆机制跳出局部最优,避免重复搜索。该算法从一个初始解开始,通过邻域搜索策略来寻找当前解的邻域解,并在邻域解中选择一个最优解作为下一次迭代的当前解,为了避免算法陷入局部最优,引入禁忌表来记录已经访问过的操作,禁止算法在一定迭代次数内再次选择这些被禁忌的操作,另外算法可以设置一些特赦条件,使得被禁忌的操作可以解除禁忌,从而探索更优的解空间。

2025-05-05 22:37:38 633

原创 启发式算法-遗传算法

遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法,通过模拟生物进化过程,在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体,每个染色体代表一个候选解,通过模拟生物进化中的选择、交叉、变异等操作,将适应度高的染色体保留并繁殖,同时引入新的基因多样性,逐代优化种群,最终逼近最优解。

2025-05-04 22:44:11 350

原创 启发式算法-蚁群算法

蚁群算法是模拟蚂蚁觅食行为的仿生优化算法,原理是信息素的正反馈机制,蚂蚁通过释放信息素来引导同伴找到最短路径。把问题的元素抽象为多条路径,每次迭代时为每只蚂蚁构建一个解决方案,该解决方案对应一条完整的路径,每次迭代后对所有路径上的信息素按一定比例模拟自然蒸发,避免局部最优,然后找出当前的最优路径进行信息素增强,在之后的迭代中蚂蚁就会倾向于选择信息素浓度高的路径,经过多次迭代后,找出全局的最优路径。该算法通常用于解决旅行商等NP难问题,算法性能依赖参数,有一定的玄学。

2025-05-03 23:54:59 576

原创 kubernetes(三)

Pod是k8s中最小的可部署和可管理的计算单元,每个Pod中包含一个或者多个容器,这些容器能够划分为两类:一类是用户程序的容器,其数量不固定,可根据实际需求进行调整,另一类则是Pause容器,它是每个Pod中存在的根容器,Pause容器主要有两个作用

2025-02-05 01:27:23 985 1

原创 kubernetes(二)

在Kubernetes系统中,Namespace是一种至关重要的资源类型,其主要功能在于实现多套环境的资源隔离或者多租户的资源隔离,默认情况下所有的Pod都能够相互访问,但如果不想让两个Pod之间存在互相访问,就可以把这两个Pod分别划分到不同的Namespace当中,Kubernetes可以把集群内部的资源分配至不同的Namespace,在逻辑上构建出一个个组,从而能够对不同组的资源进行隔离式的使用和管理。

2025-02-03 23:33:49 1387

原创 Kubernetes(一)

Kubernetes(简称K8s)是一个开源的容器编排平台,已经成为现代云原生应用的核心技术,主要应用于对容器化应用程序的自动化部署、扩展以及管理。k8s配备了一组核心组件以及一系列功能,这些组件能够实现容器的调度、负载均衡、服务发现以及故障恢复等功能。

2025-01-29 00:29:51 1027

原创 JWT令牌

JSON Web Token,简称JWT,是一种开放标准,以JSON对象为载体,用于在通信双方之间安全地传输信息,通常被用于身份验证和授权认证。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

2025-01-24 01:10:51 1094

原创 prometheus&grafana实现监控告警

Prometheus负责集群数据的监控和采集,然后传递给grafana进行可视化,集成睿象云可实现监控报警,为了方便操作,可以通过iframe嵌套grafana到指定的页面。

2024-12-07 22:00:22 1654

原创 Netty进阶

Netty中的黏包与半包问题是由于TCP协议本身的特性导致的。在TCP协议中,数据是以字节流的形式进行传输的,没有明确的消息边界,因此在使用Netty进行网络编程时,可能会遇到黏包和半包问题。在 基于Netty的RPC框架 中已经实现了自定义消息协议的设计与解析,协议要素主要包含以下成分。

2024-11-17 14:40:16 1252

原创 Flink算子

flink算子,包含以下类别:map,filter,flatMap,keyBy,aggregations,reduce,物理分区算子,富函数,分流算子split和side output,合流算子union(联合)和connect(连接)。

2024-11-14 00:10:29 1304

原创 Hadoop(YARN)

YARN是Hadoop集群的资源管理和调度系统,它负责为各种分布式计算任务分配和管理资源,包含以下组件:ResourceManager,NodeManager,ApplicationMaster, Container。

2024-11-12 01:08:29 1900

原创 Netty入门二

Netty的核心组件包括以下几种:EventLoop,Channel,Future 与 Promise,Handler与Pipeline,ByteBuf等。

2024-11-10 12:10:04 1057

原创 Hadoop(HDFS)

Hadoop是一个开源的分布式系统架构,旨在解决海量数据的存储和计算问题,Hadoop的核心组件包括Hadoop分布式文件系统(HDFS)、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。

2024-11-09 00:12:28 1512

原创 Netty入门一

Netty 是一个高性能、基于事件驱动的网络编程框架,它基于 NIO模型,并提供了更加高级的功能,使得网络编程变得更加容易。

2024-11-06 00:43:00 1068

原创 Flink消费Kafka实时写入Doris

通过FileBeat采集日志信息到Kafka,再通过Flink消费Kafka实时写入Doris。

2024-10-15 02:18:19 3737 2

原创 Spring源码二IOC容器源码

ApplicationContext 是 Spring 的核心接口,表示 Spring 的 IOC 容器,以下三个类是ApplicationContext 接口的常用实现类:ClassPathXmlApplicationContext,AnnotationConfigApplicationContext,FileSystemXmlApplicationContext。

2024-10-08 00:50:20 1238

原创 ReentrantLock 实现原理

在Java中,synchronized 和 ReentrantLock 都是用于确保线程同步的锁,都属于`可重入锁。`ReentrantLock 相对于 synchronized 具有以下特点:`等待可中断,可以设置超时时间,可以设置为公平锁,支持多个条件变量。

2024-10-06 19:04:35 1482

原创 (Kafka源码五)Kafka服务端处理消息

Kafka 服务端(Broker)采用 Reactor 的架构思想,通过1 个 Acceptor,N 个 Processor(N默认为3),M 个 KafkaRequestHandler(M默认为8),来处理客户端请求,这种模式结合了多线程和事件驱动的设计,优点是能够有效地利用系统资源,可以实现高效地处理请求,无需为每个连接或请求创建新的线程,减少了线程上下文切换的开销,以实现高并发和高吞吐量。

2024-10-01 15:57:47 2134 2

原创 Flink CDC实时同步MySQL到Doris

Apache Flink CDC(Change Data Capture)是一个用于捕获和跟踪数据库更改的技术,它能够实时地从数据库中获取数据变更,并将这些变更流式传输到其他系统进行处理和分析。Flink CDC 提供了对多种数据库的支持,包括 MySQL、Doris、MongoDB 等,Flink CDC 在大数据中主要用于实时数据同步、实时数据分析、实时监控和告警、日志和审计记录、流式ETL、实时事件处理等方面。

2024-09-28 14:47:19 3228

原创 Dubbo SPI源码

Dubbo 的 SPI(Service Provider Interface)机制是一种强大的扩展机制,它允许开发者在运行时动态地替换或增加框架的功能。Dubbo 的 SPI 机制与 Java 原生的 SPI 机制有所不同,它提供了更多的灵活性和功能。

2024-09-15 20:42:57 1243

原创 Java SPI机制源码

Java的SPI(Service Provider Interface)机制允许第三方为应用程序提供插件式的扩展,而不需要修改应用程序本身的代码,从而实现了解耦。Java标准库本身就提供了SPI机制,通常是通过在META-INF/services目录下放置文件来实现的。SPI机制的核心组件包括:服务接口:这是一个Java接口,定义了服务提供者需要实现的方法,应用程序将使用这个接口与具体的服务实现进行交互。服务实现:这是实现了服务接口的具体类,第三方可以为服务接口提供多个实现。

2024-09-04 22:12:31 927

原创 LRU缓存

LRU缓存,LRU缓存(Least Recently Used,最近最少使用)是一种数据缓存机制,旨在解决计算机内存中数据的替换问题。当缓存空间不足时,LRU缓存会淘汰最近最久未被使用的数据,以确保缓存中始终存储着最新和最频繁使用的数据。

2024-08-24 23:38:15 362

原创 基于Netty的RPC框架

基于Netty的RPC框架,RPC远程过程调用(Remote Procedure Call)是一种通信协议,它允许程序调用位于不同地址空间(通常是网络上的另一台机器)的方法,而无需程序员显式编码这个远程调用的细节。这种技术隐藏了底层的通讯细节,使得调用远程服务就像调用本地函数一样简单。

2024-08-24 23:34:57 1470

原创 python通过Gurobi求解线性规划

Gurobi是一款强大的商业数学规划求解器,用于解决线性规划(LP)、整数规划(IP)、混合整数规划(MIP)、二次规划(QP)、非线性规划(NLP)等各种优化问题。它具有高效的求解算法、丰富的功能和友好的用户界面,被广泛应用于学术界和工业界。Gurobi采用了最先进的优化算法和技术,具有出色的求解速度和效率。它能够处理大规模、复杂的数学规划问题,并在较短的时间内找到最优解或接近最优解。Gurobi中Model.addVar()用到的变量类型 vtype主要有以下三种。

2024-04-28 23:08:16 2469

原创 BIO、NIO与AIO

I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:**BIO、NIO、AIO** 1 每当接收到一个Socket连接就会创建一个新的线程,线程的竞争以及上下文切换会影响性能;2 每个线程都会占用栈空间和CPU资源;3 并不是每个socket都进行IO操作,无意义的线程处理(即使客户端没有消息,服务端的线程也会阻塞等待);

2024-04-27 22:35:00 1512 1

原创 Mysql主从复制实战(1主3从)

MySQL主从复制是一种数据库复制技术,它允许一个MySQL数据库服务器将数据更新操作(增删改)自动复制到一个或多个其他从数据库服务器。这种技术可以提高数据库的可用性、扩展性和性能。

2024-04-04 23:50:56 1284 1

原创 ThreadLocal源码

ThreadLocal用来解决多线程的并发问题,ThreadLocal是线程局部变量,它的作用是为每一个使用变量的线程都提供一个变量值的副本,使得每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突,从线程的角度看,就好像每一个线程都完全拥有该变量,从而达到了线程隔离的效果。

2024-03-20 21:53:36 688 1

原创 (Kafka源码四)生产者发送消息到broker

本文主要从源码角度讲解了消息的发送条件,生产者对broker发送回来的响应处理,生产者对于超时/异常/长时间未处理的消息批次是怎么处理的,以及kafka对于粘包拆包问题的解决方法。下章将从源码角度分析服务端的整体架构。

2024-03-17 21:30:47 1485 1

原创 (Kafka源码三)Kafka的缓存机制

本文主要讲解了线程添加消息(append()方法源码)到RecordAccumulator的源码流程,以及在添加的过程中所涉及到内存的申请与释放的源码分析,最后介绍了RecordAccumulator通过CopyOnWriteMap实现的batches,从而实现了读写分离与高并发读的能力。下一章将从源码角度详细介绍Broker是如何处理生产者发送过来的消息。

2024-03-15 21:48:05 1593 1

原创 Spring源码一代理模式

Cglib动态代理会根据被代理类的信息以及设置的回调对象动态的生成代理类,可以看出代理类继承了目标类,当调用代理类的目标方法时,会根据是否设置了回调对象执行不同的操作,若设置了回调,则会调用methodInterceptor接口的实现类中的intercept方法,然后在该方法里面通过invokeSuper()方法调用目标类的pay()方法,若没有设置回调,则直接调用父类,也就是目标类的pay()方法。如果接口增加一个方法,静态代理模式除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。

2024-03-04 23:09:32 928 1

原创 Leetcode第 385 场周赛

这题主要进行模拟即可,先记录8个方向的信息,使用哈希表存储每个质数的出现次数,首先遍历图中的每一个坐标分别从8个方向进行延伸,同时更新最新值num并判断该值是否是质数,若哈希表中已存在该数,说明该数是质数,不需要在再判断是否是质数,最后比较哈希表中出现次数最大并且最大的质数,返回该质数。:这题还是前缀树的应用,先将数组1中的每个元素添加到前缀树中,再遍历字符串2中的每个元素,查找前缀树中每个元素的前缀长度并记录最大长度,最后返回最大长度。:这题和第一题的解法一样,区别在于数据范围变大了。

2024-02-29 20:25:03 290

原创 排序算法总结

冒泡排序优缺点:优点:比较简单,空间复杂度较低,是稳定的;缺点:时间复杂度太高,效率慢;选择排序优缺点:优点:一轮比较只需要换一次位置;缺点:效率慢,不稳定(举个例子6,8,6,2, 9 第一遍选择元素2和第一个6交换,那么原序列中2个6的相对位置前后顺序就破坏了)。

2024-02-28 22:43:37 447

原创 二叉树的遍历(递归与非递归)

中,需要达到"左右根"的顺序,所以使用两个栈,栈2只存储访问的节点,根据先序遍历的思想修改顺序"根右左",先访问当前节点,然后依次压入左儿子和右儿子,最后输出栈2;中,若当前节点不为空,就压栈,当前节点指向左儿子,若为空且栈不为空,就弹栈,当前节点指向右儿子.中,根据"根左右"的访问顺序不同,先访问当前数据,然后依次压入右儿子和左子;非递归遍历二叉树是使用栈压栈和弹栈时机不同的思想,在。

2024-02-27 23:05:14 156

原创 Leetcode第 124 场双周赛

搜索的终止条件是数组元素个数小于2个,搜索的情况也是分为三种,与上面三种情况一样。:首先进行排序,然后使用哈希表存储遍历数组元素的值,当将f[i]加1时,f[i+1]的状态为f[i]+1,当f[i]的值不变时,f[i]的状态为f[i-1]+1,最后取value的最大值即为最多可以选出的元素数目。:可以知道最后一次操作之前的字符肯定是出现次数最多的字母,所以可以使用哈希表存储每个字母的出现次数,找出出现次数最大的值记为mx,然后从后往前遍历找出出现次数为mx的字母添加到结果集合中,最后返回翻转的结果集合。

2024-02-27 22:33:28 412

原创 区间查询算法

二维前缀和的思想和与一维前缀和类似,二维前缀和指的是矩阵从左上角到当前位置的总和,通过二维前缀和可以在O(1)的时间复杂度查询任意一个子矩阵的总和。:二维差分数组与一维差分类似,可以实现O(1)时间复杂度对任意的子矩阵中所有元素进行相同的修改。应用场景:一维差分数组适用于多次区间修改,区间查询次数不多的场景。应用场景:线段树适用于多次区间修改与区间查询的场景。应用场景:树状数组适用于单点修改,区间查询的场景。应用场景:主席树适用于查询区间第k小的场景。应用场景:暴力法适用于数据量比较小的场景。

2024-02-02 03:20:06 228

原创 (Kafka源码二)Kafka的元数据

本文详细介绍了producer是如何通过sender线程从broker集群中拉取到元数据,在拉取的过程中是如何建立网络连接的,以及如何发送消息请求给broker和处理broker发送回来的响应。主要流程就是通过第一次调用poll()方法的步骤一先是往selector上注册OP_CONNECT。

2024-02-02 03:16:40 1026

原创 (Kafka源码一)生产者初始化及分区策略

本文主要讲解了生产者初始化时的一些配置属性,以及消息的3种分配策略,分别是自定义分区,随机指定分区,通过key的hash指定分区三种,还介绍了RecordAccumulator是如何存储消息的,最后分析了sender线程的初始化以及代码的运行流程。下一篇将详细介绍sender线程是如何建立网络连接,发送消息以及处理响应。

2024-01-30 01:38:19 913 1

原创 Leetcode第376场周赛

采用前缀和+滑动窗口的思想,首先进行前缀和预处理,然后枚举右端点,统计左端点到右端点的频率分数,若代价大于k则缩小窗口,左端点向右移动,当条件满足时,更新最大值。:直接排序,每组有3个元素,判断每组最后一个元素与第一个元素之差是否大于k,若大于就返回空数组,否则就加入答案数组中。:首先生成1-1e9范围内的回文数,然后二分查找最靠近中位数的回文数,然后统计最小代价即可。:哈希模拟,统计所有数字出现的次数,找出出现次数分别为2和0的数字。

2023-12-17 23:35:01 71 1

空空如也

空空如也

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

TA关注的人

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