零、前言

数据结构和算法是软件应用程序开发的一个组成部分。无论我们是使用 PHP 构建基于 web 的应用程序、CMS 还是独立的后端系统,我们都需要始终应用算法和数据结构。有时,我们这样做时没有注意到,有时也没有给予适当的注意。大多数开发人员认为这两个主题非常困难,没有必要关注细节,因为 PHP 有很多内置的数据结构和算法支持。在本书中,我们将重点介绍 PHP 数据结构和算法的基础知识和实际示例,以便了解什么是数据结构、为什么选择它们以及在哪里应用哪些算法。这本书是为新手以及经验丰富的 PHP 程序员设计的。这本书从基本主题开始,然后转到更高级的主题。在本书中,我们尝试用图像和解释来容纳大量的例子,以便您能够以视觉形式和实际例子正确理解这些概念。

这本书涵盖的内容

第一章数据结构和算法简介,重点介绍不同的数据结构及其定义、性质和示例。本章还包括我们分析算法并发现其复杂性的方法,特别强调大 Oh(O)表示法。

第 2 章了解 PHP 数组,重点介绍 PHP 中一个非常基本的内置数据结构——PHP 数组。本文还介绍了我们可以通过 PHP 数组实现的功能及其优缺点。我们关注如何使用数组实现其他数据结构。

第 3 章使用链表,涵盖了不同类型的链表。重点介绍了链表不同方差的分类及其构造过程,并举例说明。

第 4 章构建栈和队列,重点介绍本章中最重要的两种数据结构——栈和队列。我们将看到如何使用不同的方法构造栈和队列,并通过示例讨论它们的操作和用法

第五章应用递归算法——递归,重点关注算法的一个重要主题——递归。我们将介绍使用递归算法解决问题的不同方法,以及使用这种技术的优缺点。我们还介绍了一些基本的日常编程问题,我们可以使用递归解决这些问题。

第 6 章理解和实现树讲述了一种非层次化的数据结构——树。我们将介绍树的属性以及如何构造它们,并了解树数据结构对我们很重要的情况。

第 7 章使用排序算法演示了如何实现不同的排序算法及其复杂性,因为排序是编程世界中一个非常重要的话题,寻找高效的排序算法一直在进行。在本章的最后,我们还介绍了内置的 PHP 排序算法。

第 8 章探索搜索选项,阐述了搜索在编程世界中的重要性。在本章中,我们将重点介绍不同的搜索技术以及何时使用哪些算法。我们还讨论了在搜索之前是否应该进行排序。本章包含许多不同算法的示例和实现。

第 9 章将图形付诸行动解释了图形算法是编程范式中应用最广泛的算法之一。在这一章中,我们关注不同的与图相关的问题,并使用不同的算法来解决它们。我们将介绍最短路径算法和最小生成树的实现,并给出示例和解释。

第 10 章理解和使用堆,讲述了书中最后一个数据结构主题——堆。它是一种非常高效的数据结构,在现实世界中的许多实现中都使用了它。我们将展示如何构建堆及其用途,包括堆排序算法的实现

第 11 章用先进技术解决问题重点介绍解决问题的不同技术。我们将重点讨论诸如记忆、动态规划、贪婪算法和回溯等主题,以及实际问题的示例和解决方案。

第 12 章PHP 内置的数据结构和算法支持,展示了我们对数据结构和算法的内置支持。我们将讨论 PHP 的函数、PECL 库,以及一些在线资源的参考资料。

第 13 章使用 PHP 的函数数据结构对使用 PHP 的函数式编程和函数式数据结构进行了一些介绍,因为函数式编程现在正在大肆宣传。我们介绍了一个名为 Tarsana 的函数式编程库,并展示了使用它的不同示例。

这本书你需要什么

您只需要在计算机上安装最新的 PHP 版本(最低要求为 PHP7.x)。您可以从不需要 web 服务器的命令行运行这些示例。但是,如果需要,您可以安装 Apache 或 Nginx,或以下软件:

  • PHP7.x+
  • Nginx/apache(可选)
  • PHP IDE 或代码编辑器

这本书是给谁的

本书面向那些希望通过 PHP 学习数据结构和算法以更好地控制应用程序解决方案、效率和优化的人。 需要对 PHP 数据类型、控制结构和其他基本功能有基本的了解。

习俗

在本书中,您将发现许多文本样式可以区分不同类型的信息。下面是这些风格的一些例子,并解释了它们的含义。

代码使用与书本文本字体不同的字体编写,以突出显示代码块。

代码块设置如下:

[default]
class TreeNode {
    public $data = NULL;
    public $children = [];
    public function __construct(string $data = NULL) {
         $this->data = $data;
    }
    public function addChildren(TreeNode $node) {
         $this->children[] = $node;
    }
}

当我们希望在解释过程中提请您注意代码块的特定部分时,该代码会在文本中突出显示,如下所示:**addChildren**

任何命令行输入或输出的编写方式如下:

Final -Semi Final 1 --Quarter Final 1 --Quarter Final 2 -Semi Final 2 --Quarter Final 3 --Quarter Final 4

新术语和重要词语以粗体显示。您在屏幕上看到的单词(例如,在菜单或对话框中)会出现在文本中,如:“单击下一步按钮将移动到下一个屏幕。”

Warnings or important notes appear in a box like this. Tips and tricks appear like this.

读者反馈

我们欢迎读者的反馈。让我们知道你对这本书的看法你喜欢还是不喜欢。读者反馈对我们来说很重要,因为它可以帮助我们开发出您将真正从中获得最大收益的标题。

要向我们发送总体反馈,只需发送电子邮件feedback@packtpub.com,并在邮件主题中提及该书的标题。

如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请参阅我们的作者指南www.packtpub.com/authors

客户支持

既然您是一本 Packt 图书的骄傲拥有者,我们有很多东西可以帮助您从购买中获得最大收益。

下载示例代码

您可以从您的帐户下载本书的示例代码文件 http://www.packtpub.com 。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。

您可以通过以下步骤下载代码文件:

  1. 使用您的电子邮件地址和密码登录或注册我们的网站。
  2. 将鼠标指针悬停在顶部的“支持”选项卡上。
  3. 点击代码下载和勘误表。
  4. 在搜索框中输入图书的名称。
  5. 选择要下载代码文件的书籍。
  6. 从您购买本书的下拉菜单中选择。
  7. 点击代码下载。

下载文件后,请确保使用以下最新版本解压或解压缩文件夹:

  • WinRAR/7-Zip for Windows
  • 适用于 Mac 的 Zipeg/iZip/UnRarX
  • 适用于 Linux 的 7-Zip/PeaZip

该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/PHP7-Data-Structures-and-Algorithms 。我们在上还提供了丰富的书籍和视频目录中的其他代码包 https://github.com/PacktPublishing/ 。看看他们!

下载本书的彩色图像

我们还为您提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。彩色图像将帮助您更好地了解输出中的更改。您可以从下载此文件 https://www.packtpub.com/sites/default/files/downloads/PHP7DataStructuresandAlgorithms_ColorImages.pdf

勘误表

虽然我们已尽一切努力确保内容的准确性,但错误确实会发生。如果您在我们的一本书中发现错误,可能是文本或代码中的错误,如果您能向我们报告,我们将不胜感激。通过这样做,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。如果您发现任何错误,请访问进行报告 http://www.packtpub.com/submit-errata ,选择您的书籍,点击勘误表提交表单链接,然后输入勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上载到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。

要查看之前提交的勘误表,请转至https://www.packtpub.com/books/content/support 并在搜索字段中输入图书名称。所需信息将出现在勘误表部分下。

盗版行为

在互联网上盗版版权材料是所有媒体都面临的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现任何形式的非法复制品,请立即向我们提供地址或网站名称,以便我们采取补救措施。

请致电copyright@packtpub.com与我们联系,并提供可疑盗版材料的链接。

我们感谢您在保护我们的作者方面提供的帮助以及我们为您带来有价值内容的能力。

问题

如果您对本书的任何方面有任何问题,可以通过questions@packtpub.com与我们联系,我们将尽力解决该问题。