第1部分 重新认识C语言
程序中的算法
【文章摘要】
算法(Algorithm),是程序的灵魂。著名计算机科学家、图灵奖获得者沃思曾提出过一个公式:数据结构+算法=程序。可见,算法在程序中占有非常重要的地位。
在实际的软件开发项目中,不管是有意设计或是无意为之,我们几乎随时在和算法打交道。小到定义一个变量,大到编写一个函数,这些都是算法的实现过程。
【关键词】
C语言 算法 程序
1. 算法概述
什么是算法呢来看一看一些计算机书籍中的定义。
谭浩强老师的《C程序设计》书中,算法被定义为是为解决一个问题而采取的方法和步骤。
以上对算法的定义都是偏重理论,在实际的软件开发项目中,算法是用程序代码实现软件需求的方法,是软件开发工程师逻辑思维的体现。
2. 算法的图形化表示
为了形象化地体现出算法,不同的学者设计出了不同的方法,这些方法包括:自然语言,流程图,N-S流程图,伪代码等。在实际的编程工作中,大都采用流程图来直观地表示算法。流程图逻辑清晰,很适合开发人员使用。
软件开发项目中一些常用的流程图符 如图1所示。
图1一些常用的流程图符
使用流程图的好处包括:第一,有利于开发人员参照来检查算法的正确性和完整性;第二,有利于其他人员参照来对程序进行同行评审(代码评审);第三,有利于对程序的长期维护。
3. 算法在实际软件开发项目中的应用
对于以算法立足的公司,像Google、百度等,算法就非常的重要,他们有专门的算法工程师岗位;对于做产品的公司,相对而言,做出产品来是最主要的,他们注重的是算法在产品中的应用。
3.1 多线程实现程序功能的独立
在有关计算机操作系统这类书中,对线程有很多的介绍,其好处之一就是可以让计算机并行地实现很多操作。在实际的软件开发项目中,线程其实就是实现某功能的函数,可实现程序不同功能的独立性。
在某项目中,之前的开发人员创建了一个线程用来实现三个独立的功能:从数据库中扫描出数据生成本地文件(功能A)、删除数据库中的过期记录(功能B)、删除本地的过期文件。由于这三个功能互相没有关联,但又放在同一个函数中,需要按照功能A、功能B、功能C的顺序来执行,这不仅严重影响了程序的执行效率(如果功能A执行时间很长,那么功能B和功能C就要很久才会执行到),而且使这一个函数的代码行数显得非常多,不符合编程规范。此时,该函数的流程如图2所示。
图2单线程函数执行流程
图3多线程函数执行流程
多线程”在大型软件程序中有着很广泛的应用,其优点如下:
第一,将原来在一个大流程中实现的功能放到了多个小流程中,程序更加的简洁和易于阅读。
第二,将不同的功能放到不同的线程中,提高了程序的执行效率。
第三,“多线程”使得程序的模块化更强,有利于追踪程序执行过程和排查问题。
3.2 用冒泡排序法实现账目的顺序排列
冒泡排序法的思路是这样的:数组中每个元素都重复地走访要排序的数组,一次只和一个元素比较,如果它们的顺序错误,就把它们交换过来。走访数组的工作是重复地进行直到没有再需要交换的为止。该算法的代码实现如下:
for (iOuterLoop = 0; iOuterLoop
{
for (iInnerLoop = 0; iInnerLoop
{
if (Array[iInnerLoop] > Array[]iInnerLoop+1]) //需要进行交换
{
iTempVar = Array[iInnerLoop];
Array[iInnerLoop] = Array[iInnerLoop+1];
Array[iInnerLoop+1] = iTempVar;
}
}
}
有关此类排序问题经常出现在大小不同的软件开发项目中,因此在最开始学习算法的时候,一定要将基础打牢。
3.3 用分治法解决删除数据库中数据效率低下问题
在某软件产品发布之后,现场反馈回了一个问题,该产品删除数据的效率低下,导致数据库中过期数据堆积。经过分析,发现产品的功能没有问题,只是由于一轮要删除10个类型相同的数据表中的用户数据,而每个表中的数据又非常的多,导致长时间处理一个表而延迟了对其它几个表的处理,表现出来的现象就是某些表中有许多过期数据还存在。
可以用for语句来形象地描述。在修改之前,要同时扫描10个表,即如下代码所示:
for (iScanTable = 0; iScanTable
{
//执行语句
}
在修改之后,每次只需扫描起始表(编 为iBeginScanTable)和结束表(编 为iEndScanTable)之间的数据表,如下代码所示:
for (iScanTable = iBeginScanTable; iScanTable
{
//执行语句
}
这样修改之后,现场的执行效率一下子提高了,数据表中再也不会出现有过多的过期数据了。可见,算法真的是有很神奇的作用!
4. 总结
算法是计算机科学的基础,更是程序设计的基石,只有具备良好算法基础的人才能成为优秀的软件开发人员。
当然,在实际的软件开发中,遇到一个问题,我们也不能总想着用最复杂的算法来解决它,以显示出自己水平的高超。程序中的算法要力求简单、清晰、执行效率高。
爱因斯坦曾说过:“科学家应该使用最简单的手段达到他们的结论,并排除一切不能被认识到的事物”。也就是说,简单就是美。我们设计算法要遵循“奥卡姆剃刀原理”(即“简单有效原理”),该原理认为,切勿浪费较多东西去做用较少的东西同样可以做好的事情。在软件开发过程中,该原理同样适用。它要求我们要力求让自己的代码尽量简单直观,用较简单的算法实现用户要求的功能。
在学校学了很多算法理论,只有在实际的工作中才能够体会到它们的妙用。但在应用之前,一定要对各种算法的优劣及应用场景了然于心。
(欢迎访问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎访问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)
(本系列文章每周更新两篇,敬请期待!本人新浪微博:http://weibo.com/zhouzxiopnav=1&wvr=5,微信 :245924426, !)
文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览34466 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!