| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> DFS进阶技巧--迭代加深IDA*和双向DFS -> 正文阅读 |
|
[数据结构与算法]DFS进阶技巧--迭代加深IDA*和双向DFS |
1.迭代加深深度优先搜索每次选定一个分支,不断深入直到递归边界才回溯.当搜索树的分支特别多,但答案处于较浅层的节点上,就会导致浪费许多时间. AdditionChains
在最坏情况下,
n
=
100
n = 100
n=100时要搜100层,但是在较好的情况下,由于满足
X
[
k
]
=
X
[
i
]
+
X
[
j
]
X[k]=X[i]+X[j]
X[k]=X[i]+X[j],i 和 j 可相等,故可以每次翻倍,
1
,
2
,
4
,
8
,
16
,
32
,
64
,
128
1 ,2 ,4 ,8 ,16 ,32 ,64 ,128
1,2,4,8,16,32,64,128,8层就能搜到答案.所以答案的层数应该不深.迭代加深搜索, 代码
2.IDA*dfs有两种分类.1是在图上进行寻找广义最短路,称之为内部搜索,例如迷宫;另一种是将一个图设为一个状态,每次操作对整个图进行变换,寻找最短的变换次数,称之为外部搜索,例如八数码,. IDA*是一种基于迭代加深的启发式算法,一般是对外部搜索问题进行处理.对从初始状态操作到 s t a t e state state对应的操作步数为 u u u,我们要算估价函数 f ( u ) f(u) f(u), f ( u ) f(u) f(u)是我们估计的 s t a t e state state到目标状态的操作距离,这个操作距离在dfs中就是搜索层数. 估价函数性质:要保证
f
(
u
)
<
=
s
t
a
t
e
f(u)<= state
f(u)<=state到终态的距离.等号一般只在已经到达终态时成立 简单的说就是我们开一个估计函数这个估计函数的返回值小于等于真实值这样我们就可以利用这个进行最优化减枝 Booksort
本题可以详细的估算暴搜的复杂度 也就是说一次挪动改变3个后继,设总共不正确后继为 t o t tot tot,则最少需要操作 ? t o t 3 ? ?? = ?? ? t o t + 2 3 ? ?? \lceil \frac{\mathrm{tot}}{3} \rceil \,\,=\,\,\lfloor \frac{\mathrm{tot}+2}{3} \rfloor \,\, ?3tot??=?3tot+2??次,将其设为估价函数 代码
TheRotationGame如下图所示,有一个 # 形的棋盘,上面有 1,2,3 三种数字各 8 个。 这些操作会按照图中字母和箭头所指明的方向,把一条长为 7 的序列循环移动 1 个单位。 例如下图最左边的 # 形棋盘执行操作 A 后,会变为下图中间的 # 形棋盘,再执行操作 C 后会变成下图最右边的 # 形棋盘。 给定一个初始状态,请使用最少的操作次数,使 # 形棋盘最中间的 8 个格子里的数字相同。 输入格式 如果有多种方案,则输出字典序最小的解决方案。
输出样例:
一样用IDA*,此时估价函数为 f ( ) = 8 ? 中 间 8 格 最 多 数 字 的 个 数 f() = 8 - 中间8格最多数字的个数 f()=8?中间8格最多数字的个数.因为每次对一条操作能改变中间8格的一格(看起来是改了两格,但数字只变化了一个),故 f ( ) < = T r u e d i s t a n c e ( ) f() <= Truedistance() f()<=Truedistance(),可以用. 代码
3.双向DFS从两个方向搜索,搜索树会变小.如图 送礼物达达帮翰翰给女生送礼物,翰翰一共准备了 N 个礼物,其中第 i 个礼物的重量是 G[i]。 达达的力气很大,他一次可以搬动重量之和不超过 W 的任意多个物品。 达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。 输入格式 以后 N 行,每行一个正整数表示 G[i]。 输出格式 数据范围
输出样例:
是个背包问题,但是物品质量太大,以背包
O
(
M
N
)
O(MN)
O(MN)的复杂度无法处理. 代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 18:34:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |