算法的那些事

前言   

 通过一个月的算法学习,对于算法的了解不断深入,尤其是在郝老师和云姐、米老师的引导之下,自己的动手实践和思考同样重要。一种思维方式的训练和优秀的学习习惯在慢慢地形成。下面对于算法的内容小编简单地做一下总结。


算法的起源

  英文名称Algorithm来自于9世纪波斯数学家al-Khwarizmi,因为al-Khwarizmi在数学上提出了算法这个概念。“算法”原为"algorism,意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。

  欧几里得算法被人们认为是史上第一个算法。

  第一次编写程序是AdaByron于1842年为巴贝奇分析机编写求解解伯努利方程的程序,因此Ada Byron被大多数人认为是世界上第一位程序员。因为查尔斯·巴贝奇(CharlesBabbage)未能完成他的巴贝奇分析机,这个算法未能在巴贝奇分析机上执行。因为"well-definedprocedure"缺少数学上精确的定义,19世纪和20世纪早期的数学家、逻辑学家在定义算法上出现了困难。

  20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要作用的。

  求素数的埃拉托塞尼筛法和求方根的开方的方法公式(算法不等于公式,公式却是提供一种算法)


算法是什么

 

1、概念

  算法是利用计算机解决问题的处理步骤,简而言之,算法就是解决问题的步骤。

生活中的小例子:

  算法不仅仅用于计算机的数据处理,现实世界中的各种问题也需要结合算法的概念来解决,其中,具有代表性的就是烹饪中用到的食谱,食谱是各种美味料理的制作方法,需要用一定的步骤表示出来。

 

 

 算法是古老智慧的结晶,是程序的范本,学习算法才能编写出高质量的程序。

 

算法的改进/食谱的改进:

 

 

 

2、五个特征

 

  @有穷性(Finiteness

  算法的有穷性是指算法必须能在执行有限个步骤之后终止;

 @确切性(Definiteness)

  算法的每一步骤必须有确切的定义;

 @输入项(Input)

  一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

  @输出项(Output)

  一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

 @可行性(Effectiveness)

算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

 

综合来说:

 

  有效性:算法必须要为给定的任务给出正确的结果,即,有满足条件的输入值时,此算法一定要保证正常工作(返回正确的输出值)。表明算法有效性的方法之一就是断点。断点设置在算法的任意位置上,判断此位置是否满足给出的条件,即,程序是否正确运行。

 

  例如:错误的程序,错误的算法,指定了运算方向,却没有正确的程序完成,给出结果。像榨果汁一样,你放进去了一个西瓜,却出来了一片面包。那这个算法明显是不能够使用的。

 

  终止性:算法中没有永远反复执行,即,没有无限循环,且不返回答案的情况。算法终止性可以用反复处理结束条件的判断变量,或经过有限次的反复一定能到达结束条件等方法证明。

 

  例如:递归算法,需要给他一个出口,不然在里面出不来了可算不上一个完整的算法;

 

3、基础—结构化程序设计的思想

       

  结构化程序设计中所有的处理流程,可以用以下三种结构组合而成:

 

  顺序结构:按照所述顺序处理

  选择结构:根据判断条件改变执行流程

  循环结构:当条件成立时,反复执行给定的处理操作

 

算法怎么用

 

 给计算机编程带来方便的算法种类繁多,如:

 

  A、技术计算实现的算法:迪杰斯特拉法,素数,最大公约数;

 

  B、排序:交换(冒泡、快速排序)、选择(直接选择、堆排序)、插入(直接插入、希尔排序)、归并、基数排序等;

 

  C、查找:线性、二分法、

 

  D、字符串模式匹配:KMP算法

 

简单聊聊那些算法

 

  1、递推法

 是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出

相邻几步的关系,从而达到目的,此方法称为递推法。

 

  2.递归法

 递归指的是一个过程:函数不断引用自身,直到引用的对象已知。

 

  3.穷举搜索法

 穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。

 

  4.贪婪法

 贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。

 

  5.分治法

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

 

  6.动态规划法

 动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化

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

 

  7.迭代法

 迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法。

 

  8.分支界限法

 贪婪算法一样,这种方法也是用来为组合优化问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度比贪婪算法高,但它的优点是与穷举法类似,都能保证求出问题的最佳解,而且这种方法不是盲目的穷举搜索,而是在搜索过程中通过限界,可以中途停止对某些不可能得到最优解的子空间进一步搜索(类似于人工智能中的剪枝),故它比穷举法效率更高。

 

 小结

  这些内容是基础,只有知道了算法是通过什么样的框架搭建起来的,才能更好地去理解下面的知识,更好地去学习具体的排序、算法设计思想,下面的就是学习和实践了。

 

 

  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值