Backtracking
回溯法的本质回溯法是一种系统枚举解空间的方法。它把求解过程看成一棵搜索树: 每一层对应一个决策阶段; 每条边对应一种选择; 从根到叶的一条路径对应一个候选解; 如果当前路径已经不可能得到合法解或更优解,就提前停止继续向下搜索。 回溯的核心动作是: 选择:在当前状态下尝试一种可能。 递归:进入下一层继续搜索。 撤销选择:递归返回后恢复现场,让同层的其他选择能够在干净状态下继续尝试。 因此,回溯不是单纯的递归。它强调“递归前改变状态,递归后恢复状态”。 ↻ + − 适用条件当问题满足下面特征时,通常可以考虑回溯: 条件 含义 分步决策 答案可以由若干步选择组成 层次结构明显 第 $k$ 步的选择依赖前 $k-1$ 步的状态 需要枚举 需要找全部方案、某个可行方案,或在全部可行方案中找最优方案 可剪枝 可以在中途判断某些分支一定无效或不优 常见题型包括 N 皇后、全排列、组合、子集、迷宫路径、数独、0-1...
recursion to loop
由汇编代码的函数栈帧切换机制所启发,得到一种将任意递归代码转化为利用栈的循环形式。 1. 汇编代码的函数栈帧切换机制在调用函数时,机器会将当前指令指针(IP)以及调用者函数的入口地址(bp)压入栈中进行保存。在子函数返回时,机器就会从栈中弹出这两个值。又由于根据bp的值可以找到调用者函数的传入参数/内部变量的存储地址,所以从而恢复调用者函数的执行状态。 而对于返回值,则是会分配寄存器%eax专门地进行存储。 2. 伪代码于是,对于任意递归代码,都可以通过栈来模拟递归的过程。且栈的元素就是函数的栈帧,它包含了函数的参数、内部变量、IP等信息, 伪代码定义如下: 1234struct StackFrame{ 函数的参数、内部变量 int ip;} 于是对于任一递归函数r 12345678910func r(p){ if(condition){ return ret; } r(f1(p)); ... r(f2(p)); ... ...
Nginx
1. 问题情景在aliyun服务器(ubuntu)上部署了一个后端服务,端口为 8080。然而,由于安全策略的限制,外部无法直接<ip>:8080访问该端口。 2. 解决方案配置 Nginx 作为反向代理,将外部请求转发到该后端服务即可。 2.1. 配置Nginx 安装Nginx 12sudo apt updatesudo apt install nginx 2.2. 反向代理编辑Nginx配置文件 1sudo vim /etc/nginx/sites-available/default 在 server 块中添加以下配置: 123456location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;} 保存并退出编辑器,...
visitor
1. 什么是访问者模式访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变对象结构(类)的情况下,定义作用于这些对象的新操作。 核心思想是将数据结构与数据操作分离。 通常情况下,对象的方法(操作)是定义在对象内部的。但在访问者模式中,我们将操作逻辑提取出来,封装在一个独立的“访问者”对象中。当我们需要对一组对象执行操作时,我们让这些对象“接受”访问者,然后访问者会根据对象的具体类型执行相应的逻辑。 2. 为什么需要访问者模式在软件开发中,我们经常面临这样的困境:我们有一个稳定的对象结构(例如一个包含不同类型节点的语法树,或者一个包含不同几何形状的绘图系统),但我们需要经常在这个结构上定义新的操作(例如语法检查、代码生成、计算面积、导出 XML...
state
1. 什么是状态模式状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。状态模式将对象的状态封装成独立的类,使客户端可以透明地切换对象的状态。 为了方便理解,这里引入有限状态机(Finite State Machine)的概念。 1.1 有限状态机有限状态机(Finite State Machine,FSM)是一个数学模型,它包含一组有限的状态、一组输入事件、一个初始状态以及一个状态转移函数。FSM 在任何给定时间点都处于其中一个状态。当接收到输入事件时,它会根据状态转移函数转换到新的状态。 状态模式可以看作是 FSM 的一种面向对象实现。 2. 为什么需要状态模式当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变行为时,可以使用状态模式。状态模式可以将与特定状态相关的行为局部化,并且使得状态转换显式化。 3. 状态模式的实现(go)让我们以一个自动售货机为例。售货机有以下几种状态: hasItem: 有商品状态 noItem: 无商品状态 itemRequested: 商品请求状态 hasMoney:...
strategy
1. 什么是策略模式?策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。 核心思想是:当一个任务有多种处理方式(策略)时,将这些方式抽象成一个共同的接口,并为每种方式提供一个具体的实现类。环境(Context)角色持有一个策略接口的引用,从而能在运行时动态地切换和使用不同的策略。 与状态模式不同,策略模式的各种策略是独立的,客户端需要知道所有的策略,才能选择合适的策略。而状态模式的各种状态是相关的,客户端只需要知道当前状态,就可以根据状态转换规则自动切换到下一个状态。 2. 为什么需要策略模式?在软件开发中,我们经常会遇到需要根据不同条件选择不同行为的场景。最直接的方法是使用 if-else 或 switch-case 结构。但当分支逻辑变得复杂,或者需要频繁增删新的分支时,这种方式会导致代码臃肿、难以维护,并且违反了“开闭原则”(对扩展开放,对修改关闭)。 策略模式正是为了解决这个问题而生。它有以下优点: 简化条件逻辑:将复杂的 if-else...
swagger
在后端开发中,接口文档与代码难以同步是常见的问题。Swagger 通过“代码即文档”的方式解决了这一点:开发者编写特定格式的代码注释,工具自动生成标准化的 API 文档和交互式调试页面。 本文主要介绍如何在 Go 后端项目中集成 Swagger。 1. 环境准备在项目根目下执行安装命令: 123456# 1. 安装文档生成器 (CLI)go install github.com/swaggo/swag/cmd/swag@latest# 2. 安装 Gin 适配器go get github.com/swaggo/gin-swagger@latestgo get github.com/swaggo/files@latest 2. swagger注释语法详解Swagger 的核心在于写对注释。注释分为全局配置和接口配置。 2.1 全局配置 (main.go)放在 main 函数上方,用于定义文档的通用信息。 123456// @title 项目名称 (如: 支付系统 API)// @version 1.0// @description ...
template
1. 什么是模板方法模式?模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。核心便是利用了多态性,父类定义了算法的骨架,子类实现具体的步骤。 在 Go 语言中,由于没有经典的类继承,模板方法模式通常通过接口和结构体嵌入来模拟。 2. 为什么需要模板方法模式?当你发现多个类有相似的算法,但只在某些细节上有所不同时,模板方法模式就非常有用。 代码复用:将所有子类中通用的算法逻辑提取到唯一的父类中,避免代码重复。 框架控制:它定义了一个框架,让子类在不改变框架结构的前提下,填充特定的业务逻辑。这在开发框架或库时非常常见。 遵循开闭原则:你可以在不修改模板方法的情况下,引入新的子类来扩展功能。 3. 模板方法模式的实现(go)以一个通用的“资源下载器”为例。无论从 HTTP 还是 FTP 下载,其核心流程是固定的:初始化 -> 下载数据 -> 保存文件 ->...
jwt
1. 什么是 JWT?JWT 全称是 JSON Web Token,由三部分组成,用点 . 隔开。例如: xxxxx.yyyyy.zzzzz Header (头部) - xxxxx 内容 :记录令牌的类型(就是 JWT)和加密算法(比如 HMAC SHA256)。 作用 :告诉服务器怎么去解读这张令牌,包括令牌的类型和加密算法。 Payload (载荷) - yyyyy 内容 :承载声明,存放实际的用户信息。一般为Subject(主体标识)、ExpiresAt(过期时间)、IssuedAt(签发时间)、Issuer(签发者)、NotBefore(生效时间)等。这部分内容是公开的,任何人都能解码看到,所以不能放密码等敏感信息。 作用 :让服务器知道当前请求是谁发起的,有什么权限。 Signature (签名) - zzzzz 内容 :由服务器的密钥对前两部分签名,生成的防伪标识。它是通过把头部和载荷组合起来,再加上一个只有服务器知道的“密钥”(Secret),然后用头部声明的加密算法生成的。 作用 : 防伪...
mediator
1. 什么是中介者模式?中介者模式(Mediator Pattern)通过引入一个“中介者”对象来封装对象之间的交互,使多个对象不需要显式引用彼此,改为只与中介者通信。它将协作编排从同事对象中抽离出来,降低耦合并集中管理交互规则。 2....