
搜索
文章平均质量分 89
搜索算法整理
as_sun
这个作者很懒,什么都没留下…
展开
-
BFS——多源BFS+双端队列BFS
另外我们再来看看这里要求的量,一个是求最小的操作次数,另一个是求字典序最小的操作序列,这里为了得到字典序最小的操作序列,实际上我们按照ABC的顺序来更新,再将更新到的序列放入队列即可。按照这个图就很明显,每个点只有四个点是可以到的,那么我们就来思考一下如果这四个方格中的线的路径与给定的相同,那么显然就不用操作,否则就要进行一次操作,所以我们到下一个点的边权可能是1,也可能是0,为了保证队列的单调性就不能直接放队尾,那么我们可以直接令为0的时候从队头插入,为1的时候从队尾插入,那么可以用双端队列实现。原创 2024-02-02 20:42:53 · 453 阅读 · 0 评论 -
BFS的基本应用——flood fill && 最短路
bfs的核心就是一层一层往外扩展,在bfs中会用到一个队列,又由于是一层一层往外扩展的,故而可以用来求连通的问题,同时相当于每次往外扩展的边权都是1,所以这个队列是有序的,相当于dijkstra算法中的优先队列,那么也可以用来求边权为1的最短路问题。原创 2024-02-01 20:23:15 · 993 阅读 · 0 评论 -
DFS——连通性和搜索顺序
有内部搜索和外部搜索两种,内部搜索是在图的内部,内部搜索一般基于连通性,从一个点转移到另一个点,或者判断是否连通之类的问题,只需要标记避免重复访问即可,不需要还原状态,而外部搜索则是将一张图视为一种状态,每一个状态延伸得到新的状态,要保证每个状态往外延伸时都是相同的,那么就需要还原状态。思路:如果我们将第一个数放在第一组,那么遍历后面的数,如果不与第一组中的数互质,那么就可以放进这一组,否则就只能新开一组,如此递归来实现,就可保证将所有的数都分好组,同时是分组最少的。1116. 马走日(原创 2024-02-04 23:01:35 · 674 阅读 · 0 评论 -
DFS——剪枝
这里我们可以用一个二进制数来表示每行每列每个3*3的方格中的状态,比如,对于第i行,我们用row[i]表示一个二进制数,这个二进制数中如果某一位上是1,那么就说明这一位对应的数可以填进这一行,那么对于一个空格,我们只要将它的行列以及一个3*3的方格中的状态求&,那么就可以获得这个位置可以填哪些数,求&之后的结果是一个二进制数,所以我们要想得到每一位具体填什么还需要再处理一下。1.优化搜索顺序,对应到这道题就是先搜重的猫还是先搜轻的猫,显然先搜重的猫比较好,因为重的猫可以占掉更多的空间,让后面的情况少一些。原创 2024-02-07 22:16:25 · 1766 阅读 · 0 评论 -
BFS——双向广搜+A—star
可以这么来理解,如果我们在行内进行移动,实际上并没有改变序列,也就是并未改变逆序对数量,如果在行与行之间进行移动,那么相当于只改变了它前面或者后面两个数的位置,我们以一种情况为例,它实际上就只改变了3个数内部的相对顺序,所以实际上逆序对的数量要么不变要么就多2或者少2,所以起始状态和结束状态中逆序对的奇偶性相同,我们可以顺序排列的时候逆序对的数量是0,那么起始状态中逆序对的数量应该是偶数。有时候从一个点能扩展出来的情况很多,这样几层之后搜索空间就很大了,我们采用从两端同时进行搜索的策略,压缩搜索空间。原创 2024-02-04 18:28:27 · 1203 阅读 · 0 评论 -
DFS——迭代加深、双向DFS、IDA*
迭代加深主要用于dfs搜索过程中,某条支路特别深,但是答案在特别浅的地方,也即在另一个分支中,但是按照dfs的原理,我们是将这条支路搜完才去搜另一条支路。所以我们就要及时剪枝,而迭代加深算法则是指定搜索层数,一旦某个分支搜索的上限达到这个搜索层数了,那么我们就直接剪枝,不再往后搜了。如果当前指定的层数不能搜到结果,那么我们将指定层数再扩大一点。这里就会有疑问,如果答案在第10层,那么0-9层都是冗余搜索,但是实际上,0-9层的搜索规模相对于第10层来说微不足道,主要的复杂度还是以第10层为主。原创 2024-02-08 18:34:05 · 1192 阅读 · 0 评论