惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Heimdal Security Blog
SecWiki News
SecWiki News
H
Hacker News: Front Page
N
News | PayPal Newsroom
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
AI
AI
C
Cybersecurity and Infrastructure Security Agency CISA
Scott Helme
Scott Helme
PCI Perspectives
PCI Perspectives
S
Securelist
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
Forbes - Security
Forbes - Security
T
Tor Project blog
Spread Privacy
Spread Privacy
WordPress大学
WordPress大学
I
Intezer
Martin Fowler
Martin Fowler
Help Net Security
Help Net Security
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
博客园 - 司徒正美
W
WeLiveSecurity
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
P
Palo Alto Networks Blog
Google DeepMind News
Google DeepMind News
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
V
Vulnerabilities – Threatpost
Jina AI
Jina AI
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
Simon Willison's Weblog
Simon Willison's Weblog
Project Zero
Project Zero
T
Threatpost
P
Privacy International News Feed
人人都是产品经理
人人都是产品经理
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research

See you soon

试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon Rust 的边界检查是否已经有很大的进步 | See you soon 使用 Rust 编写操作系统:Barebones | See you soon 使用 Rust 编写操作系统:引言 | See you soon 编译器笔记:rope | See you soon 编译器笔记:CST | See you soon Paradoxical 札记 | See you soon 简单的相似去重算法(基于向量) | See you soon 更加现代的 PaperMC Minecraft 插件设计指南 | See you soon 简单的 CFG 语法分析方法 | See you soon 简单地使用 Caddy 实现 CORS 配置 | See you soon 让 OpenCV 可以被静态链接 | See you soon 图片搜索笔笺 | See you soon 电路板设计笔记-保护 | See you soon 使用 Rust 实现 SnowflakeId | See you soon 农夫乐事 FaQ 启示 | See you soon 使用 Rust 实现拓展系统札记 | See you soon 遗传学定律的代码实现 | See you soon EN:The Journey of Rust and Procps | See you soon ZH:Rust 与 Procps 之旅 | See you soon 使用 debootstrap 与 schroot 构建一个纯净环境 | See you soon GPG添加新的用户信息 | See you soon GSoC2024 笔记:使用 Rust 重新实现 procps | See you soon JWT 小册 | See you soon 使用密钥登录 SSH | See you soon Guava:Cache | See you soon 编译器笔记:增量编译 | See you soon Gradle秘境:添加一个类似modCompileOnly的依赖块 | See you soon Minecraft:原始经济系统设计简述 | See you soon TinyRemapper笔记 | See you soon MicroOS:进阶 | See you soon MicroOS:起步 | See you soon Swapfile 指北 | See you soon GPG 物理密钥的安装与密钥的迁移 | See you soon 用GPG签名告诉大家这就是我的提交 | See you soon 文章翻译:从init.vim到init.lua | See you soon 目录遍历攻击 | See you soon 如何挂载.img文件,以及如何使用QEMU模拟arm64环境 | See you soon 在树莓派上编译 OpenCV | See you soon 关于卸载BlueStacks后遇到的问题 | See you soon
DFS:深度优先搜索 | See you soon
Krysztal Huang · 2022-02-18 · via See you soon

暴力算法和 DFS 有什么区别?剪枝,回溯又是什么?

在做蓝桥杯的题目时候遇到一个题目,它的描述如下

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 * 495 = ?

他却给抄成了:396 * 45 = ?

但结果却很戏剧性,他的答案竟然是对的!!

因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表 1~9 不同的 5 个数字(注意是各不相同的数字,且不含 0)

能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

人话来说,就是找出满足ab * cde = adb * ce的所有a b c d e,并且他们数值不会重复,且他们是处于 1-9 这个区间的

解决方案

一共存在两种解决方案,暴力枚举和 DFS。

暴力枚举能比较简单的解决问题,但是它需要走所有的可能才能得出结果,优点在于思想简单容易理解

DFS 解决它的方法可能相对复杂,但是它不不想要知道所有的可能,他会在触碰边界后回退到上一步尝试下一种可能。

跳出这种可能,即为剪枝

回退到上一步尝试下一种可能,即为回溯

暴力枚举

我们假设一共有abcde五个循环,其中初始化数据均为 1,包裹顺序为 a 包裹 b 包裹 c 包裹 d 包裹 e,代码如下

for (int a = 1; a < 10; a++) {

for (int b = 1; b < 10; b++) {

for (int c = 1; c < 10; c++) {

for (int d = 1; d < 10; d++) {

for (int e = 1; e < 10; e++) {

// 跳出条件

}

}

}

}

}

能暴力枚举出所有可能,但是这个不是我们的最佳解法——它的范用性非常的差

DFS,深度优先搜索

DFS 一般和全排列在一起,它也能列举出所有的可能并且会尽可能深的访问数据结构,但是它有剪枝和回溯能力以及固定的代码格式,相比之下它有了更强的范用性

它的关键字为:回溯递归剪枝

以下为它的伪代码表示

// 这是当前的数据数组,需要看情况调整

ArrayList<Integer> numCombine = new ArrayList<>();

// 需要假设最远步数

int maxStep;

void dfsRun(int step) {

// 边界,maxStep为步数边界

if (step == this.maxStep) {

// 已经到达了边界,需要跳出这一条线路

dfsCheck();

return;

}

// 递归条件

// for语句中填充初始化条件

for (;;) {

// 跳出条件,意味着当前分支已经失败

// 这里就是剪枝操作

if()

continue;

this.numCombine.add(i);

// 走下一步

this.dfsRun(step + 1);

// 回溯,因为这个条件已经判断过了,需要回退一步

this.numCombine.remove(this.numCombine.size() - 1);

}

}

void dfsCheck() {

// 这里写检查条件

// 当检查成功时,可以把它储存起来

}

这就是 DFS 的模板代码了。

用文字的方法来理解它:

1.首先将根节点放入 stack 中。 2.从 stack 中取出第一个节点,并检验它是否为目标。

如果找到目标,则结束搜寻并回传结果。 否则将它某一个尚未检验过的直接子节点加入 stack 中。

3.重复步骤 2。 4.如果不存在未检测过的直接子节点。

将上一级节点加入 stack 中。 重复步骤 2。

5.重复步骤 4。 6.若 stack 为空,表示整张图都检查过了——亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。

理解起来很困难对吧,没关系来看下面资料继续理解 XD

用到的资源 由 Alexander Drichel - 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=3791979