【算法】【python】 循环遍历和动态规划配合python装饰器的简单用法 (故事不错)

关键词 : 动态规划算法,python装饰器,备忘录算法 ,时间复杂度,递归函数, 

原文内容来自于  :

 

三篇文章 主要讲了循环遍历 (原始的 约为 O(N^2),调整后可以做到 O(1)) 和 递归分解 (O(2^N) )的思路 ,为了有效降低时间复杂度,后者引入了 备忘录算法 , 避免重复计算一些中间值 ,看这张图可能一下就明白了 。

 

 

我自己python 代码 

循环遍历的我就不写了 , 主要练习 递归+ 备忘录算法 ,我的备忘录算法,是通过 python 装饰器实现的  ,关于 装饰器用作什么和怎么用 可以参考这个:

https://www.jb51.net/article/134598.htm

自己的代码 如下 :

 

# *-* coding:utf-8 *-*
# python 3
# allen  20190108
# test 动态规划  

def step(n):
    if n==1:
        return n
    elif n==2:
        return 2
    else:
        return step(n-1)+step(n-2)

print(step(1))             
print(step(2))
print(step(3))
print(step(10))
print(step(22))
print ('ok')

# 以上算法 属于最最原始的模型 ,如果 n+1 的情况都是分解成原来的 n 和 n-1 两个函数相加 
# 那么 粗略的n越大, 就越是接近 o(2^n) 的时间复杂度
# 我曾经调用了一个 step(100),就让 python进程卡住了 
# https://blog.csdn.net/baidu_37107022/article/details/73189125 
# 这里提供了一些简化方式  备忘录算法 

from functools import wraps  # 固定写法
# memo, wrap , func  args  
def memo(func): 
    cache={}
    @wraps(func)
    def wrap(*args):
        if args not in cache:
            cache[args]=func(*args)
        return cache[args]
    return wrap

@memo
def fib(i):
    if i<=2: return i
    return fib(i-1)+fib(i-2)
print (fib(1))
print (fib(2))
print (fib(3))
print (fib(10))
print (fib(22))
print (fib(100))
# memo 这个来自于 http://python.jobbole.com/81465/
# 复杂度分析 
# 2个 n-2, 3个n-3, 4个n-4的情况, 粗略计算 时间复杂度  约为 O(n^2)

装饰器函数 ,我用的也很不熟练, 差不多独立写的第三遍 ,才一次写对 

金矿问题 

 这里 简单说一下 递归法 的思路 ,就是 先分别假设 350/3 这个金矿  是否选中的两种情况, 即 方向 1 :剩下7人 在剩余的4个金矿中 找出最佳方案    vs 方向2  剩余10人 在剩余4座金矿中 寻求最佳方案  当然 后边两个方向自然是会有继续 递归下去   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 算法 的原理表述 就是 :

python 代码 我就不写了 ,今天 投个懒 先到这里 

最后小结 --- 关于算法复杂度

 

posted @ 2019-01-08 17:16  allen514519  阅读(732)  评论(0)    收藏  举报