枚举算法

 说明:由于要准备期末,这篇笔记就不敲代码了,之后会补上

枚举算法,也被称为穷举算法,是一种解决问题的方法。它通过枚举所有可能的情况来找出问题的解
它的主要思想是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它

枚举算法的基本步骤如下 :

  1. 确定解题的可能范围:不能遗漏任何一个真正解,同时避免重复。
  2. 判定是否是真正解的方法:为了提高解决问题的效率,使可能解的范围将至最小。
  3. 逐一枚举可能的解并验证每个解是否是问题的解:在逐一列举的过程中,将它们逐一与目标状态进行比较以得出满足问题要求的解。

例如,假设我们有一个问题,要求我们找出所有可能的排列组合,使得其中的数字之和等于给定的总和。
在这种情况下,我们可以使用枚举算法,逐一列举所有可能的排列组合,然后检查它们的和是否等于给定的总和。

枚举算法的优点在于它的实现简单,对于一些特定的问题,它的效果非常好。
但是,由于它需要枚举所有可能的解,所以当问题的规模变大时,循环的阶数越大,执行速度越慢
应用场景

  1. 表示有限的离散状态:例如表示方向(上、下、左、右)、星期几、性别等
  2. 替代常量的魔法数值:用有意义的名称代替不清晰的数值,提高代码可读性

限制

  1. 时间复杂度高:枚举算法的时间复杂度通常较高,因为它需要枚举所有可能的情况。
    随着问题规模的增大,枚举所有情况可能并不太现实,这个时候需要考虑其他更有效的算法
  2. 不适合求解复杂问题:枚举算法主要适用于问题的解空间较小且可枚举的情况。
    对于复杂的问题,枚举算法可能无法找到最优解,甚至可能找不到解

枚举算法的核心思想是通过列举问题的所有状态,将它们逐一与目标状态进行比较,从而得到满足条件的解
当问题规模较大时,枚举算法的效率通常较低
以下是一些常见的枚举算法优化方法:

  1. 能算则算:可以通过必要的计算规避一些不必要的枚举。

  2. 能存则存:可以通过储存更多的信息来避免重复计算。
    例如,要想枚举满足条件的所有区间,最常见的枚举方法就是分别枚举区间的左右端点。
    我们可以通过储存左右端点的信息来避免重复计算

  3. 针对问题特征,优化对象模型:针对问题的特性,优化对象模型,以提高枚举算法的效率

  4. 针对对象特征,优化列举和验证过程:针对对象的特性,优化列举和验证过程,以提高枚举算法的效率

  5. 桶数组:当需要对某个状态判定是否存在、次数、排序的时候,如果状态空间在某个范围以内,就可以使用桶数组。
    例如,砝码称重,总重量<=1000克,就可以用to[1005]作为桶数组,下标表示某个总重量,初始值为0表示不能被砝码组合而成,值为1表示能被砝码组合而成

posted @ 2023-12-12 22:14  0214jx  阅读(115)  评论(0)    收藏  举报