枚举
枚举(Brute-force)是一种通过逐一检查所有可能的解来找到问题答案的方法。
使用场景:
-
问题的解空间较小:例如,数字范围有限、排列组合数量较少等。
-
问题没有明显的优化方向:无法通过其他算法(如贪心、动态规划)快速求解。
-
验证所有可能性:需要穷举所有可能的解,确保没有遗漏。
实现方式
1.简单循环枚举
for i in range(1, 101): if i % 3 == 0 and i % 5 == 0: print(i) # 输出能被3和5整除的数
2.嵌套循环枚举
for i in range(1, 10): for j in range(i+1, 10): print(i, j) # 枚举所有不同的i和j
3.递归枚举
def enum(n, current): if current == n: print(current) return for i in range(current, n+1): enum(n, i+1) enum(3, 1) # 枚举1到3的排列
应用示例
密码破解:枚举所有可能的密码组合,直到找到正确的密码:
from itertools import product def brute_force_password(): chars = 'abcdefghijklmnopqrstuvwxyz' for length in range(1, 5): # 尝试长度为1到4的密码 for pwd in product(chars, repeat=length): password = ''.join(pwd) if verify_password(password): # 假设verify_password是验证函数 return password
寻找最大值:枚举所有可能的子数组,找到最大和:
def max_subarray_sum(arr): max_sum = float('-inf') n = len(arr) for i in range(n): current_sum = 0 for j in range(i, n): current_sum += arr[j] if current_sum > max_sum: max_sum = current_sum return max_sum
排列组合问题
from itertools import permutations def find_permutations(arr): perms = permutations(arr) for p in perms: print(p)
枚举的局限性
枚举方法的局限性主要体现在以下方面:
-
时间复杂度高:对于大规模问题,枚举可能需要极长的时间。
-
空间复杂度高:某些情况下需要存储大量中间结果。
-
不适用于动态问题:枚举方法通常无法处理实时变化的解空间。