第1部分 又一次认识C语言

程序中的算法

【文章摘要】

        算法(Algorithm),是程序的灵魂。著名计算机科学家、图灵奖获得者沃思曾提出过一个公式:数据结构+算法=程序。

可见,算法在程序中占有非常重要的地位。

在实际的软件开发项目中,无论是有意设计或是无意为之。我们差点儿随时在和算法打交道。小到定义一个变量,大到编写一个函数,这些都是算法的实现过程。

本文以作者实际项目工作为背景。介绍算法在C程序中的应用。

【关键词】

C语言 算法  程序

1. 算法概述

什么是算法呢?先来看一看一些计算机书籍中的定义。

经典书籍《算法导论》(Cormen等著。机械工业出版社)中。作者觉得算法是一系列的计算步骤,用来将输入数据转换成输出结果。

谭浩强老师的《C程序设计》书中,算法被定义为是为解决一个问题而採取的方法和步骤。

算法设计与分析—C++语言描写叙述》(陈慧南编著。电子工业出版社)一书中。作者觉得算法是求解一类问题的随意一种特殊方法,一个算法是对特定问题求解步骤的一种描写叙述。

以上对算法的定义都是偏重理论,在实际的软件开发项目中,算法是用程序代码实现软件需求的方法。是软件开发project师逻辑思维的体现。

2. 算法的图形化表示

为了形象化地体现出算法,不同的学者设计出了不同的方法,这些方法包含:自然语言。流程图。N-S流程图,伪代码等。

在实际的编程工作中。大都採用流程图来直观地表示算法。

流程图逻辑清晰,非常适合开发者使用。

软件开发项目中一些经常使用的流程图符号如图1所看到的。

图1一些经常使用的流程图符号

使用流程图的优点包含:第一,有利于开发者參照来检查算法的正确性和完整性;第二,有利于其他人员參照来对程序进行同行评审(代码评审);第三,有利于对程序的长期维护。

3. 算法在实际软件开发项目中的应用

对于以算法立足的公司,像Google、百度等,算法就非常的重要。他们有专门的算法project师岗位。对于做产品的公司,相对而言。做出产品来是最基本的,他们注重的是算法在产品中的应用。

但无论是专门的算法project师。还是一般的软件开发project师,我们都会经常与算法打交道。

下面介绍作者本人在项目工作中所遇到过的一些算法问题。

3.1 多线程实现程序功能的独立

在有关计算机操作系统这类书中,对线程有非常多的介绍,其优点之中的一个就是能够让计算机并行地实现非常多操作。在实际的软件开发项目中,线程事实上就是实现某功能的函数,可实现程序不同功能的独立性。

在某项目中,之前的开发者创建了一个线程用来实现三个独立的功能:从数据库中扫描出数据生成本地文件(功能A)、删除数据库中的过期记录(功能B)、删除本地的过期文件。因为这三个功能互相没有关联。但又放在同一个函数中。须要依照功能A、功能B、功能C的顺序来运行,这不仅严重影响了程序的运行效率(假设功能A运行时间非常长。那么功能B和功能C就要非常久才会运行到),并且使这一个函数的代码行数显得非常多,不符合编程规范。此时,该函数的流程如图2所看到的。

图2单线程函数运行流程

于是,作者就想到应用多线程的方法来解决问题,思路是这种:保留原线程,仅仅用于实现功能A。再创建两个不同的线程。分别用于实现功能B和功能C。这样不仅提高了程序的运行效率,并且降低了每一个函数中的代码行数。

改动之后的程序流程如图3所看到的。

图3多线程函数运行流程

多线程”在大型软件程序中有着非常广泛的应用,其优点例如以下:

第一,将原来在一个大流程中实现的功能放到了多个小流程中。程序更加的简洁和易于阅读。

第二,将不同的功能放到不同的线程中,提高了程序的运行效率。

第三,“多线程”使得程序的模块化更强。有利于追踪程序运行过程和排查问题。

3.2 用冒泡排序法实现账目的顺序排列

在某项目中,有一个需求时实现按账目时间早晚顺序出账单。即一个用户可能由多笔消费账单,而打出的账单要依照他消费的先后顺序显示出每条账目的详细情况。

这时,作者就採用了冒泡排序法来实现该需求。

冒泡排序法的思路是这种:数组中每一个元素都反复地走訪要排序的数组,一次仅仅和一个元素比較,假设它们的顺序错误。就把它们交换过来。走訪数组的工作是反复地进行直到没有再须要交换的为止。该算法的代码实现例如以下:

for (iOuterLoop = 0; iOuterLoop < NumOfArray; iOuterLoop ++)

{

        for (iInnerLoop = 0; iInnerLoop < NumOfArray-iOuterLoop-1; iInnerLoop ++)

        {

          if (Array[iInnerLoop] > Array[]iInnerLoop+1])   //须要进行交换

          {

                         iTempVar = Array[iInnerLoop];

                Array[iInnerLoop] = Array[iInnerLoop+1];

                  Array[iInnerLoop+1] = iTempVar;

                 }

  }

}

有关此类排序问题经常出如今大小不同的软件开发项目中,因此在最開始学习算法的时候,一定要将基础打牢。

3.3 用分治法解决删除数据库中数据效率低下问题

在某软件产品公布之后,现场反馈回了一个问题,该产品删除数据的效率低下。导致数据库中过期数据堆积。

经过分析,发现产品的功能没有问题。仅仅是因为一轮要删除10个类型相同的数据表中的用户数据。而每一个表中的数据又非常的多,导致长时间处理一个表而延迟了对其他几个表的处理。表现出来的现象就是某些表中有很多过期数据还存在。

为了解决问题,作者參考了“分治法”的思想,即将一个复杂问题分解成若干个规模较小、相互独立,但类型相同的子问题。然后分别求解这些子问题。鉴于此。解决思路为:既然一次处理10个表有困难,那么一次处理5个表、2个表、1个表呢?总能够找到一轮数据表处理个数的最佳值,找到该值后,用10除以该值,就可得到同一时候部署该产品软件的个数。之后在配置文件里添加两个配置项:初始扫描表编号和最后扫描表编号,仅仅要保证各产品中这两个值不重叠并将10个数字覆盖完就能够了。

能够用for语句来形象地描写叙述。在改动之前,要同一时候扫描10个表,即例如以下代码所看到的:

for (iScanTable = 0; iScanTable < 10; iScanTable ++)

{

    //运行语句

}

在改动之后,每次仅仅需扫描起始表(编号为iBeginScanTable)和结束表(编号为iEndScanTable)之间的数据表,例如以下代码所看到的:

for (iScanTable = iBeginScanTable; iScanTable <= iEndScanTable; iScanTable ++)

{

    //运行语句

}

这样改动之后。现场的运行效率一下子提高了。数据表中再也不会出现有过多的过期数据了。可见。算法真的是有非常奇妙的作用!

4. 总结

算法是计算机科学的基础,更是程序设计的基石,仅仅有具备良好算法基础的人才干成为优秀的软件开发者。

当然。在实际的软件开发中。遇到一个问题。我们也不能总想着用最复杂的算法来解决它,以显示出自己水平的高超。程序中的算法要力求简单、清晰、运行效率高。

爱因斯坦曾说过:“科学家应该使用最简单的手段达到他们的结论,并排除一切不能被认识到的事物”。

也就是说。简单就是美。我们设计算法要遵循“奥卡姆剃刀原理”(即“简单有效原理”)。该原理觉得。切勿浪费较多东西去做用较少的东西相同能够做好的事情。在软件开发过程中。该原理相同适用。它要求我们要力求让自己的代码尽量简单直观。用较简单的算法实现用户要求的功能。

在学校学了非常多算法理论。仅仅有在实际的工作中才干够体会到它们的妙用。但在应用之前,一定要对各种算法的优劣及应用场景了然于心。

(欢迎訪问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎訪问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

(本系列文章每周更新两篇,敬请期待!本人新浪微博:http://weibo.com/zhouzxi?topnav=1&wvr=5。微信号:245924426。欢迎关注!

)

转载于:https://www.cnblogs.com/jhcelue/p/7083256.html

让你提前认识软件开发(14):程序中的算法相关推荐

  1. 如何从新开发的程序中提炼服务

    现在已确写在SOA的开发中也不就是将所有的功能都开发为公开的服务,而只是将与其它软件会发生交互的部分才设计为服务. 通过这样的一种方式,就必须从新开发的程序中提炼出服务.那么这里应当怎么的提炼出来服务 ...

  2. 人工智能在软件开发和测试中的作用

    根据Gartner的说法,人工智能将在所有技术领域无所不在,并将成功地在2020年成为CIO最重要的投资重点之一.根据市场研究公司的数据,2019年全球人工智能的范围是北美约为63.6亿美元. 像亚马 ...

  3. 在软件开发生命周期中使用应用程序验证器

    转自https://msdn.microsoft.com/zh-cn/library/aa480483.aspx#EHAA 发布日期 : 2006-6-5 | 更新日期 : 2006-6-5 摘要 M ...

  4. 迷宫出路代码_如何在软件开发的迷宫中找到自己的出路

    迷宫出路代码 by Tim Kleier 蒂姆·克莱尔(Tim Kleier) 如何在软件开发的迷宫中找到自己的出路 (How to find your way through the corn ma ...

  5. 使用TS开发小程序中遇到的问题

    在使用ts开发小程序的过程中,遇到了一些开发工具和关于ts的使用上的一些问题,并记录解决方法 1. ts开发过程中类型指定问题 Type 'number | undefined' is not ass ...

  6. 软件开发的过程中, 一定需要简单设计?

    2017.7.4, 深圳, Ken Fang 前言: 简单设计只是写文档, 而不能指导开发, 这样的简单设计, 就只是在瞎折腾. 但是, 软件开发的过程中, 不做简单设计, 软件开发就永远做不好. 简 ...

  7. 让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

    第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用 ...

  8. 让你提前认识软件开发(40):既要写好代码,又要写好文档

    第3部分 软件研发工作总结 既要写好代码,又要写好文档 对于软件相关行业,在学校或单位上,大家或许都已经注意到了,除了要编写的程序.绘制设计图之外,另一个重要的工作便是写文档.为什么要写文档呢?由于我 ...

  9. 让你提前认识软件开发(39):软件研发之殇

    第3部分 软件研发工作总结 软件研发之殇 在经典著作<人月神话>中,作者提出了一个观点:绝大部分的软件研发项目都不能按期完成.我工作也有一段时间了,发现这确实是一个不争的事实.我所从事的项 ...

最新文章

  1. python bottle学习(四)request.quest/query_string/params/body等方法介绍
  2. Gridview中运用CommandField 删除控件时注意点
  3. Python学习笔记--科赫雪花的绘制
  4. PAT1048 数字加密 (20 分)
  5. MySQL数据库篇之初识数据库
  6. LeetCode 44. 通配符匹配(DP)
  7. clickhouse注入的利用
  8. sps忘记保存文档怎么恢复_路由器管理员密码忘了怎么办【解决方法】
  9. 【操作系统】输入输出系统(下下)-思维导图0.0
  10. html页面缩小布局乱了为什么啊_PPT页面总是太空?这4个方法,让你的PPT增加亿点点细节!...
  11. centos7 减少/home分区空间,扩大/ 的空间
  12. html网页老是崩溃,MSHTML.dll 错误模块导致ie9最近经常崩溃
  13. UML统一建模语言习题一
  14. SPSS学习笔记(二)T检验
  15. catia中尺子没了怎么调出来,【答疑】草图大师sketchup的尺子快捷键是什么呀? - 羽兔网问答...
  16. SHFileOperation 文件夹COPY
  17. 学术论文参考文献格式
  18. 在c语言中 根据数据的组织形式,文件工作组织形式 文件的基本组织方式有哪几种?...
  19. 魔窗--H5网页唤醒APP
  20. Altium Designer绘制原理图

热门文章

  1. QTP自动例子的源码分析--ClearMainWindow
  2. 限制车间备料方式更改
  3. 《Fast R-CNN》阅读笔记
  4. [Error] iostream.h: No such file or directory的解决办法
  5. java策略模式 工厂模式_策略模式和工厂模式搭配使用
  6. 感恩节专宠有礼,送3本技术好书
  7. java学习之操作符
  8. ChaiNext:市场情绪对行情影响开始减弱
  9. Amber Group创始人兼CEO Michael Wu:CBDC将成为更广义、重要的加密资产
  10. SAP License:SAP实施Roll out项目经验谈(二)