>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 25264 个阅读者 刷新本主题
 * 贴子主题:  算法的概念、特征和基本类型简介 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-03-15 15:28:33     消息  查看  搜索  好友  邮件  复制  引用

        有基本运算和规定的运算顺序所构成的完整的解题步骤,称之为算法。

          它是一系列的解决问题的清晰指令。代表着就系统的方法解决问题的策略机制。对于  一个规范的输入,在有限的时间内得到相应的输出。算法的好坏可以用时间复杂度和  空间复杂度来衡量。        

算法特征

         一般算法有7个重要特征,它可以用自然语言,伪代码,流程图来表示。

         ps:伪代码是介于自然语言和机器语言之间的文字和符号。

         例如:

         输入 A B C

         if A>B 则 A ->max;

         否则   B->max;

         1 有穷性

         算法的用穷性是指算法必须要在有限个步骤里完成

         2 确切性

         确切性是值算法的每一步都必须有确切的定义

         3 输入项

         任何算法必须要有0个或多个输入,以刻画运算对象的基本情况,所谓0个输入是指算法本身给出了初始条件

         4 输出项

         一个算法必须有一个或多个输出,以反映对输入数据的加工结果。没有输出的算法是没有任何意义的

         5 可行性

         算法中执行的任何计算步骤都是可以分解为基本的可执行的操作步,每个计算步骤都可以在有效时限内完成

         6 高效性

         执行速度快,占用资源少

         7 健壮性

         对数据响应正确        

时间复杂度和空间复杂度

         时间复杂度指 执行算法所需要的时间。一般来说,时间算法是问题规模n的函数f(n),算法的时间复杂度也因此记作T(N)=O(f(n));

         空间复杂度指 算法需要消耗的内存空间。        

基本算法

                1.递推法

             递推 算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法.

             递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。

             2.递归法

             程序调用自身的编程技巧称为递归 ( recursion)。 一个过程或函数 在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句 来定义对象的无限集合 。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

             3.穷举法

             穷举法,或称为暴力破解 法,是一种针对于密码破译 方法,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字 组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。因此有些人运用计算机来增加效率,有些人辅以字典 来缩小密码组合的范围。

             4.贪婪算法

             贪婪算法 是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。 贪婪算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准。然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量。如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。 对于一个给定的问题,往往可能有好几种量度标准。初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。 一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。最优解可以通过一系列局部最优的选择即贪婪选择来达到,根据当前状态做出在当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子问题。每做一次贪婪选择就将所求问题简化为一个规模更小的子问题,最终可得到问题的一个整体最优解。

             5.分治法

             分治法 是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

             分治法所能解决的问题一般具有以下几个特征:

             (1) 该问题的规模缩小到一定的程度就可以容易地解决(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。(3) 利用该问题分解出的子问题的解可以合并为该问题的解;(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

             6.动态规划法

             动态规划 是一种在数学和计算机科学 中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。

             动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析 处理,以丰富的想象力去建立模型,用创造性的技巧去求解。

             7.迭代法

             迭代法 也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

             8.分枝界限法

             分枝界限法是一个用途十分广泛的算法,运用这种算法的技巧性很强,不同类型的问题解法也各不相同。分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。该算法在具体执行时,把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界 (称为定界)。在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支。这样,解的许多子集(即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围。这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限。因此这种算法一般可以求得最优解。 与贪心算法 一样,这种方法也是用来为优化 问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度 比贪婪算法高,但它的优点是与穷举法 类似,都能保证 求出问题的最佳解,而且这种方法不是盲目 的穷举搜索,而是在搜索过程中通过限界 ,可以中途停止对某些不可能得到最优解的子空间进一步搜索(类似于人工智能中的剪枝),故它比穷举法效率 更高。

                  

----------------------------
原文链接:https://blog.51cto.com/zhanggerui/1006316

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-20 12:07:53 重新编辑]
  Java面向对象编程-->数据类型
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->通过JPA API检索数据
  Java网络编程-->安全网络通信
  精通Spring-->
  Vue3开发-->创建综合购物网站应用
  有关图片的LZW算法的原理
  无向图的最短路径求解算法之——Dijkstra算法
  深度学习之图片压缩算法
  LVS的调度算法-个人理解
  java 通配符的应用范例, java 排序算法
  一致性哈希算法的理解
  基于SQL的数据库算法研究
  基于JavaScript的Base64编码、解码算法
  ipvsadm及lvs的调度算法
  天干地支算法
  全排列的六种算法
  字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序...
  LinkedList,LinkedHashMap,LruCache源码解析
  数据结构中的数组
  RSA算法的数学原理
  更多...
 IPIP: 已设置保密
楼主      
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。