zoukankan      html  css  js  c++  java
  • 枚举法

    枚举法

    在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法
    问题解决思路
    思考真正困难所在

    提出较好解决方案

    思想

    将问题所有可能存在的答案一一列举,然后根据条件判断这个答案不是不是合适,是就保留,不是就舍弃

    解题思路

    1. 确定要枚举的对象,范围和判定条件.
    2. 逐一枚举可能的解并验证每个解是不是问题的解.

    枚举算法步骤

    (1)确定解题的可能范围,不能遗漏任何一个真正解,同时避免重复。

    (2)判定是否是真正解的方法。

    (3)为了提高解决问题的效率,使可能解的范围将至最小,

    代码实现

    如果a+b+c=100,而且 a^2+b^2=c^2(a,b,c为自然数),问如何求出所有a,b,c可能存在的组合

    1568818491093

    a,b,c从0开始 枚举法最笨的一个方法

    1. 先让其中一个数去变,其他两个数先不动, 怎么实现?
      嵌套循环
    2. 实现a+b+c=1000,和a*2+b*2=c*2
      写上两个判断,a+b+c=1000,和a*
      2+b**2=c**2 判断条件
    3. 写一个计时器
    import time  #测试时间
    start_time=time.time()
    for a in range(0,1001):
        for b in range(0,1001):
            for c in range(0,1001):
                if a+b+c==1000 and a**2 +b**2==c**2:
                    print(a,b,c)
    end_time=time.time()
    print(f'花费时间{end_time-start_time}')#测试时间
    print('finished')#结束标志
    ##结果
    0 500 500
    200 375 425
    375 200 425
    500 0 500
    花费时间352.2528417110443
    finished
    
    

    思路优化(有了结果不需要判断)

    改进

    因为c==1000-a-b 有了c的结果之后 就不需要再对c进行判断,

    那么直接判断第二个条件,

    import time  #测试时间
    start_time=time.time()
    for a in range(0,1001):
        for b in range(0,1001):
            c=1000-a-b
            if a+b+c==1000 and a**2 +b**2==c**2:
                 print(a,b,c)
    end_time=time.time()
    print(f'花费时间{end_time-start_time}')#测试时间
    print('finished')#结束标志
    ##结果
    0 500 500
    200 375 425
    375 200 425
    500 0 500
    花费时间2.135776996612549
    finished
    
    

    结果分析(缩短近150倍

    花费时间仅需要2s钟,缩短近150倍!!!

    减少350s的时间,只是因为少了一个判断,(每个人电脑性能不一样)

    减少让计算机运算时间

  • 相关阅读:
    CentOS7.0下Zabbix3.4至Zabbix4.0的升级步骤(Proxy)
    CentOS6.5下Zabbix3.0升级到4.0
    kubernetes相关概念
    更新OpenSSL
    fish 常用主题推荐
    [转] Adobe acrobat 破解教程
    [转]latex符号
    bank conflct 一句话总结
    Ubuntu 安装boost 库
    ubuntu 16.04安装nVidia显卡驱动和cuda/cudnn踩坑过程
  • 原文地址:https://www.cnblogs.com/jhpy/p/11567742.html
Copyright © 2011-2022 走看看