Posts by Category

algorithm

算法漫谈-矩阵

矩阵就是二维数组,其问题解法和一维数组有类似的地方,但也不尽相同,让我们探究一下。 搜索 搜索二维有序矩阵 给定mxn矩阵matrix和目标值target,判断target是否存在于矩阵中 · 每行元素从左到右升序排列 · 每列元素从上到下升序排列

算法漫谈-优先队列

优先队列经常被用来求排序相关的问题,一般通过堆来实现,查找最值只需要常数时间,插入和删除最值需要对数时间。 下面我们来看一些典型的应用。

算法漫谈-前缀和

前缀和就是记录数组前i个元素之和的数组,0 <= i <= arr.length,子数组之和相关问题几乎都可以通过前缀和来解决。 之前的系列中我们其实已经使用过很多次前缀和了。首先来看最基本的使用

算法漫谈-单调栈

单调栈本质上就是一个队列,只是入队时将队尾大于(或小于)自身的元素出队,这使得它具有一些独特的性质。 我们以数组[1,3,2,5,6]压入单调栈为例 [1] [1,3] [1,2] [1,2,5] [1,2,5,6]

算法漫谈-数学计算

程序语言的标准库中都有大量的数学运算相关的函数,本章我们就来实现一些基本的数学运算。

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

算法漫谈-位运算

二进制是计算机科学的基石,而位运算可以说是其中的”奇技淫巧”,合理使用位运算可以提高程序的运行效率。 首先一起来看一些实用的位运算技巧吧。

图第二讲

本章继续介绍一些图相关的重要算法。

图第一讲

图论是计算机科学中非常重要也非常有趣的一部分,在日常生活中也有广阔的应用场景。 本章主要关注图的搜索,首先来看图的定义。

字符串第一讲

旋转 ```text 给定字符串s1和s2,检查s2是否是由s1旋转而成

字符串第零讲

本章关注字符串的排序和匹配。字符串本质只是一个字符数组,字符范围由字母表规定。 字母表可以是小写字母,即a-z,或标准ascii码,共128个字符,又或者是Unicode,共65536个字符。 字典序就是字符串相互比较的依据。

动态规划第一讲

本章讨论多维动态规划问题。 先看几个字符串相关的问题 编辑距离 给定字符串word1和word2,通过三种操作使word1变为word2,返回最小操作次数,操作有如下三种 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 我们每次都看两字符串的首字母,以”abc”和”abd”为例,首字母相同,所以求”...

动态规划第零讲

本章专门讲解典型的一维动态规划问题,这类问题不同题目间的差异极大, 核心是找到状态的表示和状态间的转换关系,让我们从一个经典的问题开始。

查找第一讲-二叉搜索树

上一节中的哈希表只能通过键查询值,而不能进行有序查找,比如查询最大最小的键、查找第k大的元素、按顺序遍历键等等 而本节的二叉排序树就具有有序查找的能力,让我们看看是什么原理。

查找第零讲-哈希表

哈希表应该是我们日常使用最频繁的数据结构之一了,本章我们介绍一下它的几种实现和应用。

算法漫谈-链表

本文的讨论都是围绕于单链表,一起总结常见的问题及解法。 单链表定义以力扣为准。 public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ...

算法漫谈-二叉树

这里默认大家已经对二叉树有基本的认识,在这个基础上做一下拓展和巩固。 表示 本文沿用力扣中的二叉树节点定义,包含左右节点和整数值 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNod...

算法漫谈-滑动窗口

滑动窗口是这样一类问题,求数组的带有某些性质的子数组的最大/最小长度或个数,子数组长度可能是一定的也可能是可变的。 让我们一起从题目入手理解并解决典型的滑动窗口问题。 定长 先从一个典型题目入手,求字符串s长度为k的子串中元音的最大数目 https://leetcode.cn/problems/maximum-n...

算法漫谈-X数之和

本期的话题是一个非常经典的问题-X数之和,简单来说就是在一个数组中任取X个不同的数,使其加和为目标值target,获得全部不重复的解。

算法漫谈-二分查找

原理 二分查找是一种利用数组有序性查找指定元素的算法,首先还是举例说明 假设数组为[10, 21, 32, 53, 54],查找目标元素3的下标 首先设置左指针l=0,右指针r=5(数组长度) 当l < r时循环 计算l和r的中心坐标mid=l + (r - l) / 2...

排序第四讲-总结及应用

排序总结 本系列一共提到选择排序、插入排序、归并排序、快速排序、堆排序这五种排序算法,下面我们从不同维度将其进行对比

排序第三讲-堆排序

本节要介绍的是堆排序,这是一种高效且简单的排序算法,并且作为优先队列的基础被广泛应用。

排序第一讲-归并排序

上一节中我们见到了两种基础的排序算法,平均的时间复杂度都是\(O(n^2)\),本节我们会讲归并排序,这种算法更快,当然也更复杂。

排序第零讲-基础篇

本系列试图结合原理和实践讲清楚排序。第零讲作为系列的开头会定义排序问题并讲解比较基础的两种排序算法:选择排序、插入排序。

Back to Top ↑

算法

算法漫谈-矩阵

矩阵就是二维数组,其问题解法和一维数组有类似的地方,但也不尽相同,让我们探究一下。 搜索 搜索二维有序矩阵 给定mxn矩阵matrix和目标值target,判断target是否存在于矩阵中 · 每行元素从左到右升序排列 · 每列元素从上到下升序排列

算法漫谈-优先队列

优先队列经常被用来求排序相关的问题,一般通过堆来实现,查找最值只需要常数时间,插入和删除最值需要对数时间。 下面我们来看一些典型的应用。

算法漫谈-前缀和

前缀和就是记录数组前i个元素之和的数组,0 <= i <= arr.length,子数组之和相关问题几乎都可以通过前缀和来解决。 之前的系列中我们其实已经使用过很多次前缀和了。首先来看最基本的使用

算法漫谈-单调栈

单调栈本质上就是一个队列,只是入队时将队尾大于(或小于)自身的元素出队,这使得它具有一些独特的性质。 我们以数组[1,3,2,5,6]压入单调栈为例 [1] [1,3] [1,2] [1,2,5] [1,2,5,6]

算法漫谈-数学计算

程序语言的标准库中都有大量的数学运算相关的函数,本章我们就来实现一些基本的数学运算。

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

算法漫谈-位运算

二进制是计算机科学的基石,而位运算可以说是其中的”奇技淫巧”,合理使用位运算可以提高程序的运行效率。 首先一起来看一些实用的位运算技巧吧。

图第二讲

本章继续介绍一些图相关的重要算法。

图第一讲

图论是计算机科学中非常重要也非常有趣的一部分,在日常生活中也有广阔的应用场景。 本章主要关注图的搜索,首先来看图的定义。

字符串第一讲

旋转 ```text 给定字符串s1和s2,检查s2是否是由s1旋转而成

字符串第零讲

本章关注字符串的排序和匹配。字符串本质只是一个字符数组,字符范围由字母表规定。 字母表可以是小写字母,即a-z,或标准ascii码,共128个字符,又或者是Unicode,共65536个字符。 字典序就是字符串相互比较的依据。

动态规划第一讲

本章讨论多维动态规划问题。 先看几个字符串相关的问题 编辑距离 给定字符串word1和word2,通过三种操作使word1变为word2,返回最小操作次数,操作有如下三种 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 我们每次都看两字符串的首字母,以”abc”和”abd”为例,首字母相同,所以求”...

动态规划第零讲

本章专门讲解典型的一维动态规划问题,这类问题不同题目间的差异极大, 核心是找到状态的表示和状态间的转换关系,让我们从一个经典的问题开始。

查找第一讲-二叉搜索树

上一节中的哈希表只能通过键查询值,而不能进行有序查找,比如查询最大最小的键、查找第k大的元素、按顺序遍历键等等 而本节的二叉排序树就具有有序查找的能力,让我们看看是什么原理。

查找第零讲-哈希表

哈希表应该是我们日常使用最频繁的数据结构之一了,本章我们介绍一下它的几种实现和应用。

算法漫谈-链表

本文的讨论都是围绕于单链表,一起总结常见的问题及解法。 单链表定义以力扣为准。 public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ...

算法漫谈-二叉树

这里默认大家已经对二叉树有基本的认识,在这个基础上做一下拓展和巩固。 表示 本文沿用力扣中的二叉树节点定义,包含左右节点和整数值 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNod...

算法漫谈-滑动窗口

滑动窗口是这样一类问题,求数组的带有某些性质的子数组的最大/最小长度或个数,子数组长度可能是一定的也可能是可变的。 让我们一起从题目入手理解并解决典型的滑动窗口问题。 定长 先从一个典型题目入手,求字符串s长度为k的子串中元音的最大数目 https://leetcode.cn/problems/maximum-n...

算法漫谈-X数之和

本期的话题是一个非常经典的问题-X数之和,简单来说就是在一个数组中任取X个不同的数,使其加和为目标值target,获得全部不重复的解。

算法漫谈-二分查找

原理 二分查找是一种利用数组有序性查找指定元素的算法,首先还是举例说明 假设数组为[10, 21, 32, 53, 54],查找目标元素3的下标 首先设置左指针l=0,右指针r=5(数组长度) 当l < r时循环 计算l和r的中心坐标mid=l + (r - l) / 2...

排序第四讲-总结及应用

排序总结 本系列一共提到选择排序、插入排序、归并排序、快速排序、堆排序这五种排序算法,下面我们从不同维度将其进行对比

排序第三讲-堆排序

本节要介绍的是堆排序,这是一种高效且简单的排序算法,并且作为优先队列的基础被广泛应用。

排序第一讲-归并排序

上一节中我们见到了两种基础的排序算法,平均的时间复杂度都是\(O(n^2)\),本节我们会讲归并排序,这种算法更快,当然也更复杂。

排序第零讲-基础篇

本系列试图结合原理和实践讲清楚排序。第零讲作为系列的开头会定义排序问题并讲解比较基础的两种排序算法:选择排序、插入排序。

Back to Top ↑

sort

排序第四讲-总结及应用

排序总结 本系列一共提到选择排序、插入排序、归并排序、快速排序、堆排序这五种排序算法,下面我们从不同维度将其进行对比

排序第三讲-堆排序

本节要介绍的是堆排序,这是一种高效且简单的排序算法,并且作为优先队列的基础被广泛应用。

排序第一讲-归并排序

上一节中我们见到了两种基础的排序算法,平均的时间复杂度都是\(O(n^2)\),本节我们会讲归并排序,这种算法更快,当然也更复杂。

排序第零讲-基础篇

本系列试图结合原理和实践讲清楚排序。第零讲作为系列的开头会定义排序问题并讲解比较基础的两种排序算法:选择排序、插入排序。

Back to Top ↑

排序

排序第四讲-总结及应用

排序总结 本系列一共提到选择排序、插入排序、归并排序、快速排序、堆排序这五种排序算法,下面我们从不同维度将其进行对比

排序第三讲-堆排序

本节要介绍的是堆排序,这是一种高效且简单的排序算法,并且作为优先队列的基础被广泛应用。

排序第一讲-归并排序

上一节中我们见到了两种基础的排序算法,平均的时间复杂度都是\(O(n^2)\),本节我们会讲归并排序,这种算法更快,当然也更复杂。

排序第零讲-基础篇

本系列试图结合原理和实践讲清楚排序。第零讲作为系列的开头会定义排序问题并讲解比较基础的两种排序算法:选择排序、插入排序。

Back to Top ↑

dynamic-programming

动态规划第一讲

本章讨论多维动态规划问题。 先看几个字符串相关的问题 编辑距离 给定字符串word1和word2,通过三种操作使word1变为word2,返回最小操作次数,操作有如下三种 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 我们每次都看两字符串的首字母,以”abc”和”abd”为例,首字母相同,所以求”...

动态规划第零讲

本章专门讲解典型的一维动态规划问题,这类问题不同题目间的差异极大, 核心是找到状态的表示和状态间的转换关系,让我们从一个经典的问题开始。

Back to Top ↑

动态规划

动态规划第一讲

本章讨论多维动态规划问题。 先看几个字符串相关的问题 编辑距离 给定字符串word1和word2,通过三种操作使word1变为word2,返回最小操作次数,操作有如下三种 1. 插入一个字符 2. 删除一个字符 3. 替换一个字符 我们每次都看两字符串的首字母,以”abc”和”abd”为例,首字母相同,所以求”...

动态规划第零讲

本章专门讲解典型的一维动态规划问题,这类问题不同题目间的差异极大, 核心是找到状态的表示和状态间的转换关系,让我们从一个经典的问题开始。

Back to Top ↑

jvm

JVM问题排查

jvm相关的问题通常是很难遇到的,因此积累排查问题的经验并不容易,但是我们可以借鉴他人的排查案例,来总结排查的流程和方法。

JVM内存管理

要深入理解jvm内存管理,我们需要从两方面来看,一是jvm规范中对内存管理的定义,二是hotspot对jvm规范的具体实现。

JVM启动流程

简单来说,jvm的启动始于执行main方法,并在执行过程中触发入口类和相关类的加载、链接、初始化,最终所有非守护线程执行完毕,jvm关闭。 本文将详细讲解其中重要的步骤,我们一起往下看。

JVM类文件格式

要深入了解jvm类和对象的加载、内存分配,前提就是清楚java中的类文件的结构是怎样的。 类文件本身只是一个二进制文件,我们通过插件解析就行理清它的结构。

Back to Top ↑

db

mysql中的log

要深入理解数据库的原理,就不得不提到mysql中的redo、undo和bin log三种日志。 数据库的核心功能事务以及数据恢复、主从复制都依赖于这三种日志。 本章讲解均基于mysql-8.0.41版本,不同版本实现有差异,但原理是一样的。

图解gap lock

快照读的可重复读是依赖MVCC实现的,而一致性读(也称作当前读)的可重复读还需要依靠间隙锁gap lock。

图解MVCC

MVCC全称是 多版本并发控制(Multi-Version Concurrency Control), mysql中实现可重复读隔离级别下的快照读就是依赖了这项技术,本文将通过大量图例以一种简明的视角讲清楚这个概念。

Back to Top ↑

mysql

mysql中的log

要深入理解数据库的原理,就不得不提到mysql中的redo、undo和bin log三种日志。 数据库的核心功能事务以及数据恢复、主从复制都依赖于这三种日志。 本章讲解均基于mysql-8.0.41版本,不同版本实现有差异,但原理是一样的。

图解gap lock

快照读的可重复读是依赖MVCC实现的,而一致性读(也称作当前读)的可重复读还需要依靠间隙锁gap lock。

图解MVCC

MVCC全称是 多版本并发控制(Multi-Version Concurrency Control), mysql中实现可重复读隔离级别下的快照读就是依赖了这项技术,本文将通过大量图例以一种简明的视角讲清楚这个概念。

Back to Top ↑

string

字符串第一讲

旋转 ```text 给定字符串s1和s2,检查s2是否是由s1旋转而成

字符串第零讲

本章关注字符串的排序和匹配。字符串本质只是一个字符数组,字符范围由字母表规定。 字母表可以是小写字母,即a-z,或标准ascii码,共128个字符,又或者是Unicode,共65536个字符。 字典序就是字符串相互比较的依据。

Back to Top ↑

字符串

字符串第一讲

旋转 ```text 给定字符串s1和s2,检查s2是否是由s1旋转而成

字符串第零讲

本章关注字符串的排序和匹配。字符串本质只是一个字符数组,字符范围由字母表规定。 字母表可以是小写字母,即a-z,或标准ascii码,共128个字符,又或者是Unicode,共65536个字符。 字典序就是字符串相互比较的依据。

Back to Top ↑

graph

图第二讲

本章继续介绍一些图相关的重要算法。

图第一讲

图论是计算机科学中非常重要也非常有趣的一部分,在日常生活中也有广阔的应用场景。 本章主要关注图的搜索,首先来看图的定义。

Back to Top ↑

图论

图第二讲

本章继续介绍一些图相关的重要算法。

图第一讲

图论是计算机科学中非常重要也非常有趣的一部分,在日常生活中也有广阔的应用场景。 本章主要关注图的搜索,首先来看图的定义。

Back to Top ↑

enumeration

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

Back to Top ↑

os

虚拟内存-TLB和swap

上一章我们讲过通过多级分页解决虚拟内存管理占用空间过大的问题,但是访问效率的问题还没有解决。关于效率的问题一般都可以通过空间来换时间,也就是使用缓存。用于分页的缓存硬件就称为TLB(Translation Lookaside Buffer)。

虚拟内存-分页管理

想理解操作系统的内存管理,就必须搞清楚虚拟内存的概念。以32位机器为例,物理内存最大为4GB,但是每个进程都能有4GB甚至更大的地址空间,即虚拟内存,这是怎么实现的呢?请跟随我的脚步往下看。 base & bound 先克隆项目https://github.com/cafewang/playground ...

Back to Top ↑

virtual-memory

虚拟内存-TLB和swap

上一章我们讲过通过多级分页解决虚拟内存管理占用空间过大的问题,但是访问效率的问题还没有解决。关于效率的问题一般都可以通过空间来换时间,也就是使用缓存。用于分页的缓存硬件就称为TLB(Translation Lookaside Buffer)。

虚拟内存-分页管理

想理解操作系统的内存管理,就必须搞清楚虚拟内存的概念。以32位机器为例,物理内存最大为4GB,但是每个进程都能有4GB甚至更大的地址空间,即虚拟内存,这是怎么实现的呢?请跟随我的脚步往下看。 base & bound 先克隆项目https://github.com/cafewang/playground ...

Back to Top ↑

microservices

微服务缓存实战

微服务下缓存实践是一个很大的话题,本文主要关注缓存和数据库的交互方式以及缓存一致性的讨论。 交互方式 cache aside 最常见的交互方式,由业务方直接操作缓存和数据库,维持两者的一致。 注意 写数据时先更新数据库,然后清空对应缓存,这种方式优于覆盖缓存,造成不一致的概率较低

Sagas深度解析-介绍

本文以微服务设计模式书中的demo项目ftgo-application为例,讲解sagas模式在微服务架构中的具体实现。 文中不会专门讲解sagas的概念,而是在演示过程中穿插解释sagas是什么,在阅读和操练项目的过程中,您会加深对sagas的理解,同时也能学到sagas的落地方式。

Back to Top ↑

redis

redis调试

redis是比较适合学习的开源框架,而调试又是研究源码最佳的方式,本文将两者结合,讨论一下怎样调试redis。

redis杂谈

本文主要是总结redis相关的重要知识点和应用,通过实操来深入理解redis。

Back to Top ↑

二分查找

算法漫谈-二分查找

原理 二分查找是一种利用数组有序性查找指定元素的算法,首先还是举例说明 假设数组为[10, 21, 32, 53, 54],查找目标元素3的下标 首先设置左指针l=0,右指针r=5(数组长度) 当l < r时循环 计算l和r的中心坐标mid=l + (r - l) / 2...

Back to Top ↑

x-sum

算法漫谈-X数之和

本期的话题是一个非常经典的问题-X数之和,简单来说就是在一个数组中任取X个不同的数,使其加和为目标值target,获得全部不重复的解。

Back to Top ↑

X数之和

算法漫谈-X数之和

本期的话题是一个非常经典的问题-X数之和,简单来说就是在一个数组中任取X个不同的数,使其加和为目标值target,获得全部不重复的解。

Back to Top ↑

slide-window

算法漫谈-滑动窗口

滑动窗口是这样一类问题,求数组的带有某些性质的子数组的最大/最小长度或个数,子数组长度可能是一定的也可能是可变的。 让我们一起从题目入手理解并解决典型的滑动窗口问题。 定长 先从一个典型题目入手,求字符串s长度为k的子串中元音的最大数目 https://leetcode.cn/problems/maximum-n...

Back to Top ↑

滑动窗口

算法漫谈-滑动窗口

滑动窗口是这样一类问题,求数组的带有某些性质的子数组的最大/最小长度或个数,子数组长度可能是一定的也可能是可变的。 让我们一起从题目入手理解并解决典型的滑动窗口问题。 定长 先从一个典型题目入手,求字符串s长度为k的子串中元音的最大数目 https://leetcode.cn/problems/maximum-n...

Back to Top ↑

binary-tree

算法漫谈-二叉树

这里默认大家已经对二叉树有基本的认识,在这个基础上做一下拓展和巩固。 表示 本文沿用力扣中的二叉树节点定义,包含左右节点和整数值 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNod...

Back to Top ↑

二叉树

算法漫谈-二叉树

这里默认大家已经对二叉树有基本的认识,在这个基础上做一下拓展和巩固。 表示 本文沿用力扣中的二叉树节点定义,包含左右节点和整数值 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNod...

Back to Top ↑

链表

算法漫谈-链表

本文的讨论都是围绕于单链表,一起总结常见的问题及解法。 单链表定义以力扣为准。 public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ...

Back to Top ↑

range

Back to Top ↑

区间

Back to Top ↑

hash-table

查找第零讲-哈希表

哈希表应该是我们日常使用最频繁的数据结构之一了,本章我们介绍一下它的几种实现和应用。

Back to Top ↑

哈希表

查找第零讲-哈希表

哈希表应该是我们日常使用最频繁的数据结构之一了,本章我们介绍一下它的几种实现和应用。

Back to Top ↑

binary-search-tree

查找第一讲-二叉搜索树

上一节中的哈希表只能通过键查询值,而不能进行有序查找,比如查询最大最小的键、查找第k大的元素、按顺序遍历键等等 而本节的二叉排序树就具有有序查找的能力,让我们看看是什么原理。

Back to Top ↑

二叉搜索树

查找第一讲-二叉搜索树

上一节中的哈希表只能通过键查询值,而不能进行有序查找,比如查询最大最小的键、查找第k大的元素、按顺序遍历键等等 而本节的二叉排序树就具有有序查找的能力,让我们看看是什么原理。

Back to Top ↑

股票买卖

Back to Top ↑

max-subarray-sum

Back to Top ↑

最大子数组和

Back to Top ↑

bit-manipulation

算法漫谈-位运算

二进制是计算机科学的基石,而位运算可以说是其中的”奇技淫巧”,合理使用位运算可以提高程序的运行效率。 首先一起来看一些实用的位运算技巧吧。

Back to Top ↑

位运算

算法漫谈-位运算

二进制是计算机科学的基石,而位运算可以说是其中的”奇技淫巧”,合理使用位运算可以提高程序的运行效率。 首先一起来看一些实用的位运算技巧吧。

Back to Top ↑

permutation

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

Back to Top ↑

combination

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

Back to Top ↑

排列组合

枚举第零讲-排列组合

本章要讲的是NP问题,也就是无法在多项式时间内解决的问题,先从经典的排列组合说起。

Back to Top ↑

math-calculation

算法漫谈-数学计算

程序语言的标准库中都有大量的数学运算相关的函数,本章我们就来实现一些基本的数学运算。

Back to Top ↑

数学计算

算法漫谈-数学计算

程序语言的标准库中都有大量的数学运算相关的函数,本章我们就来实现一些基本的数学运算。

Back to Top ↑

monotonic-stack

算法漫谈-单调栈

单调栈本质上就是一个队列,只是入队时将队尾大于(或小于)自身的元素出队,这使得它具有一些独特的性质。 我们以数组[1,3,2,5,6]压入单调栈为例 [1] [1,3] [1,2] [1,2,5] [1,2,5,6]

Back to Top ↑

单调栈

算法漫谈-单调栈

单调栈本质上就是一个队列,只是入队时将队尾大于(或小于)自身的元素出队,这使得它具有一些独特的性质。 我们以数组[1,3,2,5,6]压入单调栈为例 [1] [1,3] [1,2] [1,2,5] [1,2,5,6]

Back to Top ↑

prefix-sum

算法漫谈-前缀和

前缀和就是记录数组前i个元素之和的数组,0 <= i <= arr.length,子数组之和相关问题几乎都可以通过前缀和来解决。 之前的系列中我们其实已经使用过很多次前缀和了。首先来看最基本的使用

Back to Top ↑

前缀和

算法漫谈-前缀和

前缀和就是记录数组前i个元素之和的数组,0 <= i <= arr.length,子数组之和相关问题几乎都可以通过前缀和来解决。 之前的系列中我们其实已经使用过很多次前缀和了。首先来看最基本的使用

Back to Top ↑

priority-queue

算法漫谈-优先队列

优先队列经常被用来求排序相关的问题,一般通过堆来实现,查找最值只需要常数时间,插入和删除最值需要对数时间。 下面我们来看一些典型的应用。

Back to Top ↑

优先队列

算法漫谈-优先队列

优先队列经常被用来求排序相关的问题,一般通过堆来实现,查找最值只需要常数时间,插入和删除最值需要对数时间。 下面我们来看一些典型的应用。

Back to Top ↑

matrix

算法漫谈-矩阵

矩阵就是二维数组,其问题解法和一维数组有类似的地方,但也不尽相同,让我们探究一下。 搜索 搜索二维有序矩阵 给定mxn矩阵matrix和目标值target,判断target是否存在于矩阵中 · 每行元素从左到右升序排列 · 每列元素从上到下升序排列

Back to Top ↑

矩阵

算法漫谈-矩阵

矩阵就是二维数组,其问题解法和一维数组有类似的地方,但也不尽相同,让我们探究一下。 搜索 搜索二维有序矩阵 给定mxn矩阵matrix和目标值target,判断target是否存在于矩阵中 · 每行元素从左到右升序排列 · 每列元素从上到下升序排列

Back to Top ↑

pagination

虚拟内存-分页管理

想理解操作系统的内存管理,就必须搞清楚虚拟内存的概念。以32位机器为例,物理内存最大为4GB,但是每个进程都能有4GB甚至更大的地址空间,即虚拟内存,这是怎么实现的呢?请跟随我的脚步往下看。 base & bound 先克隆项目https://github.com/cafewang/playground ...

Back to Top ↑

tlb

虚拟内存-TLB和swap

上一章我们讲过通过多级分页解决虚拟内存管理占用空间过大的问题,但是访问效率的问题还没有解决。关于效率的问题一般都可以通过空间来换时间,也就是使用缓存。用于分页的缓存硬件就称为TLB(Translation Lookaside Buffer)。

Back to Top ↑

swap-space

虚拟内存-TLB和swap

上一章我们讲过通过多级分页解决虚拟内存管理占用空间过大的问题,但是访问效率的问题还没有解决。关于效率的问题一般都可以通过空间来换时间,也就是使用缓存。用于分页的缓存硬件就称为TLB(Translation Lookaside Buffer)。

Back to Top ↑

network

网络栈实现之ARP

学习网络最好的方式就是实现一个网络栈,毕竟网络不在书本上,仅通过抓包也很难理解网络的全貌。TCP/IP都经过几轮重大改版,想实现完整的网络栈并不容易,但是其核心概念并没有改变,实现最小功能版本的网络栈是可行的,我们将逐步完成这一壮举! 环境准备 我们将在linux系统下通过TAP设备实现用户空间的TCP/IP网络...

Back to Top ↑

tcp/ip

网络栈实现之ARP

学习网络最好的方式就是实现一个网络栈,毕竟网络不在书本上,仅通过抓包也很难理解网络的全貌。TCP/IP都经过几轮重大改版,想实现完整的网络栈并不容易,但是其核心概念并没有改变,实现最小功能版本的网络栈是可行的,我们将逐步完成这一壮举! 环境准备 我们将在linux系统下通过TAP设备实现用户空间的TCP/IP网络...

Back to Top ↑

class-file

JVM类文件格式

要深入了解jvm类和对象的加载、内存分配,前提就是清楚java中的类文件的结构是怎样的。 类文件本身只是一个二进制文件,我们通过插件解析就行理清它的结构。

Back to Top ↑

memory-management

JVM内存管理

要深入理解jvm内存管理,我们需要从两方面来看,一是jvm规范中对内存管理的定义,二是hotspot对jvm规范的具体实现。

Back to Top ↑

trouble-shooting

JVM问题排查

jvm相关的问题通常是很难遇到的,因此积累排查问题的经验并不容易,但是我们可以借鉴他人的排查案例,来总结排查的流程和方法。

Back to Top ↑

sso

SSO实战

说出来可能让人意外,登录系统可能是最复杂的系统之一,并不是看起来的注册、登录、退出这么简单。 列举一下登录系统中涉及的重要问题: 密码在前后端怎样存储和验证最安全? 网站的密码复杂度要求高吗? 更改密码时怎样退出其他登录的设备? 怎么保持认证状态,使用session还是JWT? sessio...

Back to Top ↑

security

SSO实战

说出来可能让人意外,登录系统可能是最复杂的系统之一,并不是看起来的注册、登录、退出这么简单。 列举一下登录系统中涉及的重要问题: 密码在前后端怎样存储和验证最安全? 网站的密码复杂度要求高吗? 更改密码时怎样退出其他登录的设备? 怎么保持认证状态,使用session还是JWT? sessio...

Back to Top ↑

sagas

Sagas深度解析-介绍

本文以微服务设计模式书中的demo项目ftgo-application为例,讲解sagas模式在微服务架构中的具体实现。 文中不会专门讲解sagas的概念,而是在演示过程中穿插解释sagas是什么,在阅读和操练项目的过程中,您会加深对sagas的理解,同时也能学到sagas的落地方式。

Back to Top ↑

cache

微服务缓存实战

微服务下缓存实践是一个很大的话题,本文主要关注缓存和数据库的交互方式以及缓存一致性的讨论。 交互方式 cache aside 最常见的交互方式,由业务方直接操作缓存和数据库,维持两者的一致。 注意 写数据时先更新数据库,然后清空对应缓存,这种方式优于覆盖缓存,造成不一致的概率较低

Back to Top ↑

debug

redis调试

redis是比较适合学习的开源框架,而调试又是研究源码最佳的方式,本文将两者结合,讨论一下怎样调试redis。

Back to Top ↑

linux

Linux信号机制

信号(Signal)是 Linux 系统中最古老、最基础的进程间通信机制之一,也是理解 Unix/Linux 系统编程的核心概念。作为一种异步通知机制,信号允许内核或一个进程向另一个进程发送简短的通知,告知其某个特定事件的发生——无论是用户按下 Ctrl+C 中断程序,还是子进程终止通知父进程,亦或是定时器到期提...

Back to Top ↑

signal

Linux信号机制

信号(Signal)是 Linux 系统中最古老、最基础的进程间通信机制之一,也是理解 Unix/Linux 系统编程的核心概念。作为一种异步通知机制,信号允许内核或一个进程向另一个进程发送简短的通知,告知其某个特定事件的发生——无论是用户按下 Ctrl+C 中断程序,还是子进程终止通知父进程,亦或是定时器到期提...

Back to Top ↑

rust

RustLiveExample-所有权

所有权是Rust语言的核心概念,也是Rust语言的难点,正确理解所有权,是读懂和写好Rust代码的必要条件。 文章主要参考了Programming Rust一书,需要更细致地解读请参考该书。

Back to Top ↑

ownership

RustLiveExample-所有权

所有权是Rust语言的核心概念,也是Rust语言的难点,正确理解所有权,是读懂和写好Rust代码的必要条件。 文章主要参考了Programming Rust一书,需要更细致地解读请参考该书。

Back to Top ↑