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

您所在的位置:网站首页 为解决问题而采用的方法和步骤称为 让你提前认识软件开发(14):程序中的算法

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

2024-07-18 06:40:00| 来源: 网络整理| 查看: 265

第1部分 重新认识C语言

程序中的算法

 

【文章摘要】

        算法(Algorithm),是程序的灵魂。著名计算机科学家、图灵奖获得者沃思曾提出过一个公式:数据结构+算法=程序。可见,算法在程序中占有非常重要的地位。

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

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

【关键词】

        C语言 算法  程序

 

1. 算法概述

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

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

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

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

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

 

2. 算法的图形化表示

        为了形象化地体现出算法,不同的学者设计出了不同的方法,这些方法包括:自然语言,流程图,N-S流程图,伪代码等。在实际的编程工作中,大都采用流程图来直观地表示算法。流程图逻辑清晰,很适合开发人员使用。

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

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

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

 

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

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

        但不管是专门的算法工程师,还是一般的软件开发工程师,我们都会经常与算法打交道。以下介绍作者本人在项目工作中所遇到过的一些算法问题。

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



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭