本篇介绍算法-程序的灵魂

  • 定义
  • 特征
  • 要素
  • 评定
  • 典型算法
  • 描述方式
  • 重要性
  • 举例

定义

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

特征

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

  • 确切性(Definiteness)
    算法的每一步骤必须有确切的定义;

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

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

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

要素

  • 数据对象的运算和操作
    计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,成为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:

    • 算术运算:加减乘除等运算
    • 逻辑运算:或、且、非等运算
    • 关系运算:大于、小于、等于、不等于等运算
    • 数据传输:输入、输出、赋值等运算 [1]
  • 算法的控制结构
    一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。

评定

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。

  • 时间复杂度
    算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。
    T(n)=Ο(f(n))
    因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

  • 空间复杂度
    算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

  • 正确性
    算法的正确性是评价一个算法优劣的最重要的标准。

  • 可读性
    算法的可读性是指一个算法可供人们阅读的容易程度。

  • 健壮性
    健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。

典型算法

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

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

  • 穷举法
    穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。

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

  • 分治法
    分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
    分治法所能解决的问题一般具有以下几个特征:
    (1) 该问题的规模缩小到一定的程度就可以容易地解决;
    (2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
    (3) 利用该问题分解出的子问题的解可以合并为该问题的解;
    (4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

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

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

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

  • 回溯法
    回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
    其基本思想是,在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

描述方式

描述算法的方法有多种,常用的有自然语言、结构化流程图、伪代码和PAD图等,其中最普遍的是流程图,分思法。
流程图设计参考c语言程序设计流程图详解

重要性

做任何事情都有一定的步骤,为了解决一个问题而采取的方法和步骤就称为算法。C语言的算法是计算机算法,即计算机能够执行的算法。只有明确了算法后,才能使应用程序实现某些功能。所以,通常人们会将算法称为程序的灵魂。
著名计算机科学家Wirth提出一个公式:数据结构+算法=程序,实际上一个应用程序还应当采取结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,可以这样表示:程序=算法+数据结构+程序设计方法+语言和环境。其中,算法是灵魂,数据结构是加工对象,语言是工具。算法是解决“做什么”和“怎么做”的问题。
程序中的操作语句,实际上就是算法的体现。显然,不了解算法就谈不上程序设计。

举例

如计算自然数n的阶乘
C语言表示:

#include<stdio.h>
int main()
{int n,i,T;i=1,T=1;printf("请输入n的值 ");scanf("%d",&n); for(i=1;i<=n;i++){T*=i;}printf("%d的阶乘等于%d",n,T);return 0;
}

运行结果:

对应流程图:

  
  


总结一下,本篇简要的介绍了算法,强调了算法对于程序设计的重要性。

小僧初来乍到,希望大家多多支持!如有纰漏,欢迎大家在评论区留言,小僧会及时更正,同时,大家如果有疑惑的地方可以把问题写在评论区,小僧看到会回复哟

(三)C语言算法概述相关推荐

  1. JVM 的三色标记算法详解

    本文来说下关于JVM 的三色标记算法. 文章目录 三色标记算法概述 引用计数&可达性分析 分代收集 什么是卡表 卡表的问题 写屏障 伪共享 三色标记算法 基本算法 三色标记算法缺陷 多标 漏标 ...

  2. 推荐系统产品与算法概述 | 深度

    作者丨gongyouliu 转载自大数据与人工智能(ID:gh_b8b5b02c348b) 作者在<推荐系统的工程实现>(点击蓝字可回顾)这篇文章的第五部分"推荐系统范式&quo ...

  3. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

    C语言算法与数据结构.ppt 第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解.历次试题分值在0 ...

  4. CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

    CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...

  5. 计算机科学家沃斯提出的公式,第一章C语言的概述

    第一章 C 语言的概述 本章介绍C语言的起源.发展和特点,C程序的基本结构和C程序的开发过程,以及Tuber C 2.0集成环境的使用.C语言是一种结构化程序设计语言,它既具有高级语言的特点,也兼有汇 ...

  6. 【c语言学习概述-基本数据类型】

    各大编程语言的主要用途 C/C++ C++ 是在C语言的基础上发展起来的,C++ 包含了C语言的所有内容,C语言是C++的一个部分,它们往往混合在一起使用,所以统称为 C/C++.C/C++主要用于P ...

  7. K邻近算法概述、欧式距离、Scikit-learn使用 、kNN邻近算法距离度量、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离、余弦距离、汉明距离、杰卡德距离、马氏距离

    一.K-邻近算法概述 K邻近算(K Nearest Neighbor算法,KNN算法):如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  8. 多层感知机与深度学习算法概述

    多层感知机与深度学习算法概述 读研之前那会儿我们曾纠结于机器学习.深度学习.神经网络这些概念的异同.现在看来深度学习这一算法竟然容易让人和他的爸爸机器学习搞混-可见深度学习技术的影响力之大.深度学习, ...

  9. 目标反射回波检测算法及其FPGA实现 之一:算法概述

    目标反射回波检测算法及其FPGA实现之一:算法概述 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激励信号的回波.我会分几篇 ...

最新文章

  1. 计算机网络导论 ppt,【2017年整理】1计算机网络导论.ppt
  2. python编写函数、计算三个数的最大公约数_python 函数求两个数的最大公约数和最小公倍数...
  3. 通过工具SecureCRTPortable将项目部署到服务器上
  4. 服务器推送信息到客户端,服务器如何发送消息到客户端
  5. 初始化模型参数 python_pytorch 网络参数 weight bias 初始化详解_python_脚本之家
  6. 动手学servlet(四) cookie和session
  7. 汇编语言mul指令_跟着开源软件学汇编语言:计算器
  8. 字节流和字符流学习笔记:
  9. 计算机注册表管理,如何打开计算机注册表编辑器
  10. CF161D Distance in Tree(点分治)
  11. 任正非《以客户为中心》
  12. Spring AOP(面向切面) 注解使用方法
  13. Spark写入Hudi报分区列乱码问题java.net.URISyntaxException: Illegal character in path at index 46:
  14. 想看两不厌,笑我太疯癫
  15. 视频编码的守望者--Jason Garrett-Glaser
  16. 要命啦!Word中快速录入大全,内含快捷键小技巧,快来一起学习!
  17. 华为实习笔试2020.4.15
  18. Nginx 1.9 安装 ngx_pagespeed 模块
  19. 数据结构一元多项式的相加-单链表实现
  20. 生成模型——自回归模型详解与PixelCNN构建

热门文章

  1. android动态添加布局属性 layoutparmas,Android 代码动态布局 LayoutParams 使用
  2. direct在计算机网络中是什么意思,计算机中的DIRECT是什么意思呢?
  3. xunfeng(巡风)源码解读之vulscan
  4. 蓝桥杯单片机必备代码(零基础也适合)
  5. 多线程:如何合理地估算线程池大小?
  6. 火星车成功登陆-NASA's rover Curiosity lands on Mars
  7. 网页自动弹出新网页代码
  8. 单一世界架构初探之时间之轴
  9. 无人驾驶中识别颜色并跟踪的优化(加入PID算法控制)
  10. C语言入门(七)——结构体