【软件设计师】常见的算法设计方法——穷举搜索法

2024-03-07 11:44

本文主要是介绍【软件设计师】常见的算法设计方法——穷举搜索法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 🐓 穷举搜索法

什么是穷举搜索法

穷举搜索法,又称枚举法穷举法,是一种编程中常用到的问题求解方法。当找不到解决问题的规律时,穷举搜索法会对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。

穷举搜索法的基本思想是列举出所有可能的情况,逐个判断哪些情况符合问题所要求的条件,从而得到问题的全部解答。这种方法利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。

穷举搜索法的基本场景

穷举搜索法的基本场景通常涉及以下两个方面:

问题所涉及的情况:在穷举搜索法中,首先需要明确问题所涉及的所有可能情况。这些情况的种数必须可以确定,并且需要被一一列举出来。既不能重复,也不能遗漏。例如,如果问题是求解一个特定数学方程的所有整数解,那么就需要列举出所有可能的整数,并检查哪些整数满足方程的条件。

答案需要满足的条件:在列举出所有可能的情况后,需要分析这些情况需要满足什么条件才能成为问题的答案。这些条件可能包括数学公式、逻辑关系、约束条件等。例如,在求解数学方程的情况下,答案需要满足方程等于零的条件。

穷举搜索法的基本原理

穷举搜索法的基本原理是通过列举所有可能的情况来找到满足特定条件的解。这种方法基于这样一个概念:如果一个问题的解空间是有限的,那么通过逐一检查每一个可能的解,最终一定能够找到所有满足条件的解。

算法设计——穷举搜索法

 🐓 代码实例解析

设计思路

使用穷举法解决问题,基本上就是以下两个步骤:

确定问题的解(或状态)的定义、解空间的范围以及正确解的判定条件;

根据解空间的特点来选择搜索策略,逐个检验解空间中的候选解是否正确;

 解空间(范围内找解)

解空间就是全部可能的候选解的一个约束范围,确定问题的解就在这个约束范围内,将搜索策略应用到这个约束范围就可以找到问题的解。

剪枝策略

对解空间穷举搜索时,如果有一些状态节点可以根据问题提供的信息明确地被判定为不可能演化出最优解,也就是说,从此节点开始遍历得到的子树,可能存在正确的解,但是肯定不是最优解,就可以跳过此状态节点的遍历,这将极大地提高算法的执行效率,这就是剪枝策略,应用剪枝策略的难点在于如何找到一个评价方法(估值函数)对状态节点进行评估。

案例1

鸡兔同笼问题。有鸡和兔在一个笼子中,数头共 50 个头,数脚共 120 只脚,问:鸡和兔分别有多少只?

情况一:盲目搜索

假设买 x 鸡,y 只兔,使用代码求解如下:

for x in range(1, 51):for y in range(1, 51):if x + y == 50 and 2*x + 4*y == 120:print x, y
情况二:启发搜索

假设买 x 鸡,y 只兔,使用代码求解如下:

for x in range(1, 51):if 2*x + 4*(50-x) == 120:print x, 50-x

案例2

找出给定整数数组中所有可能的两个数之和的组合

import java.util.ArrayList;  
import java.util.List;  public class ExhaustiveSearchExample {  public static void main(String[] args) {  int[] numbers = {1, 2, 3, 4, 5};  List<int[]> allSumCombinations = findAllSumCombinations(numbers, 10);  for (int[] combination : allSumCombinations) {  System.out.println("(" + combination[0] + ", " + combination[1] + ")");  }  }  public static List<int[]> findAllSumCombinations(int[] numbers, int targetSum) {  List<int[]> combinations = new ArrayList<>();  for (int i = 0; i < numbers.length; i++) {  for (int j = i + 1; j < numbers.length; j++) {  if (numbers[i] + numbers[j] == targetSum) {  combinations.add(new int[]{numbers[i], numbers[j]});  }  }  }  return combinations;  }  
}

代码运行结果及解释

(1, 9)  
(2, 8)  
(3, 7)  
(4, 6)  
(5, 5)

findAllSumCombinations方法使用了两层循环来穷举数组中所有可能的数对。对于每一对数(numbers[i]numbers[j]),它检查它们的和是否等于targetSum。如果等于,它就将这对数添加到一个列表中。最后,该方法返回这个列表,其中包含了所有满足条件的数对。 

 🐓 穷举搜索法的优缺点及注意事项

穷举搜索法的优点

直观易懂:穷举搜索法通常基于问题的直接描述,易于理解和实现。

正确性保证:由于穷举搜索法会检查所有可能的解,因此它能够确保找到问题的最优解(如果存在的话)。

适用性广泛:这种方法适用于许多问题,特别是那些没有更简单或更有效算法可用的问题。

穷举搜索法的缺点

计算量大:穷举搜索法需要检查所有可能的解,因此计算量通常很大,尤其是在问题规模较大时。

效率低下:由于需要检查大量解,穷举搜索法通常非常耗时,可能在现实应用中不可行。

资源消耗多:在处理大规模问题时,穷举搜索法可能需要大量的内存和计算资源。

使用穷举搜索法需要注意的问题

问题规模:在使用穷举搜索法之前,需要仔细评估问题的规模。如果问题规模太大,穷举搜索法可能不是一个好选择。

优化技巧:尽管穷举搜索法本身可能效率低下,但可以通过一些优化技巧(如剪枝、排序、哈希等)来减少计算量和提高效率。

利用问题特性:在某些情况下,可以利用问题的特性(如对称性、单调性等)来减少搜索空间或优化搜索过程。

考虑其他算法:如果穷举搜索法不切实际,可能需要考虑使用其他更高效的算法来解决问题

 🐓 LeetCode练习传送门

1. 两数之和 - 力扣(LeetCode):给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回它们的数组下标。

LCR 083. 全排列 - 力扣(LeetCode):给定一个没有重复数字的数组,返回其所有可能的全排列。

LCR 081. 组合总和 - 力扣(LeetCode):给定一个无重复元素的数组 candidates 和一个目标数 target,找出 candidates 中所有可以使数字和为 target 的组合。

LCR 033. 字母异位词分组 - 力扣(LeetCode):给定一个字符串数组,将字母异位词组合到一起。字母异位词指字母相同,但排列不同的字符串。

91. 解码方法 - 力扣(LeetCode):给定一个经过编码的字符串,返回它有多少种解码方法。

这篇关于【软件设计师】常见的算法设计方法——穷举搜索法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783395

相关文章

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分