您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

算法——抓住程序的灵魂

时间:2019-06-25 10:12:30  来源:  作者:

做任何事情都要有一定的步骤,为了解决一个问题而采取的方法和步骤就称为算法。C语言的算法是计算机算法,即计算机能够执行的算法。只有明确了算法后,才能使应用程序实现某些功能。所以,通常人们会将算法称为程序的灵魂。本文将详细介绍C语言算法的基础知识。

我们对算法的理解

 

一个程序应包括对数据的描述。在程序中要指定数据的类型和数据的组织形式(即数据结构,对操作的描述(即操作步骤),也就是算法(algorithm)。Wirth曾经提出了一个经典的公式:数据结构+算法=程序。而谭浩强的总结为:程序=算法+数据结构+程序设计方法+语言和环境

1.1 算法是程序的灵魂

当重新审视自己走过的路时,我越来越能理解算法的重要性。算法不仅是工具,而且还是程序的灵魂。在初涉这一领域时,就多次看过Wirth教授的《算法+数据结构=程序》一书。后来思想慢慢转移到了方法论上,对OO、GP或者IoC这些知识超乎寻常地关心,却冷落了程序的本质。很多实际问题还是要靠精心设计的算法才能有效解决。

作者曾发现一本比较有趣的书,它是由Udi Manber所写的Introduction to Algorithms——A Creative Approach。此书的最大特点就是数学归纳法贯穿全文,我的理解就是“由一粒沙看世界”。复杂的问题,应如何对其分解?在这本书中,不仅给出了一些具体算法,更重要的是它要培养读者设计算法的能力。而这种能力的核心,在作者看来,就是对归纳的理解和灵活运用。

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法,所以应告诉计算机确切的步骤以执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。一般,当算法在处理信息时,数据会从输入设备上读取,写入至输出设备,保存起来供以后使用。

著名计算机科学家Wirth提出一个公式。

数据结构+算法=程序

实际上,一个程序还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言来表示。因此,它可以这样表示。

程序=算法+数据结构+程序设计方法+语言和环境

以上4个方面是一门程序设计语言所应具备的基本知识。其中,算法是灵魂,数据结构是加工对象,语言是工具。算法解决“做什么”和“怎么做”的问题。

程序中的操作语句实际上就是算法的体现。显然,不了解算法就谈不上程序设计。本书虽然不是专门讲解算法的,但不会算法就达不到我们的目的——用C语言进行程序设计。

数据是操作对象,操作的描述即是操作步骤,操作目的是对数据进行加工处理以得到期望的结果。打个比方,厨师做菜肴,需要有菜谱。菜谱上一般应包括配料(数据)与操作步骤(算法)。

这样,对于同一些原料就可以加工出不同风味的菜肴。

1.2 何谓算法

做任何事情都要有一定的步骤。为解决一个问题而采取的方法和步骤称为算法。计算机能够执行的算法称为计算机算法。计算机算法可分为如下两大类。

  • 数值运算算法:求解数值。
  • 非数值运算算法:事务管理领域。

看下面的运算。

1×2×3×4×5

为了计算上述运算,通常需要按照如下步骤来操作。

第1步:求1×2,得到结果2。

第2步:将第1步得到的乘积乘以3,得到结果6。

第3步:将6再乘以4,得24。

第4步:将24再乘以5,得120。

上述过程就是一个算法,虽然过程有点复杂。而计算机程序对上述算法进行了改进,它使用如下算法。

第1步:令t=1。

第2步:令i=2。

第3步:计算t×i,乘积仍然放在变量t中,可表示为t×it

第4步:会i的值+1,即i+1→i

第5步:如果i≤5,则返回重新执行步骤3以及步骤4和步骤5;否则,算法结束。

上述算法就是数学中的“n!”公式。

看下面的数学应用题。

(1)有80个学生,要求将他们中成绩在60分以上的姓名和成绩打印出来。

在此设n表示学生的学号,ni表示第i个学生的学号;cheng表示学生成绩,chengi表示第i个学生成绩。则对应算法表示如下。

第1步:令i=1。

第2步:如果chengi≥60,则输出ni和chengi;否则不输出。

第3步:i+1→i

第4步:若i≤80,则返回步骤2;否则,结束。

(2)判定在1900~2000年中哪一年是闰年,并输出结果。

闰年需要满足的条件如下所示。

  • 能被4整除,但不能被100整除的年份。
  • 能被100整除,又能被400整除的年份。

在此可以设y为被检测的年份,则对应算法如下所示。

第1步:令y=1900。

第2步:若y不能被4整除,则输出y“不是闰年”,然后转到第6步。

第3步:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转到第6步。

第4步:若y能被100整除,又能被400整除,则输出y“是闰年”;否则,输出y“不是闰年”,然后转到第6步。

第5步:输出y“不是闰年”。

第6步:y+1→y

第7步:当y≤2000时,返回第2步继续执行;否则,结束。

19.1.3 算法的特性

对于程序设计人员来说,必须会设计算法,并根据算法写出程序。算法的特性如下所示。

  • 有穷性,一个算法应包含有限的操作步骤而不能是无限的。
  • 确定性,在算法中每一个步骤都应当是确定的,而不能是含糊的、模棱两可的。
  • 有零个或多个输入。
  • 有一个或多个输出。
  • 有效性,在算法中每一个步骤都应当能有效地执行,并得到确定的结果。

1.2 算法表示法——流程图

 

算法的表示方法为算法的描述和外在表现,上节的算法都是通过语言描述来体现的。除了语言描述外,还可以通过流程图来描述。在日常应用中,流程图的描述格式如图19-1所示。

 

算法——抓住程序的灵魂

 

 

图1-1 流程图标识说明

例如,有80个学生,要求将他们之中成绩在60分以上的姓名和成绩打印出来。上述问题的算法可使用图19-2所示的流程图来表示。

 

算法——抓住程序的灵魂

 

 

图1-2 算法流程图

在日常流程设计中,流程图通常包含如下3种结构。

  • 顺序结构:顺序结构如图19-3所示,其中AB两个框是顺序执行的。即在执行完A的操作以后再执行B的操作。顺序结构是一种基本结构。

 

算法——抓住程序的灵魂

 

 

图1-3 顺序结构

  • 选择结构:选择结构也称为分支结构,如图19-4所示。在此结构中必含一个判断框,根据给定条件是否成立而选择是执行 A框还是B框。无论条件是否成立,都只能执行A框或B框之一,也就是说AB两个框只有一个,也必须有一个被执行。

 

算法——抓住程序的灵魂

 

 

图1-4 选择结构

  • 循环结构:循环结构分为两种,一种是当型循环,另一种是直到型循环。当型循环是先判断条件P是否成立,若成立才执行A操作,而直到型循环则相反,先执行A操作再判断条件P是否成,当条件不满足时执行循环体,满足时则停止,如图19-5所示。

 

算法——抓住程序的灵魂

 

 

图1-5 循环结构

在上述3种基本结构中,有以下4个共同点。

  • 只有一个入口。
  • 只有一个出口。
  • 结构内的每个部分都有机会执行。
  • 结构内不存在“死循环”。


Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Tags: 算法  点击:(1)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  Tags: 算法  点击:(7)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 算法  点击:(16)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  Tags: 算法  点击:(24)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  Tags: 算法  点击:(32)  评论:(0)  加入收藏
随着注册制的加速推进,新股越来越多,截止到今天A股上市公司的总数高达4500余家,A股一直就是重融资,轻投资的市场,而上市公司发行可转债这种再融资的(圈钱方式)是最能让普通投资者接...【详细内容】
2021-11-05  Tags: 算法  点击:(98)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  Tags: 算法  点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  Tags: 算法  点击:(36)  评论:(0)  加入收藏
每个人都有过这样的经历:打开手机准备回消息或打电话,一看到微信图标右上方的小红点,于是忍不住先打开微信;看完微信,不知不觉又被另一个App牵引,直到关闭手机屏幕才发现自己早已...【详细内容】
2021-11-03  Tags: 算法  点击:(30)  评论:(0)  加入收藏
文丨互联网怪盗团在互联网行业,尤其是在投资人心目中,往往存在一种“算法迷信”或曰“技术迷信”:某公司的广告变现做得好,一定是因为有算法;某公司的云计算业务开展的好,也是因为...【详细内容】
2021-11-03  Tags: 算法  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条