算法优化:递归算法的优化策略

在处理算法问题时候,用的非常多的一种策略就是递归算法了。但是递归算法虽然简单有效,但是该算法的算法效果总是有点差强人意。本文主要讲述从两个方向优化递归算法,希望本文能给读者一些thinking。(持续更新中…)


文章目录

  • 算法优化:递归算法的优化策略
  • 一、递归算法介绍
  • 二、递归算法的分析及优化
    • 1.1递归算法举例:斐波那契
    • 1.2斐波那契优化(动态规划)
    • 2.1递归算法举例:n^m问题
    • 2.2 优化n^m问题(二分策略)
  • 总结

一、递归算法介绍

示例:递归算法我又把它称为迭代算法,因为大致思路都差不多(迭代:从已知推未知 递归:从未知回溯到已知,再推未知)。都是不断地重复若干个较为简单的问题,最终得到理想结果的一种算法思路。(下文中并未严格区分递归和迭代)

二、递归算法的分析及优化

1.1递归算法举例:斐波那契

首先先拿斐波那契数列来举例说明(示例):

public int Fibonacci(int n){if(n<0)return 0;if(n==0)return 1;if(n==1)return 1;return Fibonacci(n-1)+Fibonacci(n-2);}

此时该算法的公式为:F(n)=F(n-1)+F(n-2)+1,对应的时间复杂度为O(2^n)。具体可参考
https://blog.csdn.net/beautyofmath/article/details/48184331。
而造成这算法的时间复杂度如此之高的原因就是存在大量的冗余计算。其中F(n)被计算1次,F(n-1)被计算一次,F(n-2)被计算两次,Times(F(n-3)) = Times(F(n-1))+Times(F(n-2))…
若想提升这类算法的效率的话,必不可少的就是减少这些冗余计算。而想解决冗余此时需要读者想到“空间换时间、时间换空间”这个策略了。本算法所借助的就是“空间换时间”策略。

1.2斐波那契优化(动态规划)

代码如下(示例):

public int Fibonacci(int n) {if(n <= 0){return 0;}if(n==1 || n==2){return 1;   }int []ret = new int[n + 1];ret[0] = 0;ret[1] = 1;for(int i = 2; i <= n; i++){ret[i] = ret[i - 1]+ret[i - 2];}return ret[n];}

本优化算法就是采用空间换时间的思想解决斐波那契高冗余计算。并且由Times(F(n-2)) = Times(F(n))+Times(F(n-1))可知,越底层的计算,其迭代次数越高
主要思路:将高冗余的属性加入到一个数组中。用O(1)->O(n)的空间复杂度代价,换取时间复杂度从O(2^n)->O(n)


2.1递归算法举例:n^m问题

实现 pow(x, n) ,即计算 x 的 n 次幂函数。代码示例:

public static double myPow(double x, int n) {if(x==0)return 0;if(x==1)return 1;if(n==0)return 1;if(n>0){return myPow2(x,n);}else{return 1/myPow2(x,-n);}}public static double myPow2(double x, int n) {if(n==1)return x;return x*myPow2(x,n-1);}

此时该算法的公式为:F(n)=F(n-1)+1,对应的时间复杂度为O(n)。
此时该问题并不存在冗余计算的问题,无法使用动态规划思想。并且使用动态规划解决问题的最小时间复杂度都需要O(n)。但是此时的时间复杂度已为O(n)。若优化则量级上只能将其优化为O(log n)或者O(log log n)。而若提到O(log n)的时间复杂度,则必须想到二分查找算法。本算法的优化策略即由此展开的。

2.2 优化n^m问题(二分策略)

优化代码如下(示例):

public double myPow(double x, int n) {if(x==0)return 0;if(x==1)return 1;if(n==0)return 1;if(n==1)return x;if(n==-1)return 1/x;double half = myPow(x,n/2);double rest = myPow(x,n%2);return rest*half*half;}

本优化算法采用二分策略跳过无用计算从而提升效率。
主要思路:因为本题中F(n)不止和F(n-1)有直接关系,和F(n/2)、F(n/3)也有之间关系。因此针对这种问题可以采用二分策略提升算法效率。此时时间复杂度从O(n)->O(log n)


总结

上文是针对迭代算法的优化策略:动态规划和“二分策略”。
动态规划思想:动态规划针对求解的问题可以划分为一系列相互联系的阶段, 在每个阶段都需要作出决策,且一个阶段决策的选择会影响下一个阶段的决策, 从而影响整个过程的活动路线, 求解的目标是选择各个阶段的决策使整个过程达到最优。
前提条件:但是使用动态规划处理有一重要:“该问题需要满足最优子结构”。
而迭代问题大都满足此条件,因此若需要针对递归问题的优化策略。首推动态规划。
.
.
二分策略:在需要将算法从O(n^2)->O(nlog n)或者从O(n)->O(log n)时候。此时一定要想到二分策略。而针对递归问题时候,可以思考F(n)是否和F(n/2)直接有关;若直接有关,那恭喜。二分策略一定能给你一个满意的优化方案。

算法优化:递归算法的优化策略相关推荐

  1. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略

    在前面两篇文章中,我们用一个框架梳理了各大优化算法,并且指出了以Adam为代表的自适应学习率优化算法可能存在的问题.那么,在实践中我们应该如何选择呢? 本文介绍Adam+SGD的组合策略,以及一些比较 ...

  2. 优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)

    优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)python实现     整个代码文字讲解共17页 提示:专栏解锁后,可以查看该专栏所有文章. 文章目录 策略1:在位置更 ...

  3. 【优化算法】基于matlab反向策略的麻雀搜索算法【含Matlab源码 1918期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab反向策略的麻雀搜索算法[含Matlab源码 1918期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

  4. 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

    综述 因为我个人最近在从事可能是AI领域对性能挑战最大的方向,自动驾驶领域,所以对整个深度学习训练的优化尤为关注,最近一直在学习相关内容,谨以此篇文章做一个总结. 我一直很看好深度学习训练优化这个方向 ...

  5. 多目标粒子群优化算法_基于粒子群优化的投资组合优化研究

    原文链接: 基于粒子群优化的投资组合优化研究​tecdat.cn 我今年的研究课题是使用粒子群优化(PSO)的货币进位交易组合优化.在本文中,我将介绍投资组合优化并解释其重要性.其次,我将演示粒子群优 ...

  6. 算法代码_Python进化算法之多目标优化与代码实战

    前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...

  7. 智能优化算法:白鲸优化算法-附代码

    智能优化算法:白鲸优化算法 摘要:白鲸优化算法([Beluga whale optimization,BWO)是由是由 Changting Zhong 等于2022 年提出的一种群体智能优化算法.其灵 ...

  8. 系统性能优化的十大策略(强烈推荐,建议收藏)

    点击关注公众号,实用技术文章及时了解 上篇 提升系统性能,榨干计算机资源是程序员的极致追求,今天跟大家聊聊性能优化.分为上中下三篇,由浅及深的写了关于性能优化的方方面面,并不仅仅局限于代码层面,希望小 ...

  9. 基于改进鲸鱼优化算法的WSN覆盖优化

    文章目录 一.理论基础 1.WSN节点覆盖模型 2.基本鲸鱼算法 3.改进鲸鱼优化算法 (1)量子位Bloch球面初始化 (2)改进搜索猎物过程 (3)莱维飞行扰动策略 二.算法流程 三.仿真实验与分 ...

最新文章

  1. php mysql编译安装目录_Linux下Apache PHP MySQL默认安装路径
  2. 土木工程计算机仿真学科未来前景,土木工程的发展现状与未来发展趋势
  3. Linux中 set、env、declare、export显示shell变量的区别
  4. 数据结构--单向链表
  5. Excel Chart
  6. 【网络】c++ socket 学习笔记(一)
  7. 经典面试题(17):以下代码将输出的结果是什么?
  8. gridview 通用分页实现
  9. Linux 服务器惊现比特币勒索事件,腾讯云安全专家来支招
  10. 圆角ImageView
  11. american fuzzy lop 介绍
  12. Visual Studio 2013 突然不高亮,编译报错
  13. 如何自学python-如何自学python语言
  14. 关于ASP调用.net WebService 的标准例子
  15. 下载dns linux命令,linux dns 部署命令(示例代码)
  16. 计算机打印东西怎么横向打印机,打印机横向打印怎么设置,打印机不能横向打印...
  17. 思科交换机IOS备份和升级
  18. laravel跨域问题
  19. 软件测试用户场景分析写什么,用户研究 | 研究人员必备的52个用研名词
  20. 查看电脑是否安装openCV环境以及其版本

热门文章

  1. mysql 类似于check_【小白福利—初级DBA入门必看】MySQL常用工具介绍(六)——客户端工具MySQL_check...
  2. IT人的那些风花雪月
  3. xinjun与阴阳师
  4. js 阿拉伯数字变大写
  5. 百度mysql_如何连接百度Mysql_MySQL
  6. c语言程序运行内存图解,从执行速度和内存使用等方面来优化C语言代码
  7. 用一张思维导图去全面学习通信网里的各种技术
  8. 【MySQL】查看数据库状态
  9. BppAttack:通过图像量化和对比对抗学习来攻击深度神经网络
  10. 低耦合高内聚 原则的应用