本节是《Java数据结构及算法实战》系列的第2节,主要介绍描述算法的常用的4种方式。

要定义一个算法,我们可以用自然语言、流程图、伪代码的方式描述解决某个问题的过程或是编写一段程序来实现这个过程。比如,在前面所举的“学生信息管理系统”例子中,我们希望实现添加用户、删除用户、查询用户三个算法。

1. 自然语言描述算法

可以采用自然语言的方式来描述添加用户、删除用户、查询用户三个算法:

  • 添加用户:将用户信息添加到系统中。如果已经添加了过该用户的信息,则提示用户。否则将用户信息添加到系统中,并给出提示。
  • 删除用户:将用户信息从系统中删除。如果用户信息不存在于系统中,则提示用户。否则将用户信息从系统中删除,并给出提示。
  • 查询用户:将系统中所有的用户信息查询出来。如果系统中不存在用户,则提示用户。否则将用户信息查询出来返回,并将用户信息打印出来。

使用自然语言描述的好处是任何人都能看懂。当然相比于伪代码或者程序语言而言,使用自然语言描述有时会显得繁琐。

2. 流程图描述算法

流程图(Flow Diagram)是一种通用的图形符号表示法是一种非正式的,可以清楚描述步骤和判断。图1-2展示的是用流程图的方式来描述添加用户、删除用户、查询用户三个算法。

相比较自然语言而言,通过流程图的描述,可以很清楚的看到操作的流向及经过的步骤。但需要注意的是,流程图应该只描述核心的操作步骤以及关键的节点判断,而不是事无巨细的把所有的操作都描述出来,否则只会让整个图看上去复杂难以理解。

3. 伪代码描述算法

伪代码(Pseudocode)是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。可以采用伪代码的方式来描述添加用户、删除用户、查询用户三个算法。

添加用户的伪代码如下:

input(student)
if student in studentListprint "Student exsit"
else add student in studentListprint "Add student success"

删除用户的伪代码如下:

input(student)
if student in studentListremove student from studentListprint "Remove student success"
else print "Student not exsit"

查询用户的伪代码如下:

if student in studentListoutput studentList
else print "No student exsit"

伪代码结构清晰、代码简单、可读性好,并且类似自然语言。介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码,不用拘泥于具体实现。相比程序语言(例如Java、C++、C等等)它更类似自然语言。它虽然不是标准的语言,却可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。

4. 程序语言描述算法

程序语言描述算法,实际上就是用程序语言实现算法。不同的编程语言其语法不尽相同。以下是采用Java语言的方式来描述添加用户、删除用户、查询用户三个算法。

import java.util.ArrayList;
import java.util.List;public class StudentInfoManageSystem {private List<Student> studentList = new ArrayList<>();public void addStudent(Student student) {// 如果已经添加了过该用户的信息,则提示用户。// 否则将用户信息添加到系统中,并给出提示。if (studentList.contains(student)) {System.out.println("Student exsit");} else {studentList.add(student);System.out.println("Add student success");}}public void removeStudent(Student student) {// 如果用户信息不存在于系统中,则提示用户。// 否则将用户信息从系统中删除,并给出提示。if (studentList.contains(student)) {studentList.remove(student);System.out.println("Remove student success");} else {System.out.println("Student not exsit");}}public List<Student> getStudentList() {// 如果系统中不存在用户,则提示用户。// 否则将用户信息查询出来返回,并将用户信息打印出来。if (studentList.isEmpty()) {System.out.println("No student exsit");} else {for (Student s : studentList) {System.out.format("Student info: name %s, age %d, phone %s, address %s%n", s.getName(), s.getAge(), s.getPhoneNumer(), s.getAddress());}}return studentList;}
}

为了演示上述算法,还需要一个应用入口。我们用StudentInfoManageSystemDemo类来表示应用主程序,代码如下:

import java.util.ArrayList;
import java.util.List;public class StudentInfoManageSystemDemo {public static void main(String[] args) {// 初始化系统StudentInfoManageSystem system = new StudentInfoManageSystem();// 初始化学生信息Student student = new Student(32, "Way Lau", "17088888888", "Shenzhen");// 添加学生system.addStudent(student); // Add student success// 再次添加学生system.addStudent(student); // Student exsit// 第一次查询所有学生List<Student> studentList = system.getStudentList();// 删除学生system.removeStudent(student); // Remove student success// 再次删除学生system.removeStudent(student); // Student not exsit// 查询所有学生studentList = system.getStudentList(); // No student exsit}}

运行上述程序,可以看到控制台输出内容如下:

Add student success
Student exsit
Student info: name Way Lau, age 32, phone 17088888888, address Shenzhen
Remove student success
Student not exsit
No student exsit

程序语言描述算法一步到位,写出的算法可直接交予计算机处理。对于懂得这类程序语言的开发者而言,通过运行程序可以马上验证算法的正确性。当然其缺点也较为明显:

  • 不便于体现自顶向下、逐步求解的思想;
  • 程序语言包含很多细节内容,会淹没算法的主要思想。

因此,在描述某个算法时,往往通过几种描述方式结合起来使用。

参考引用

  • 原本同步至:https://waylau.com/description-of-algorithms/
  • 本系列归档:https://github.com/waylau/java-data-structures-and-algorithms-in-action
  • 数据结构和算法基础(Java语言实现):https://item.jd.com/13014179.html

【Java数据结构及算法实战】系列002:算法的四种描述方式相关推荐

  1. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  2. 云栖社区特邀专家徐雷——Java Spring Boot开发实战系列课程【往期直播回顾】...

    徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Java Spring Boot.Spring ...

  3. c++层次遍历_数据结构与算法,弄懂图的两种遍历方式

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.  在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则, ...

  4. Java的四种引用方式

    Java的四种引用方式 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括   强引用,软引用,弱引用,虚引用 Jav ...

  5. 常用数据结构之二叉树及树的四种遍历方式

    1.树 我们选择一种数据结构,不仅要能存储数据,而且要能体现数据之间的关系.目前数据主要有是三种关系一对一.一对多.多对多:之前我们讨论了线性表(数组.链表.栈.队列),其中的元素具有一对一的关系,通 ...

  6. JAVA四种引用方式

    JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...

  7. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  8. Kotlin实战练习——自定义圆形图片三种实现方式

    Kotlin实战练习--自定义圆形图片三种实现方式 前言 如今Kotlin越来越重要,本人也开始了Kotlin的学习.为了检测学习效果,加深学习印象,同时回顾一下以前的一些知识点,决定从写一个自定义圆 ...

  9. java的rest教程_[Java教程]SpringMVC的REST风格的四种请求方式

    [Java教程]SpringMVC的REST风格的四种请求方式 0 2017-08-28 22:00:25 一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ...

最新文章

  1. 工程能力提升管理之道
  2. 《偷梁换柱》全世界最最简单对付SMSS。EXE病毒的方法,可能也是对付某类流氓程序的好方法...
  3. oracle死锁trace,Oracle 学习之性能优化(十)锁
  4. 吴恩达 coursera AI 专项二第三课总结+作业答案
  5. P2597 [ZJOI2012]灾难(top+lca)
  6. AIX下RAC巡检文档 (上)
  7. DHCP服务开启了,为什么老是网络冲突
  8. LeetCode 35. 搜索插入位置(二分查找)
  9. 缩略图修复_如何解决SOLIDWORKS不显示缩略图预览的方法?
  10. 接口自动化测试系列之PHPUnit-POST请求接口测试方法
  11. BGP中的联盟原理和实验(华为设备)
  12. JanusGraph批量导入数据优化
  13. 如何修改 WordPress 的用户默认头像?
  14. 苹果电脑mysql_MacBook 安装 MySQL 5.7.29(新手都看得懂的安装教程)
  15. Beer Bill(签到题)
  16. java学习总结(16.07.16)Random类和BigDecimal类
  17. 熊猫 PK27QA2 评测
  18. win10 使用苹果耳机没有声音解决方案
  19. TOREX | 如何延长设备的电池寿命?——充电IC
  20. UVA 1598 Exchange

热门文章

  1. Windows下CMake使用教程
  2. 如何成为更优秀的程序员?程序员进阶的8种途径
  3. C++学习之路抓紧跑路版(一)
  4. 关于JAVA POI WORD操作的一些心得(少见)
  5. stm32串口接收不到数据的一些问题
  6. oracle 闪回表定义,ORACLE闪回表数据
  7. 行人检测特征提取_HOG和adaboost检测行人检测
  8. 关于软件的空间占用,安装目录
  9. jQuery实现好评点亮星星
  10. 近两年大数据运用在地产领域增长率达38%