自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Practitioner

Thinking in Code

  • 博客(301)
  • 问答 (2)
  • 收藏
  • 关注

原创 Java SE 21 新增特性

该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。该功能首次在 Java SE 17 中预览,在在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。作为本版本的预览功能推出。字符串模板是对 Java 现有字符串字面量和文本块的补充,它将字面文本与嵌入式表达式和模板处理器结合起来,从而产生专门的结果。

2023-09-25 14:12:01 55

原创 算法和数据结构学习中的一些小的工具函数

注:前缀和只适合数组不可变情况下加速求区间和,如果数组可变,则需要使用。区间中任意一个数 X 的概率是 X。

2023-09-05 10:25:36 142

原创 Java SE 20 新增特性

中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。此外,在 Java SE 20 中,移除了对 record 命名模式的支持,在 Java SE 19 中,如下写法是对的。中,Java SE 20 的 record 支持类型推断,例如,定义了如下数据结构。在 Java SE 20 之前,需要这样做。

2023-05-03 20:02:59 559 1

原创 动态开点线段树说明

按顺序遍历这个 arr 数组,最小值 2 被取出,其原始位置是 4,且 4 号位置右侧没有比自己更小的数,接下来在开点线段树中把把 4 号位置的值加1,表示 4 号位置被处理过了,在线段树中查4号位置以后并没有任何标记记录,说明没有比这个数更小的数了,直接设置4号位置的ans值为0。接下来是 1 号位置的 8, 在线段树中,查到右侧有三个标记过的,说明有三个比它小的数,直接在 ans 中把 1 号位置设置为 3, 然后在线段树中把 1 号位置标记为 1 ,说明处理过,此时。

2022-12-28 21:37:51 674 1

原创 LFU 的设计与实现

此时只有出现一次的桶,接下来,如果 key = C 这条记录 被访问过了,所以词频变为2,接下来要把 key = C 这条记录先从词频为1的桶里面取出来,然后再新建一个词频为 2 的桶,把这个 key = C 的数据项挂上去,结果如下。接下来,如果又操作了 key = C 这条记录,那么这条记录的词频就是 3, 又需要新增一个词频为 3 的桶,原来词频为 2 的桶已经没有数据项了,要销毁,并且把词频为 1 的桶和词频为 3 的桶连接在一起。例如,LFU Cache 在初始为空的状态下,进来如下数据。

2022-12-27 21:50:34 350 1

原创 子数组的最大异或和问题

有了 eor 数组以后,对于任意 i 位置,0 到 i 区间的异或和就可以直接获取到了,接下来是枚举数组中任意两个位置 i 和 j 区间的异或和,由于。eor[2] 期待和它符号位一样为0的值,紧着高位(由于前面28都是0,所以不存在和它符号不一样的,只看最后4位,,整个过程比较简单,不赘述,基于这个暴力解法,可以有优化一些的算法,就是利用前缀异或和数组,时间复杂度可以减少到。当确定了 0 ~ i 位置的异或和以后,如何定位 0 ~ j 这个区间,使得 j ~ i 之间的异或和最大。(i > 0),所以。

2022-12-26 21:54:07 487 1

原创 架构设计(九):估算

估算在系统设计中非常重要,这决定了你的设计是否可以满足要求,要实现比较靠谱的估算,就需要对如下几个概念熟练掌握第一个概念:二的幂尽管在处理分布式系统时,数据量可能是巨大的,但计算都可以归结为基础知识。为了获得正确的计算结果,关键是要知道使用2的幂的数据量单位。一个字节是一个8位的序列。一个ASCII字符使用一个字节的内存(8位)。可参考如下表格第二个概念:关于延时指标的常见场景注:以下指标说明来自,虽然是基于2010年的状况,但是目前这些指标还是有一定的参考价值。

2022-12-25 21:18:34 737

原创 字符串解码问题

递归含义表示,str 字符串从 from 开始一直到结尾或者右边括号生成的信息返回,返回值是一个长度为 2 的数组,例如。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。就可以,对于数字,要处理一个简单的边界条件,即数字不一定是单个整数,可能是多位数,比如。这个字符串,递归函数在执行过程中,遇到第一个右括号的时候,就会结算出两个信息,继续,后续没有]了,所以一直到字符串最后,得到最终的结果。输入:s = “2[abc]3[cd]ef”

2022-12-23 21:50:41 215 1

原创 Linux 常用命令总结

将一个目录中的所有HTML文件复制到目标目录,同时确保仅复制那些目标目录中不存在或是比目标目录中同名文件版本更新的文件。本文基于的 Linux 环境是 CentOS 7, 主要是日常使用的一些命令,持续更新中……假设我们下载了一个被分割成好几部分的文件,希望能将其组合还原。可以使用history命令随时查看命令的历史纪录, 假设输出结果中有这样一行。可以看出,从上到下,越来越多的扩展被禁止。189 是历史记录中该命令的编号,通过。单引号,无引号,双引号的效果。可以立即重新执行这个命令。

2022-12-22 22:52:53 493 2

原创 关于阅读书籍的一点点感悟

本文搬运自自己的博客园博客,发布于 2014-10-21

2022-12-21 20:39:35 176

原创 过早的优化是万恶之源

本文搬运自自己的博客园博客,发布于 2014-11-06

2022-12-21 20:38:59 594

原创 记一次返工后记

本文搬运自自己的博客园博客,发布于 2018-11-26。

2022-12-21 20:28:12 620

原创 记一次返工

本文搬运自自己的博客园博客,发布于 2018-05-12。

2022-12-21 20:27:16 662

原创 架构设计(八):数据库的水平扩展和垂直扩展

数据库的扩展有两种方法:垂直扩展和水平扩展。垂直扩展是通过提高现有机器的硬件配置(CPU、硬盘、内存等)来进行扩展。比如,如果使用的是亚马逊的 RDS ,可以得到一个超大内存的数据库服务器,所以在一台数据库服务器,就可以实现存储和处理大量的数据。但是垂直扩展也有一些严重的缺点。虽然可以在数据库服务器上增加更多的 CPU、内存等,但是有硬件的限制,如果用户数量巨大,一台服务器是不够的。单点故障的风险更大。垂直扩展的总体成本很高。如果要配置一个强大的服务器,费用是很高的。垂直扩展的示例图如下。

2022-12-20 20:33:44 1223

原创 架构设计(七):日志、监控和自动化

针对小型网站,日志、监控和自动化支持是很好的做法,但不是必须的。然而,如果网站已经发展到为大型企业服务,日志、监控和自动化工具是必不可少的。日志有助于识别系统中的错误和问题。关于日志,有两种处理方式方式一,在每个单独服务器层面上记录日志;方式二,使用工具将它们汇总到一个集中的服务中,以便于搜索和查看。监控并收集不同类型的指标有助于了解系统的健康状况,一些监控的指标如下主机级指标,例如:CPU、内存、磁盘I/O,等等。汇总级指标:例如,整个数据库层、缓存层等的性能。

2022-12-19 18:42:48 945 1

原创 架构设计(六):引入消息队列

消息队列是一个支持持久化的组件,数据存储在内存中,支持异步通信。它作为一个缓冲器,分配异步请求。消息队列的基本架构很简单,包含两个部分第一部分:输入服务,称为生产者/发布者,创建消息,并将其发布到消息队列中。第二部分:其他服务或服务器,称为消费者/订阅者,连接到队列,并执行消息所定义的动作。消息队列可以实现服务之间的解耦,成为构建可扩展和可靠的应用程序的首选架构。有了消息队列,生产者可以在消费者无法处理消息时将其发布到队列中。即使生产者不可用,消费者也可以从队列中读取消息。

2022-12-18 17:49:55 439

原创 基于 Spring Cloud 的微服务脚手架

作者:本文主要介绍了基于 Spring Cloud Finchley 和 Spring Boot 2.0.x 版本的微服务脚手架的搭建和关键代码说明,参考了。相关组件和版本架构图如下启动方式,按如下顺序启动测试三个请求,需要带上参数,否则会被拦截器拦截提示无权限。返回返回返回核心代码说明上述三个方法在成功调用之前,都需要做鉴权逻辑用户鉴权部分,实现即可,在preHandle中处理鉴权逻辑。

2022-12-18 07:40:37 1259 1

原创 架构设计(五):有状态服务和无状态服务

无状态的服务在横向扩展服务的过程中,将状态(例如用户会话数据)从服务中移出并将会话数据存储在持久性存储介质中,如关系型数据库或 NoSQL。集群中的每个服务都可以从数据库中访问状态数据。这就是所谓的无状态服务。架构如下有状态的服务和无状态服务不一样,有状态的服务从一个请求到下一个请求都会记住客户数据(状态)。而无状态服务器不保留任何状态信息,架构如下上图中,如果使用有状态服务,用户1的状态数据(比如:会话数据和资料图片)都存储在Server 1中。

2022-12-17 17:41:32 1157

原创 架构设计(四):CDN

CDN 全称 Content delivery network ,即:内容分发网络。CDN 是一个地理上分散的服务器网络,主要用于提供静态内容。如:图片、视频、CSS、JavaScript 文件等。还有一种是动态内容缓存,它可以实现基于请求路径、查询字符串、cookies和请求头的HTML页面的缓存。参考。本文主要介绍 CDN 技术当用户访问一个网站时,离用户最近的 CDN 服务器将提供静态内容。也就是说,用户离 CDN 服务器越远,网站的加载速度就越慢。架构如下整个工作流程如下。

2022-12-16 19:51:30 895 1

原创 架构设计(三):引入缓存

缓存是一个临时存储区域,如果请求的数据获取代价比较高或者数据的访问频率比较高,则会把响应结果存储在内存中,以便更快速地提供后续请求。每次加载一个新的网页,都要执行一次或多次数据库调用来获取数据。反复调用数据库会大大影响应用程序的性能。缓存可以缓解这个问题,架构如下在收到一个请求后,网络服务器首先检查缓存是否有可用的响应。如果有它有,它就把数据发回给客户。如果没有,它就查询数据库,将响应存储在缓存,并将其发回给客户端。这种缓存策略被称为"读过式缓存"。根据数据的类型、大小和访问模式,还有其他的缓存策略。

2022-12-15 21:11:45 427 1

原创 架构设计(二):数据库复制

在中提到了数据库类型的选择,针对大数据量,高可用的场景,数据库复制是一种比较好的方式,其中多个数据库实例之间可以是主/从关系。主数据库通常只支持写操作。从数据库从主数据库获得数据的副本,只支持读操作。所有修改数据的命令,如插入、删除或更新,必须发送到主数据库。大多数应用要求的读和写的比例要高得多;因此,系统中的从属数据库的数量通常比主数据库的数量多。以下是主/从数据库架构的示例图。以上架构的优势是更好的性能。在主从模式中,所有的写和更新都发生在主节点;而读操作则分布在从节点上。

2022-12-14 20:54:52 458 1

原创 架构设计(一):从单服务器模式到负载均衡设计

单服务器模型是最简单的一种架构,参考如下图用户访问一个 URL,URL 会先到 DNS 服务器进行域名解析,然后返回给客户端一个 IP 地址,客户端会通过这个 IP 地址访问到真正的服务,服务接收到客户端请求以后,返回对应的 HTML 页面,就完成了整个过程。当然,以上是静态页面,相对复杂的应用会配置数据库,架构如下在选择数据库的时候,会涉及数据库选型问题,有两类比较主流的数据库可以选择,即和。关系型数据库也被称为关系型数据库管理系统(RDBMS),关系型数据库以表和行来表示和存储数据。

2022-12-13 20:22:19 675 1

原创 最大正方形问题

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。表示蓝色区域部分的正方形,基于上述上个位置的值,可以得到。本题思路比较简单,可以定义一个二维数组。,接下来是 base case,第一行和第一列的值很容易可以得到。周围的位置依赖,有如下两种情况。表示的区域是绿色部分的正方形,表示的区域是红色部分的正方形,的规模和原始矩阵的规模一样。有一个很显而易见的结论,如果。变量用于记录全局最大值。考虑普遍位置,如下图。

2022-12-12 18:57:03 371 1

原创 Linux 下的输入输出和重定向示例

Linux 下的输入输出有如下三种形式。Linux 的输入重定向符号是。中只记录了非错误的信息,即。目录不存在,所以执行。

2022-12-11 19:39:32 901 1

原创 Dijkstra 算法说明与实现

注:Dijkstra 算法必须指定一个源点,每个边的权值均为非负数,求这个点到其他所有点的最短距离,到不了则为正无穷, 不能有累加和为负数的环。生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0, 源点到其他所有点的最小距离都为正无穷大。代码说明:本题未采用题目给的二维数组的图结构,而是把二维数组转换成自己熟悉的图结构,再进行dijkstra算法。从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源 点到各个点的最小距离表,不断重复这一步。

2022-12-10 18:10:27 608 1

原创 数组分成两个最接近集合问题

以上暴力递归可以改成动态规划,由于递归函数的可变参数有两个,一个是 i,一个是 rest,且其变化范围是固定的,所以可以定义一个二维数组来存所有的递归过程值,递归含义表示:数组 arr 从 i 开始,一直到最后,随意选取进行累加,得到的最接近 rest 且较小的集合的累加和。其中 p1 表示:不选取 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。表示:选取了 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。,否则选取之后,会得到较大的那个集合的累加和。

2022-12-09 21:47:47 683 1

原创 最大值减去最小值小于或等于 num 的子数组数量问题

达标,则 arr 中内部的任何一个子数组都达标;不达标,则 arr 扩充后肯定也不达标;根据题目意思,我们可以得到如下三个结论。利用滑动窗口算法,我们可以得到。完整代码如下(含对数器)

2022-12-08 16:14:08 615 1

原创 二叉树的最小深度问题

作者:Grey原文地址:博客园:二叉树的最小深度问题CSDN:二叉树的最小深度问题题目链接见:LeetCode 111. Minimum Depth of Binary Tree本题可以用两种方法来解,第一种方法,使用二叉树的递归套路,第二种方法是 Morris 遍历。相关介绍见:使用二叉树的递归套路来解决的问题定义递归函数递归含义表示:以 为头的二叉树的最小深度为多少。接下来是 base case,显而易见,空树的深度是0;接下来是普遍情况:如果 head 的左树为空,则最小深度就是右树的最小深度加

2022-12-07 17:39:14 429 2

原创 二叉树最大路径和问题

作者:Grey原文地址:博客园:二叉树最大路径和问题CSDN:二叉树最大路径和问题题目链接见: LeetCode 124. Binary Tree Maximum Path Sum本题使用二叉树递归套路方法,相关技巧见使用二叉树的递归套路来解决的问题定义如下数据结构接下来定义递归函数递归含义表示:head 为头的二叉树,得到的 Info 信息是什么。主函数只需要调用即为要求的结果。接下来就是方法的实现,有如下几种情况base case ,如果,直接返回,不赘述。接下来找左右子树的信息整合成以 hea

2022-12-06 20:36:14 265 1

原创 纸条折痕问题

作者:Grey原文地址:博客园:纸条折痕问题CSDN:纸条折痕问题主要思路本题主要是发现整个过程的规律,假设中间分割线看成是一个二叉树的头结点,分割线的上方看成是左子树,分割线的下方看成是右子树,则有如下规律头是凹折痕左子树的头节点都是凹折痕右子树的头节点都是凸折痕所以定义递归函数递归含义表示:从第 i 次折叠后,纸条从上到下的布局是如何,其中 N 是固定参数,表示 N 次折叠,down 变量表示是否是凹折痕,初始状态调用表示:从第一次折叠开始,折叠了 N 次,纸条的状态怎么样。base case 就是

2022-12-05 17:01:37 279

原创 求二叉树中最大的二叉搜索子树的头节点

作者:Grey原文地址:博客园:求二叉树中最大的二叉搜索子树的头节点CSDN:求二叉树中最大的二叉搜索子树的头节点定义递归函数递归含义表示:以为头的二叉树中最大的二叉搜索子树的头结点是什么。接下来是 base case,定义一个辅助函数,这个函数表示:如果以为头的树是二叉搜索树,则返回其大小,否则返回 0。的实现思路也比较简单,即通过中序遍历收集以 head 为头的树,如果这个树满足二叉搜索子树,则返回二叉搜索子树的大小,如果以 head 的头不是二叉搜索树,直接返回 0。代码如下实现了如上方法,主函

2022-12-04 21:38:21 404 1

原创 判断二叉树是否为满二叉树

作者:Grey原文地址:博客园:判断二叉树是否为满二叉树CSDN:判断二叉树是否为满二叉树使用公式,求二叉树的层数 k, 结点数 n,如果满足,则为满二叉树。定义数据结构其中表示二叉树的层数,表示二叉树的结点个数。定义递归函数递归含义是:head 为头的二叉树的层数和点数都是多少,接下来就是 base case即:的时候,此时, 且 接下来是普遍情况方法2定义如下数据结构其中表示是否为满二叉树,表示二叉树的高度。定义了这个数据结构后,可以梳理可能性,如果以 为头的树要符合满二叉树。则需要同时满

2022-12-03 17:23:26 407

原创 CentOS Linux 的安装

本安装说明是基于 Windows 10 下 VMware workstation 16 安装 Linux,Linux 版本是 CentOS 8,需要保证在联网环境下安装。然后系统会自动安装,安装好了以后,有个Reboot按钮,点击Reboot按钮,即可,Linux安装完成。在CD/DVD这里,选择使用ISO映像文件,选择对应的CentOS的iso文件。做好如上配置后,点击Install, 即可安装。重启网卡服务,注:Centos8不再使用。注:如无vim,可以执行。语言选择English。

2022-12-02 18:50:30 707

原创 Linux 中的文件简单说明

命令指定在建立文件时预设的权限掩码。权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。系统启动相关的文件,如内核,initrd,以及grub(bootloader)用户的家目录,每一个用户的家目录通常默认为:/home/USERNAME。伪文件系统,跟硬件设备相关的属性映射文件。执行上面的指令后,输出信息如下:0022。可变化的文件,比如:日志文件,数据文件。查看当前权限掩码,则输入下面的命令。可选目录,第三方程序的安装目录。本文基于 CentOS 7。

2022-12-01 16:53:29 389

原创 Spring Boot 配置多数据源

注:本示例基于 JdbcTemplate,如果使用 JPA,Hiberante 或者 Mybatis 等,方法类似。脚本和数据源配置好以后,接下来要准备两个数据源的配置类信息,以任意一个数据源的配置类信息为例(另外一个同理)首先,配置两个数据源,这里我们基于 H2 配置了两个简单数据源,由于 H2 是内存数据库,无需手动新建。参数定义了该数据源是主数据源,也就是说,调用数据源的时候,如果没有指定名称默认就是用这个数据源。完成上述配置后,在启动类中注入这两个数据源对应的。取的是 foo 数据源的信息。

2022-11-30 12:08:50 1418

原创 加强堆结构说明

普通堆结构之所以无法做到,是因为普通的堆结构没有记录任意一个数据所在的位置信息,所以无法从对应的位置进行堆结构调整。这个方法表示,对于堆中任意的一个元素 obj,如果调整了其对应的数值,整个堆结构还能在时间复杂度。的时间复杂度可以将堆调整好,如果使用的是 Java 语言,可以用。)无法做到的,这就引入了「加强堆」的概念。但是,在实际场景中,有一种情况是:在已知的一个堆中,堆中。, 就可以很方便得到某个数据项在堆中的位置是什么,在堆的。操作中,涉及到的堆中两个元素的交换,也要把堆中元素的。

2022-11-29 19:44:31 375

原创 与堆和堆排序相关的问题

整个过程如下,以小根堆为例,从数组最后一个元素 X 开始,一直找其父节点 A,如果X 比 A 小,X 就和 A 交换,然后来到父节点 A,继续往上找 A 的父节点 B,如果 A 比 B 小,则把 A 和 B 交换……整个流程就是,每个结点(假设为 X )去找自己的左右孩子中较小的那个(加设为 Y),然后X 和 Y 交换位置,交换后,看 X 是否继续有孩子结点,往复这个过程,一直到整个二叉树遍历完成。然后是 2 结点,2 结点的父节点 是 1 ,无需交换,然后是 1 结点,头结点,停止遍历,整个过程完毕。

2022-11-28 22:15:54 388

原创 基于桶的排序之基数排序以及排序方法总结

时间复杂度额外空间复杂度稳定性选择排序O(N^2)O(1)无冒泡排序O(N^2)O(1)有插入排序O(N^2)O(1)有归并排序O(N*logN)O(N)有随机快排O(N*logN)O(logN)无堆排序O(N*logN)O(1)无计数排序O(N)O(M)有基数排序O(N)O(N)有选择排序做不到稳定性,比如:5,5,5,5,5,3,5,5,5冒泡排序可以做到稳定性,在相等的时候,不往右即可。

2022-11-27 10:57:25 465

原创 基于桶的排序之计数排序

整个排序流程如下,首先获取到整个数组的最大值,假设是 max,则可以确定,数组中的所有数都不超过 max,所以,只需要开辟一个长度为 max + 1 的数组���假设为 helper,然后遍历原始数组 arr, 将。如果数组最小值是负数,假设最小值为 min,则把数组中所有的数加上(-min),就转换成了非负数组,最后排序结束后,再统一减去(-min)即可。这个排序适用于非负数数组,如果包含负数,需要先将负数转换成正数,处理逻辑如下。然后找 helper 中不等于 0 的值,,其中 M 是数组的最大值。

2022-11-26 19:02:33 304

原创 寻找链表相交结点问题

先从最简单的情况1和情况3进行分析,情况一发生的条件是:两个链表的入环结点(loop1,loop2)不是同一个,判断条件很简单,就是从任意一个链表的入环结点开始遍历一圈,如果都没有遇到另外一个链表的入环结点, 两个链表不相交,属于情况1;如果从任意一个链表的入环结点开始遍历一圈,遇到了另外一个链表的入环结点,则说明两个链表相交,属于情况3,且任意一个链表的入环结点都是相交结点。情况3:两个链表的入环结点不是同一个,此时任意一个链表的入环结点都是相交结点。首先,第三种情况下,两个链表一定不相交。

2022-11-25 20:37:14 338

空空如也

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

TA关注的人

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