【算法】【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 代码 我就不写了 ,今天 投个懒 先到这里
最后小结 --- 关于算法复杂度


浙公网安备 33010602011771号