搜索引擎进行信息检索的优化策略方法(编程找出所有可行道路中没有重复的点怎么办?)
优采云 发布时间: 2022-03-24 01:01搜索引擎进行信息检索的优化策略方法(编程找出所有可行道路中没有重复的点怎么办?)
什么是搜索?搜索就是不断地寻找一个问题的可行解,然后找到最优可行解。搜索被称为“通用问题解决”,但在大多数情况下,搜索所需的时间复杂度很高。搜索一般分为:深度优先搜索(DFS)和广度优先搜索(BFS)。回溯算法 一般的深度优先搜索问题需要回溯算法。每次遍历不能继续,就回溯到上一点,继续遍历。例1:走迷宫的问题(进阶版) 有am*n-square的迷宫(意思是m行n列),有的可以走,有的不能走。如果你用1表示你可以去,0表示你可以' t go 将文件读入m*n个数据和起点和终点(起点和终点都是用两个数据描述的,分别代表这个点的行号和列号)。现在让你编程找出所有可行的道路,要求你行驶的道路上没有重复的点,你只能在四个方向上行驶:上、下、左、右。如果没有一条路径是可行的,则输出相应的信息(使用-1表示没有路径)。例1分析,当我们使用深度优先搜索扩展一个点时,我们按照深度优先搜索向四个方向扩展,但是注意一些已经访问过的点不能再次通过。到达目标点时,不展开,计数器加一,输出答案,并进行回溯。当当前点无法继续展开时,返回上一个节点展开。搜索的优化方法 Search method 深度优先搜索的优化 自定义回溯边界条件,剪除不能得到最优解的子树,并使用memoization方法使部分遍历的子树不被重复遍历,以减少遍历的总状态数。2:订单(ceoi 测试题) 一位店长按照标签的字母顺序对所有商品进行了分类。并使用 memoization 方法使一些遍历的子树不被重复遍历,以减少遍历的状态总数。2:订单(ceoi 测试题) 一位店长按照标签的字母顺序对所有商品进行了分类。并使用 memoization 方法使一些遍历的子树不被重复遍历,以减少遍历的状态总数。2:订单(ceoi 测试题) 一位店长按照标签的字母顺序对所有商品进行了分类。
所有具有相同首字母的货物都存放在同一个仓库中,该仓库也标有该字母。某天,经理收到并登记了许多订单,每个订单只需要一种商品。您已经知道经理当天需要处理的所有订单,但您不知道它们的注册顺序。计算所有可能的仓库访问权限,以解决经理当天的所有订单。输入文件 ORDERS.IN 中只有一行,其中收录所有必需项目的编号(以随机顺序)。每种商品由其标签的第一个字母表示,仅使用英文小写字母。订单数量不超过 200 输出文件 ORDERS.OUT 是收录经理访问仓库的所有可能的订单。示例 Order.inorder。out bbjdbbdj jdbb分析 因为题目要求我们输出所有可能的注册顺序,而且数据范围不大,不难看出是搜索题。由于方案的数量可能比较多,所以没有必要保存所有的方案。因此,我们应该使用深度搜索并将它们放在一边。一般来说,要确定某个顺序的第一个位置的字母,我们从“a”开始,到“z”循环,依次搜索,看看哪个字母可以再次被选中。当可选字母的个数比较少,可选字母中的每个字母可以被选择的次数较多时,每个循环的扫描次数较多。的。我们可以对这种情况进行优化如下:输入完成后,先统计各种字母的总数,
这样可以保证每次循环扫描到的字母都是可选的,搜索中几乎没有多余的操作。搜索剪枝 在很多情况下,我们找到了一套比较好的解决方案。但是电脑还是会搜索比它“更糟糕”的其他解决方案,只能搜索后返回。为了避免这种情况,我们需要灵活地自定义回溯搜索的边界。剪枝2、准确性:在保证第一原则的情况下,尽量剪掉不收录最优答案的分支3、效率:通过剪枝,必须能够实现更快 逼近最优解 常见剪枝最优性 剪枝示例 3:计算机网络连接 (gdoi) If n(n=kx, 那么这个方案的总长度一定不能小于kx,那么就不需要再进一步搜索了,直接替换下一个节点继续搜索即可。优化路径A1-A2-…An和路径An-An-1-…A1这两条路径是“正负”关系,本质上是一样的,所以我们可以规定起点总是小于终点的下标。优化3 如果路径的ABCD的长度=n/2,x至少要乘1倍才能达到n,所以这种情况下,前面的剪枝效果很低。不难发现,如果x>=n/2,那么要相乘的数其实是小于n/2的,而且之前也计算过要相乘的数,所以可以考虑用动态规划求最优解,
示例 6:彩票问题 如果 1/A1+2/A2+…+1/An=X/Y,则中奖(获得纪念品)。输出:要准备的纪念品数量从以上两个问题,我们学习了可行性剪枝和最优剪枝的应用和技巧。其实除了上面的一些剪枝,还有其他的剪枝技术。分析:对于每一个数字,有两种可能选择和不选择。显然,可以建立以下模型: 这变成了一个01背包问题。每个包裹的体积为 T。从 M 中选择 N 填满方框。找出选项的数量。如何优化?? T]=min{f[i-1,T],f[i-1,TT ]+1} 按照 x 的顺序搜索。假设x,如果f[p-1,TS]+L>N,那么可以不继续搜索就回溯。T~O(米!)。太大!f数组打不开,时间不允许。动态规划的思想,空间矛盾太大,抓住矛盾:解决空间问题!T太大了,有什么办法可以变小吗?=T,至少有多少x T]=min{f[i-1,T],f[i-1,TT T]=min{f[i-1,T],f[i-1,( TT )modP]+1} 顺序搜索。假设x,如果f[p-1,(TS)mod P]+L>N,那么可以不继续搜索就回溯。剪枝效果减弱但空间复杂度降低到O(mP),其中P可以任意选择。
广度优先搜索 当状态数较多时,可以采用循环队列或动态链表来处理广度优先搜索。黑白棋游戏的棋盘由 44 个方格组成。棋盘的每个方格都有一个棋子,有8个白棋子和8个黑棋子。16 个棋子的每一个位置构成一个游戏状态。棋盘上有 1 个公共边的 2 个方格称为相邻方格。一个方格最多可以有 4 个相邻方格。在黑白棋游戏中,每一步都可以交换任意两个相邻的方格。对于给定的初始游戏状态和目标游戏状态,程序计算从初始游戏状态变为目标游戏状态的最短移动序列。例7:黑白棋游戏(进阶版) 我们可以考虑用深度优先搜索来做这道题,但是如果之前的状态出现在下一步呢?直接判断时间复杂度可能有点大。这个问题的最佳解决方案是使用广度优先搜索。我们可以有初始状态,并根据广度优先搜索遍历扩展每个点,从而达到目标状态的步数是确定的。是最优的(随着步数的增加单调)。但问题是,如果出现重复的情况,我们要判断权重,但是简单的判断可以达到状态数的级别。其实我们可以考虑使用哈希表来判断权重。例7:黑白棋游戏(进阶版) 哈希表:思路是直接根据键码值进行访问。即,将键值映射到表中的某个位置以访问记录的过程。
那么这两点不需要扩展,两个扩展步骤之和就是答案。不必要的状态广度优先搜索的优化注意:一般的广度优先搜索可以通过这两个优化来解决。例8:pku1729在一个N*N(N>Time[n](Time[i]代表处理器的处理时间)中,这样可以设置阈值:例如当前处理器的处理时间>= 当前最佳解决方案,或剩余处理器数量中前一个处理器的处理时间