APP下载

算法在程序中的应用

2019-09-10王学梅

现代信息科技 2019年22期
关键词:程序设计算法

摘  要:算法是用于解决一个实际问题而采取的方法或思路,通过自然语言、流程图的方式可以将算法实现的基本步骤和流程表示出来。算法具有有穷性、确定性、有效性等特点,对于同一个问题,其实现的算法可以有多个。一般为了有效地解决实际问题,不仅要保证算法正确,还要考虑到算法的质量,所以选择一个合适的算法尤其重要。在进行了算法的表示之后,可以利用相应的程序设计语言将算法实现,最终解决实际问题。

关键词:算法;程序设计;线段分割

中图分类号:TP311.1      文献标识码:A 文章编号:2096-4706(2019)22-0107-03

Abstract:The algorithm is a method or idea used to solve a practical problem. Through the natural language and flow chart,the basic steps and processes of the algorithm can be expressed. The algorithm has the characteristics of poverty,certainty,validity,etc. For the same problem,there are many algorithms that can be implemented. In general,in order to effectively solve practical problems,not only to ensure the correctness of the algorithm,but also to consider the quality of the algorithm. Therefore,it is particularly important to choose a suitable algorithm. After the representation of the algorithm,we can use the corresponding programming language to implement the algorithm and finally solve the actual problem.

Keywords:algorithm;program design;segment segmentation

0  引  言

算法是解題的基本思路和方案,是对一个问题的准确而完整的表述,可以是一系列指令或流程框图,也可以是自然语言。同一个问题有很多种解决方法,也就产生了多个算法。而算法的优劣直接影响到程序的执行效率。所以,设计一个优秀的算法对于程序设计至关重要。

1  算法与程序设计的关系

一个好的程序设计,必然存在一个最优的算法设计。算法是程序设计的核心,算法的好坏在很大程度上决定了一个程序的效率。一个好的算法可以降低程序运行的时间复杂度和空间复杂度,先选出一个好的算法,再配合以一种适宜的数据结构,这样程序的效率会大大提高。一个程序的设计包含数据结构和算法两部分,其中数据结构是程序的中心,是设计程序的底层,而算法则是围绕一定的数据结构来进行操作,所以要进行利用程序设计解决实际问题之前,应首要选择正确的数据结构,然后基于此结构再设计合适的算法,选择合理的算法实现。比如,在一个学生表的基本操作中,往往会涉及一些学生信息的增、删、查、改操作,在这类操作中就有数组和链表两种数据结构和基于两种结构的不同算法。其中数组结构会因为增加、删除操作移动大量的元素,导致运行效率降低。而链表结构直接修改相应的指针指向就能够高效地完成该操作,所以在程序设计解决此类问题的时候,会选择链表结构,并基于此结构进行算法的设计。

2  算法的表示

要将算法的思路和基本步骤表示出来,常用的方法有:自然语言、流程图和伪代码等。自然语言是采用汉语、英语或其他语言的方式,表述通俗易懂,但表示方法不严格,对于一些分支、循环的算法表示出来不太方便,这种方式一般不常用。流程图是用图框的形式表示各种操作,包括传统流程图和N-S结构化流程图,传统流程图利用不同的图框表达不同的含义,常用的图框表示符号如图1所示。例如表示1+2+3+…+10的和,可以用传统流程图表示,如图2所示。

N-S流程图去掉了带箭头的流程线,将算法写在了一个矩形框内,这个矩形框还可以包含其他的从属于它的框。其包含顺序结构、选择结构和循环结构三种结构,分别以图3(a)—(d)的形式表示。

1+2+3+…+10的和用N-S流程图表示如图4所示。

流程图的表示方式虽然直观易懂,但绘制稍微复杂,并且当遇到复杂的程序设计时,会进行反复修改,为了更方便地设计算法,常用伪代码表示复杂的算法。伪代码用介于自然语言和计算机语言之间的文字和符号表示算法。仍以1+2+3+…+10的和为例,用伪代码表示:

有了以上表示算法的几种方式,对于提出的实际问题首先通过流程图或伪代码的形式表达出算法的基本思路,然后利用编程语言将算法表示出来。

3  应用线段分割算法实现微信红包随机发放

要给10个人随机发放50元的红包,要求红包最小不能低于0.01元,每个红包保留2位小数。针对此实际问题,提出了多种方法,目前用得较多的是二倍均值法和线段切割法。其中二倍均值法保证了每次随机金额的平均值是公平的。例如,对于第1人:50/10*2,随机范围为(0,10),平均可以抢到5元。

对于第2人:45/9*2,随机范围为(0,10),平均可以抢到5元。

以此类推,这样每次随机的范围均值都是一样的,但这种方式并不是真正的随机数。而线段分割法的原理则是将红包的总额当成是一条长度为红包金额的线段,将红包随机拆分成若干条子线段,每个子线段的长度即为红包的金额。这里有10个人,那就需要确定9个切割点。所以首先要进行切割点的确定,然后将各个相邻切割点之间的距离求出,即为随机的红包金额。为了满足红包最小不能低于0.01和红包保留2位小数,先将红包金额*100,这样相当于线段的长度为5000,将其分割刻度设置为1。在确定好分割点后,求出相邻分割点的距离并除以100,得出随机的金额,保留2位小数。

begin

50=>money

10=>n

(int)(money*100)=>point

List<Integer>  list=new ArrayList<>()可以用链表也可以用数组

list.add(0)

list.add(point)

while(list.size()<=n)将线段进行分割,确定分割点坐标

{

(int)(Math.random()*money)=>p

if(list.contains(p))

continue

list.add(p)

}

Collections.sort(list)将分割点坐标按大小排序,数组可以使用Arrays类

0=>i

while(i<n)

{

(list.get(i+1)-list.get(i))/100=>x

print x        输出抢到的红包金额

}

end

有了算法的基本表示,该问题的解决思路也就明了了,这里将该算法用Java来实现,部分的代码设计如下:

首先定义一个方法,该方法用于实现金额为money,红包个数为n的随机方法功能。该方法的代码:

int[] fun(double money,int n) {

int x=(int)(money*100);

int[] xx=new int[n+1];//利用数组的形式实现

int[] yy=new int[n];

xx[0]=0;

xx[n]=x;

int i=1;

while(i<n) {

int r=(int)(Math.random()*x)+1;

if(r>=1) {

if(!query(r,xx)) {

continue;

}

xx[i]=r;

i++;

}

}

java.util.Arrays.sort(xx);

//排序完成后,将每相邻的两个分割点之间的距离求出即为红包的隨机数。

for(i=0;i<xx.length-1;i++) {

yy[i]=(xx[i+1]-xx[i]);

}

return yy;

}

这里调用了一个自定义的方法query,用于查询数组中是否已经包含该分割点。query()的功能如下:

boolean  query(int x,int[] z) {

int i=0;

for(;i<z.length;i++)

{

if(x==z[i])

break;

}

if(i>=z.length) {

return true;

}

return false;

}

注:如果用链表List类框架实现的话,该框架中包含有contains(),用于判定是否在链表中已有该数据,如果有的话则返回true,否则返回false。

这样就可以直接调用该方法以保证分割点的坐标不重复。

最后在主方法中调用fun()方法即可,如:int x[]=fun (50,10);语句即可将50元随机发放给10个人,然后再除以100获取实际的金额数,并利用BigDecimal类设置该金额保留两位小数,至此随机发放红包金额的问题得以解决。

4  结  论

本文首先阐述了算法在程序中的作用,明确了算法是程序设计中的核心地位,在程序设计中起着至关重要的作用,然后描述了算法的表示方式,以传统流程图和N-S流程图为例完成了算法的设计过程,最后结合实际的微信红包应用案例描述了算法在程序设计中的重要性。在实际的程序开发中,算法的好坏直接决定了程序设计的运行效率。所以我们一定要结合实际的数据结构,确立优秀的算法思路,以保证程序的高效执行。

参考文献:

[1] 杨克昌.计算机常用算法与程序设计教程 [M].北京:人民邮电出版社,2008.

[2] 谭浩强.C程序设计:第5版 [M].北京:清华大学出版社,2017.

[3] 顾民.程序设计中的算法优化思考 [J].中国新通信,2018,20(1):65.

作者简介:王学梅(1979.08-),女,汉族,山东德州人,教师,讲师,硕士,研究方向:数据库应用、软件开发。

猜你喜欢

程序设计算法
基于OBE的Java程序设计个性化教学研究
基于Electron.js的风向玫瑰图绘制程序设计与实现
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
国际主流轧差算法介绍:以CHIPS的BRA算法为例
医学专业“Python程序设计”课程教学改革总结与思考
“C语言程序设计”课程混合教学探索
Travellng thg World Full—time for Rree
学习算法的“三种境界”
算法框图的补全