概述数据结构和算法以及它们如何在您的 Java 程序中协同工作
Java 程序员使用数据结构来存储和组织数据,我们使用算法来操作这些结构中的数据。您对数据结构和算法以及它们如何协同工作了解得越多,您的 Java 程序就会越高效。
本教程推出了一个介绍数据结构和算法的简短系列。在第 1 部分中,您将了解什么是数据结构以及如何对数据结构进行分类。您还将了解什么是算法、算法是如何表示的,以及如何使用时间和空间复杂度函数来比较类似的算法。
也在文末准备了一些参考学习资料可自行阅读
什么是数据结构?
数据结构基于抽象数据类型(ADT),维基百科定义如下:
[A] 数据类型的数学模型,其中从数据用户的角度来看,数据类型由其行为(语义)定义,特别是在可能的值、对该类型数据的可能操作以及行为方面这些操作。
ADT 不关心其值的内存表示或其操作是如何实现的。它就像一个 Java 接口,它是一种与任何实现脱节的数据类型。相比之下,数据结构是一个或多个 ADT 的具体实现,类似于 Java 类实现接口的方式。
ADT 的示例包括 Employee、Vehicle、Array 和 List。考虑列表 ADT(也称为序列 ADT),它描述了共享公共类型的元素的有序集合。此集合中的每个元素都有自己的位置,并且允许重复元素。List ADT 支持的基本操作包括:
- 创建一个新的空列表
- 将值附加到列表的末尾
- 在列表中插入一个值
- 从列表中删除一个值
- 遍历列表
- 销毁清单
可以实现 List ADT 的数据结构包括固定大小和动态大小的一维数组和单链表。
数据结构分类
数据结构有很多种,从单个变量到包含多个字段的对象的数组或链表。所有数据结构都可以归类为原语或聚合,有些归类为容器。
基元 vs 聚合
最简单的一种数据结构存储单个数据项;例如,存储布尔值的变量或存储整数的变量。我将这种数据结构称为原语。
许多数据结构能够存储多个数据项。例如,一个数组可以在其各个槽中存储多个数据项,而一个对象可以通过其字段存储多个数据项。我将这些数据结构称为聚合。
我们将在本系列中看到的所有数据结构都是聚合。
容器
存储和检索数据项的任何内容都可以视为数据结构。示例包括从前面提到的 Employee、Vehicle、Array 和 List ADT 派生的数据结构。
许多数据结构旨在描述各种实体。例如,Employee类的实例是用于描述各种员工的数据结构。相比之下,一些数据结构作为其他数据结构的通用存储容器而存在。例如,数组可以存储原始值或对象引用。我将后一类数据结构称为容器。
除了作为聚合之外,我们将在本系列中看到的所有数据结构都是容器。
Java 集合中的数据结构和算法
Java Collections Framework 支持多种面向容器的数据结构和相关算法。本系列将帮助您更好地理解这个框架。
设计模式和数据结构
使用设计模式向大学生介绍数据结构已经变得相当普遍。布朗大学的一篇论文调查了几种可用于设计高质量数据结构的设计模式。除此之外,本文还展示了适配器模式对于设计堆栈和队列很有用。演示代码如清单 1 所示。
清单 1. 将适配器模式用于堆栈和队列 (DequeStack.java)
public class DequeStack implements Stack
{
Deque D; // holds the elements of the stack
public DequeStack()
{
D = new MyDeque();
}
@Override
public int size()
{
return D.size();
}
@Override
public boolean isEmpty()
{
return D.isEmpty();
}
@Override
p