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

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

🐓 穷举搜索法

什么是穷举搜索法

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

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


穷举搜索法的基本场景

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

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


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


穷举搜索法的基本原理

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


算法设计——穷举搜索法


🐓 代码实例解析

设计思路

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

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

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


解空间(范围内找解)

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


剪枝策略

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


案例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。如果等于,它就将这对数添加到一个列表中。最后,该方法返回这个列表,其中包含了所有满足条件的数对。


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

穷举搜索法的优点

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

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

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


穷举搜索法的缺点

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

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

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


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

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

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

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

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

相关文章
|
2月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
127 6
|
2月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
177 5
|
2月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
146 0
|
2月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
325 0
|
3月前
|
机器学习/深度学习 数据采集 传感器
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
288 0
|
1月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
134 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
2月前
|
存储 机器学习/深度学习 人工智能
软考中级软件设计师专项-数据结构与算法上篇
软件设计师考试数据结构模块涵盖数组、链表、栈、队列、树、图等基础结构及其操作,重点考查二分查找、快排与归并排序、树/图的DFS/BFS遍历算法,要求掌握时间与空间复杂度分析,理解哈希、堆的应用场景,强调通过合理选择数据结构优化程序性能,解决存储管理与计算效率问题,为系统设计奠定核心逻辑基础。
461 1
软考中级软件设计师专项-数据结构与算法上篇
|
1月前
|
机器学习/深度学习 数据采集 负载均衡
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
结合多种启发式解码方法的混合多目标进化算法,用于解决带工人约束的混合流水车间调度问题(Matlab代码实现)
122 0
|
3月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
838 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
1月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法

热门文章

最新文章

下一篇
oss云网关配置