枚举

基本思想:枚举思想其实是一种生活的智慧,在实际生活中有着非常广泛的应用。经常遇到这样的情景:忘记了数字密码的最后一位,就从0~9逐个尝试;去提货点取快递,快递员检查完所有包裹才找到属于自己的;在网上买机票,输入日期、起点和终点,就会列出所有的行程方案……以上在进行归纳推理时,逐个考察了某类事情所有可能的情况,并逐一进行检验,这种方法叫作枚举。

        可见,枚举算法就是对问题变量可能解集合的每一个元素,根据问题给定的检验条件判定哪些是成立的,使条件成立的元素即是问题的解。

        例如,对于问题“求小于1000的既是素数又是回文数的整数”,第一步,应先建立一个数学模型,包括问题变量n以及该整数变量需要满足的条件:(1)n不能被[2,n)中的任意一个素数整除;(2)将n的各位数字反向排列所得的自然数n'和n相等;第二步,利用n为素数的条件,可以得到变量n的初步值范围为{2}U{2*I+1|1<=i,2*i+1<1000}。在此范围内按从小到大取值,如果n不能被[2,n)中的任意一个素数整数,则满足条件(1);如果n的各位数字反向排列所得的自然数n‘与n相等,则满足条件(2),这样就可以得到问题的解。

        枚举比较直观,易于理解,是用计算机求解问题最常用的方法之一,常用来解决那些通过公式推导、规则演绎的方法不能解决的问题。而且,由于枚举算法建立在考察所有可能情况和穷举所有状态的基础上,所以算法的正确性比较容易证明。在采用枚举的方法进行问题求解时,要注意以下三个方面的问题。

        (1)建立简洁的数学模型。数学模型中的变量数要尽可能少,且变量之间相应互相独立,这样问题的解的搜索空间的维度就小。反映到程序代码中,循环嵌套的层次就少。模型中的每个条件要反映问题的本质特征。例如,“求小于1000的既是素数又是回文数的整数”中的条件(1)是“n不能被[2,n)中的任意一个素数整除”,而不是“n不能被[2,n)中的任意一个整数整除”。这样条件极大地降低了判断n是否是素数的计算开销。

        (2)减小搜索的空间。利用已有知识,缩小模型中各个变量的取值范围,避免冗余计算。反映到程序代码中,循环体被执行的次数就少。除了2之外的其他素数都是奇数,则“小于1000既是素数又是回文数的整数”一定在集合{2}U{2*I+1|1<=i,2*i+1<1000}中。用这个集合代替[2,1000),搜索空间减少了一半。

        (3)采用合适的搜索顺序。对搜索空间的遍历顺序要与数学模型中的条件表达式一致。例如,在“求小于1000的既是素数又是回文数的整数”中,在判断n是否是素数或n是否是回文数时,可以在变量取值范围内采取从小到大的遍历顺序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值