如题,这篇文章将会以几大常用思路对算法进行分类并简要介绍。

文章目录

前言

一、算法是什么?

二、算法的常用描述方法

1.自然语言描述法

2.流程图

3.N-S图

4.伪代码

三、算法设计的常用思路

1.随机法

3.动态规划

4.贪心法

5.近似法

总结


前言

众所周知,算法作为程序的灵魂,是我们设计一个程序的关键。瑞士著名计算机科学家沃斯提出了程序定义的著名公式:程序=数据结构+算法

本篇文章将会就算法的几大基本思路为纲对一些常用的算法进行基本介绍,希望能够让广大初学者朋友们对算法有一个初步的认识,具体的更加深入的内容还需要大家在实际开发中不断学习。

一、算法是什么?

算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。在用计算机解决问题问题的过程中,形成解题思路是推理实施算法,编写程序是操作实施算法。算法并不给出问题的精确解,只是说明怎样才能得到解。

算法的特性:

  1. 有穷性:一个算法的操作步骤必须是有限的。

  2. 确定性:算法的每一个步骤必须目的明确,不能存在歧义。

  3. 有效性:又被称为可行性,算法中的每一个步骤都应该是可以有效执行的。

  4. 输入:一个算法中有零个或多个输入。

  5. 输出:一个算法中有一个或多个输出,没有输出的算法是无意义的。

二、算法的常用描述方法

1.自然语言描述法

自然语言就是人们日常使用的语言,如汉语、英语等。用自然语言表示的优点是通俗易懂,缺点是文字冗长,容易出现“歧义性”。一般情况下不使用自然语言来描述算法

** ** 2.流程图

即用一些图框来表示各种类型的操作,用流程线来表示这些操作的执行顺序。这种操作直观形象,容易转化成相应的程序语言。目前所采用的是美国国家标准化协会ANSI规定的流程图符号。

一些常用的流程图符号:

3.N-S图

传统的流程图对流程线的使用没有严格的限制,流程可以随意的转向,给读图带来很大困难,也难以修改,为此,美国学者提出了一种新的流程图形式,去掉了带箭头的流程线,整个算法写在一个矩形框内,整个算法1从上至下执行,又被称为盒图。

顺序结构 选择结构

当型循环结构 直到型循环结构

4.伪代码

综合使用了多种编程语言中的语法和保留字,又使用了自然语言,是用介于自然语言和计算机语言之间的文字和符号来描述算法的。使用伪代码表示的算法结构清晰,代码简单,可读性好,经常运用在计算机教学之中。

三、算法设计的常用思路

1.随机法

依赖于随机数的统计特性,常用的包括快速排序,数值概率算法,拉斯维加斯算法等。

计算机产生的数都是伪随机数,如rand()函数产生的随机序列是伪随机序列。解决方法之一是以当前时间作为随机种子,具体我们在这里不过多涉及。

快速排序按如下方式工作:设有一组随机顺序的数,想要对其排序,首先将其分成两个部分,其中一部分大于某个设定好的中间值,另一部分小于等于这个中间值。有了这两组数后再以同样的方式对其进行划分,直到每一组只有一个数为止,此时所有的数字都已完成排序。

在设定中间值时,通过遍历所有数来确定中间值需要花费大量时间,因此我们随机选择一个数作为中间值,由于随机数的正态分布使得划分的结果是相对平衡的。这种方式就是随机法。

2.分治法

分治法包含三个步骤:分解,求解与合并。即将一个大的问题分解成若干个更小,更容易解决的子问题并进行求解,子问题之间相互独立,然后将答案进行合并得到最初大问题的答案。在分治法中,由于子问题与原问题在结构与解法上的相似形,大都采用递归的方式解决问题。常见的如阶乘,汉诺塔,二分查找,归并排序,快速排序等。

在上文快速排序中将一组数分割成两个部分然后继续不断分割的思想也是分治法的一种。

3.动态规划

动态规划同分治法类似,都是将较大的问题分解成子问题然后合并结果。在分治法中,每个子问题是独立的,不同子问题之间的答案不会相互干涉,但是有些问题的子问题之间存在关联,使用分治法需要对一些子问题重复计算多次,这时使用动态规划能够减少很多工作。

4.贪心法

贪心法在求解问题时总是做出当前状态下的最佳选择,但是从整体上看可能并不是最优解,而仅仅是某种意义上的局部最优解。但是从某些方面上来说,运用贪心法是最佳选择。

一个常见的例子是霍夫曼编码,这是一种数据压缩算法,构建一棵霍夫曼树将需压缩的符号和频率作为二叉树的根节点保存,然后选择两棵拥有最小频率值的根节点作为左右子树节点,构造一棵新的二叉树,重复这个过程直到形成一棵完整的霍夫曼树。每次挑选两棵当前最合适的树进行合并的过程就是一种贪心算法。

5.近似法

近似法并不计算最优解,而是计算“足够好”的解。通常利用近似法来解决那些计算成本很高但是十分有价值的“鸡肋”问题。

邮递员问题是一个通常会用近似法来求解的问题。假设一位邮递员有多封不同地址的邮件需要递送,每个地点都要经过且只能经过一次,需要我们找出最短的可能路径。邮递员问题存在可能的最优策略,但计算的代价很大,因此通常从起始点开始,前往距离起始点最近的地点,然后再前往下一个距离最近的地点,直到去到最后一个地点。这是一种比最优解稍逊的策略,但是能够大幅简化计算。


总结

以上是我对几种算法表示方法和常用算法思想的总结,如有疏漏,敬请谅解。

算法之路道阻且长,让我们一起加油吧。

常用算法简要总结(C语言)相关推荐

  1. c语言通用数据结构和常用算法库,基于C语言的通用数据结构和算法库

    本人最近在学习数据结构的课程,在过程中发现用C语言来实现各种数据结构类型的时候很难做到真正意义上的通用的数据结构,于是在网上搜罗了一些所谓的C语言通用数据结构库,在此也将这些数据结构库一一罗列,方便大 ...

  2. C语言常用算法 脚本之家,C/C++常用算法手册 秦姣华 中文pdf扫描版 22.5MB

    <C/C++常用算法手册>分3篇,共13章,"第1篇算法基础篇"介绍了算法概述,重点分析了数据结构和基本算法思想:"第2篇算法基本应用篇"详细讲解了 ...

  3. c语言单片机求最小公倍数,单片机常用的14个C语言算法,要熟记在心哦!

    原标题:单片机常用的14个C语言算法,要熟记在心哦! 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么 ...

  4. 计算c53的c语言的程序,C程序设计的常用算法.doc

    ? HYPERLINK "/happy_dreamer/blog/item/902dbe2af96b2a25d52af16b.html" \o "C程序设计的常用算法&q ...

  5. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  6. aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

    分治算法,顾名思义就是"分而治之",即把规模较大的复杂问题拆分为若干规模较小的类似子问题,并逐个解决,最后再将各个子问题的解决结果合并,得到原始问题的结果的方法.这个技巧是很多高效 ...

  7. c语言常用算法分析 微盘,C语言常用算法归纳.pdf

    C 语言常用算法归纳 应当掌握的一般算法 一.基本算法: 交换.累加.累乘 二.非数值计算常用经典算法: 穷举.排序(冒泡,选择).查找(顺序即线性) 三.数值计算常用经典算法: 级数计算(直接.简接 ...

  8. c语言程序设计的常用算法,《C语言程序设计的常用算法.doc

    <C语言程序设计的常用算法 C语言程序设计的常用算法 算法(Algorithm):计算机解题的基本思想方法和步骤.算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要 ...

  9. java语言实现常用算法(排序和查找)

    以下是java语言实现的常用算法. 1.冒泡排序 /** 冒泡排序* * 有1至N个数* 第一轮比较N个数,第二轮比较N-1个数,...* 每一轮根据前面一个数和后面一个数比较,如果前者大于后者,交换 ...

最新文章

  1. token验证_Swagger中添加Token验证
  2. 目标检测--Selective Search for Object Recognition(IJCV, 2013)
  3. JavaFX图表(四)之面积图
  4. 【转载保存】mysql不设置主键使用自增长ID方法
  5. IOS --xcode删除Provisioning Profiles文件
  6. Ubuntu16.10上安装NodeJS6.9.2
  7. 深入浅出事件流处理NEsper(三)
  8. Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
  9. python 通达信公式函数,python使用通达信公式,请人用python编写如下公式,我对编程一窍不通...
  10. Pyke 逻辑编程入门(2):表示事实的陈述句
  11. 三级联动的数据库(贼多)
  12. 微信表情包小程序,更新登录接口,增加举牌功能
  13. MATLAB最速下降法求解函数极小值
  14. java制作超炫流星雨表白_制作超炫拱形流星雨插画图片的PS技巧
  15. APK的安装过程分析
  16. Ubuntu18.04下更改apt源为阿里云源
  17. 限时订单实现方案(DelayQueue、ActiveMq)
  18. 基于《PythonCookbook》的学习(2)——在字符串的卡头或结尾做文本匹配
  19. 北漂五年,分享一下关于我的职场故事
  20. 《搞定Excel数据透视表》

热门文章

  1. 简单大方的java自我介绍,简单大方的自我介绍
  2. python写文件numpy_Numpy | 23 文件读写
  3. python-批量修改图片名称(按序号排序)
  4. Bootstrap轮播插件
  5. Unraid 使用技巧集合
  6. PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快
  7. 信息安全工程师学习笔记《第三章》
  8. excel在每行下面添加插入指定行数的空白行方法步骤
  9. 11、Altiris cms 7.0 系统监控
  10. 一文解析交通大数据是如何解决拥堵问题的