【Java数据结构及算法实战】系列001:聊下什么是数据结构和算法

简介: 本节是《Java数据结构及算法实战》系列的第1节,主要介绍数据结构和算法概念。

本节是《Java数据结构及算法实战》系列的第1节,主要介绍数据结构和算法概念。

对于接触过计算机基础知识的读者而言,对于下面这个公式应该不会陌生:

算法 + 数据结构 = 程序

提出这一公式并以此作为其一本专著书名[1]的瑞士计算机科学家Niklaus Wirth于1984年获得了图灵奖。

程序(Program)是由数据结构(Data Structure)和算法(Algorithm)组成,这意味着的程序的好快是直接由程序所采用的数据结构和算法决定的。

什么是数据结构

数据结构可以简单理解为是承载数据元素的容器,这个容器中的数据元素之间存在一种或者多种特性关系。比如在Java中,Map和List就是非常常见的数据结构,他们提供了非常方便的方法用于将数据元素添加到这类容器中,同时也提供了在容器中查找数据的方法。

举一个实际的例子,假设我们有一个“学生信息管理系统”需要管理学生的信息,在Java中,我们可以将学生的信息存储在List<Student>这个结构中,代码如下:

List<Student> studentList = new ArrayList<>();

学生这个类型Student代码如下:

public class Student {
    private Integer age; // 年龄
    private String name; // 姓名
    private String phoneNumer; // 电话号码
    private String address; // 地址

    public Student(Integer age, String name, String phoneNumer, String address) {
        super();
        this.age = age;
        this.name = name;
        this.phoneNumer = phoneNumer;
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumer() {
        return phoneNumer;
    }

    public void setPhoneNumer(String phoneNumer) {
        this.phoneNumer = phoneNumer;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

理论上,学生的所有信息,都可以有在Student类型中做映射,但实际上,在设计计算机系统,我们往往只会记录对该系统相关的信息,比如学生的年龄、姓名、电话号码、地址等。我们没有记录诸如学生的爱好、偶像等信息,因为这些信息对于“学生信息管理系统”而言毫无用处。

研究数据结构时,主要是从三个方面入手,这三个方面称为数据结构的三要素

  • 数据的物理结构
  • 数据的逻辑结构
  • 数据的操作(即算法)

1. 物理结构

数据的物理结构,是指数据在计算机中的存储形式。因此,物理结构又叫存储结构。

物理结构可分为四种:顺序存储结构、链式存储结构、索引结构、散列结构。其优缺点总结如下表1-1所示。

表1-1各种物理结构的优缺点

物理结构 特征 优点 缺点
顺序存储结构 一段连续的内存空间 能随机访问 插入删除效率低,大小固定
链式存储结构 不连续的内存空间 大小动态扩展,插入删除效率高 不能随机访问
索引存储结构 整体无序,但索引块之间有序,需要额外空间,存储索引表 对顺序查找的一种改进,查找效率高 需额外空间存储索引
散列存储结构 数据元素的存储位置与散列值之间建立确定对应关系 查找基于数据本身即可找到,查找效率高,存取效率高 存取随机,不便于顺序查找

2. 逻辑结构

逻辑结构分为四种类型:集合结构、线性结构、树形结构和图形结构,如下图所示1-1所示。

  • 集合结构:就是数据元素同属一个集合,单个数据元素之间没有任何关系。
  • 线性结构:类似于线性关系,也就是说,线性结构中的数据元素之间是一对一的关系。线性结构也称为线性表。
  • 树形结构:树形结构中的数据元素之间存在一对多的关系。
  • 图形结构:数据元素之间是多对多的关系。

因此,数据的逻辑结构通常可以采用一个二元组来表示:

Data_Structure = (D,R)

其中,D是数据元素的有限集,R是D上关系的有限集。

在上述数据的逻辑结构分类的基础上,还可以进一步细化,衍生出多少种常见的抽象数据类型,包括数组、链表、矩阵、栈、队列、跳表、散列、树、图等。同时,在书中也会给出上述抽象数据类型的Java实现[2]

什么是算法

算法就是解决问题的步骤。比如,要将大象装进冰箱,需要分为三个步骤:

  • 第一步,把冰箱门打开
  • 第二步,把大象放进去
  • 第三步,把冰箱门关上

在计算机科学领域,算法这个词来描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法[3]。算法是计算机科学的基础,是这个领域研究的核心。那么如何来理解算法的有限性、确定性和有效性呢?

  • 有限性:算法在有限的执行步骤之后,一定会结束,不会产生无限循环。
  • 确定性:算法的每一个指令和步骤都是简洁明确的。
  • 有效性:算法的步骤是清晰可行的,换言之,即便用户是用纸笔计算也能求解出答案。

[1]该书名为Algorithms + Data Structures = Programs,在1975年由Prentice Hall出版社出版

[2]本书不会对Java语言本身做过多的介绍。如果读者想深入了解Java语言,可以参阅笔者所著的《Java核心编程》。该书在2020年由清华大学出版社出版

[3]出自Robert Sedgewick和Kevin Wayne所著的《算法》一书。该书第4版在2012年由人民邮电出版社出版

参考引用

目录
相关文章
|
2月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
4月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
112 1
|
1月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
86 29
|
1月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
94 25
|
1月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
72 23
|
3月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
84 20
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
55 2
|
3月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
66 5
|
4月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
102 1
|
10月前
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
193 0

热门文章

最新文章