前言
算法一直在计算科学和计算实践中发挥着重要作用。本书致力于利用算法求解实际问题。为了最大限度地利用算法,必须深入理解算法背后的逻辑和数学知识。我们先概要地介绍算法,并探索各种算法设计技术。接下来,学习线性规划算法、PageRank算法、图算法以及机器学习算法。本书还包含一些案例(如天气预测、推文聚类和电影推荐引擎),用来说明如何才能最佳地应用这些算法。通过学习本书,你将对使用算法求解实际计算问题充满信心。
读者对象
本书为程序员而写!无论你是希望深刻理解算法背后的数学知识的经验丰富的程序员,还是希望了解如何利用经过实践检验的算法来改进代码设计和编写方式的经验不足的程序员,阅读本书都大有裨益。在阅读本书前必须具有Python编程经验,数据科学知识对阅读本书有帮助,但不是必需的。
本书内容
第1章概述算法基础。1.1节介绍理解不同算法如何工作所需的基本概念,概述人们最初如何用算法以数学的形式表达特定类型的问题,还提到不同算法的局限性。1.2节讲述描述算法逻辑的各种方法。由于本书用Python编写算法,1.3节说明如何设置环境以运行书中给出的例子。1.4节介绍算法设计技术。1.5节讨论如何用不同方法量化算法性能,并与其他算法进行比较。1.6节讨论验证算法的特定实现的各种方法。
第2章着重讲述算法中用于存储临时数据的内存数据结构。算法可能是数据密集型的,也可能是计算密集型的,或者既是数据密集型的又是计算密集型的。对于所有不同类型的算法,选择恰当的数据结构对其最佳实现而言至关重要。许多算法具有递归和迭代逻辑,因而需要面向这种本征逻辑的专用数据结构。由于本书用Python编写算法,这一章主要关注实现书中算法所需的Python数据结构。
第3章给出用于排序和查找的核心算法。这些算法在后面将作为其他更复杂算法的基础。本章先讲述不同类型的排序算法,包括各种算法的性能比较。然后,讲述各种查找算法,量化这些算法的性能和复杂度,并进行比较。最后,讲述这些算法的实际应用。
第4章讲述设计各种算法所需的核心概念,阐述各种算法并讨论它们的优缺点。理解这些概念对设计最优的复杂算法而言至关重要。这一章先讨论不同类型的算法设计,然后求解著名的旅行商问题。之后讨论线性规划及其局限性。最后,用实例展示如何用线性规划进行产量规划。
第5章着重讲述常见于计算机科学中的图算法。图是许多计算问题的最佳模型。本章讲述表示和搜索图的各种方法。搜索图意味着用系统化的方法沿图中的边访问图中的顶点。图搜索算法可以发现图的很多结构。很多算法都通过在输入图上执行搜索算法来获得结构信息。其他几个图算法都是基本图搜索算法的细化。图的搜索技术是图算法领域的核心。该章首先讨论图的两种常见的计算表示:邻接表和邻接矩阵。接下来,讲述广度优先搜索这种简单的图搜索算法,并说明如何创建广度优先搜索树。然后讲述深度优先搜索,并给出深度优先搜索算法访问顶点顺序的标准结论。
第6章讨论无监督机器学习算法。之所以被归类为无监督方法,是由于这些模型或算法在无监督条件下从给定数据中学习固有的结构、模式和关系。我们先讨论聚类方法,这种机器学习方法基于固有的属性或特征,试图从数据集的数据样本中找出相似性模式和关系模式,然后把数据样本划分为集群,使得各个集群内的数据样本具有相似性。接下来,讨论降维算法,该算法用于处理特征较多的问题。之后,讨论关联规则挖掘算法,它们属于数据挖掘方法,用于检查和分析大规模交易数据集,以发现有意义的模式和规则,而这些模式表示了跨交易的各种商品之间有意义的关系和关联。最后,讨论处理异常检测的算法。
第7章描述与一组机器学习问题相关的传统监督机器学习算法。这些问题中的标记数据集具有输入属性和相应的输出标签或类别。这些输入和其相应的输出用于学习一个一般性系统,该系统用于预测不在数据集中的其他数据点的结果。我们先从机器学习的角度概述分类的相关概念。接下来,讨论重要的算法之一——决策树,给出决策树算法的局限性和优势。接着介绍支持向量机和XGBoost这两种重要的算法。最后,讨论线性回归这种最简单的机器学习算法。
第8章首先介绍典型神经网络这种最重要的机器学习技术的主要概念和组成部分。然后介绍各种神经网络,并阐述用于实现这些神经网络的激活函数。之后,详细讨论反向传播算法,这是目前应用最广泛的训练神经网络的收敛算法。接下来,介绍迁移学习技术,它可以大大简化模型训练并部分地使其自动化。最后,给出一个学习实例,讨论如何在现实世界中利用深度学习进行欺诈检测。
第9章介绍自然语言处理算法,从理论到实践循序渐进地展开。首先介绍基础知识,然后讨论背后的数学知识。接下来,介绍一种流行的神经网络,它广泛应用于设计和实现文本数据上的重要用例。此外,还介绍自然语言处理算法的局限性。最后,给出一个案例,讨论如何在自然语言处理领域训练机器学习模型,以进行电影评论情感分析。
第10章重点讨论推荐引擎,它先用与用户偏好相关的信息建立模型,然后基于模型和信息向用户提供推荐。推荐引擎总是建立在顾客和商品之间被记录的交互过程基础之上。我们先介绍推荐引擎背后的基本思想,然后讨论各种推荐引擎,最后讨论如何利用推荐引擎向用户推荐各种商品。
第11章着重讨论以数据为中心的算法的相关问题。本章先简要概述与数据相关的一些问题,然后讨论用于数据分类的标准。接下来,介绍如何应用算法处理流数据,然后讨论压缩数据的各种方法。最后,通过实例学习如何从推文数据中提取模式。
第12章讨论与密码学相关的算法。我们先介绍背景知识,之后讨论对称加密算法。然后,阐述消息摘要算法MD5和SHA,并解释实现对称加密算法的局限性和不足。接下来,讨论非对称加密算法和如何使用它创建数字证书。最后用一个实例总结所有这些技术。
第13章阐述大规模算法如何处理单个节点内存无法容纳的数据和需要多CPU才能进行的处理。本章首先讨论何种算法最适于并行运行。然后讨论算法并行化的相关问题。接下来介绍CUDA架构,并讨论如何使用单个或多个GPU来加速算法。此外,还讨论如何修改算法才能有效利用GPU的性能。最后,讨论集群计算和Apache Spark如何创建弹性分布式数据集(RDD),进而创建标准算法的高速并行实现。
第14章先讨论可解释性,这一重要主题为自动决策背后的逻辑做出解释,因而变得越来越重要。之后,讨论算法使用过程中的伦理和算法实现时产生偏差的可能性。接下来,详细讨论处理NP难问题的技术。最后,总结算法的实现方式和与此相关的各种现实挑战。
软硬件要求
下载示例代码及彩色图像
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。
书中的代码也可以通过访问GitHub代码库(https://github.com/PacktPublishing/40-Algorithms-Every-Programmer-Should-Know)获取。
本书约定
本书中使用了许多排版约定。
代码体
:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。例如:“让我们看看如何使用push
向栈内添加新的元素,或使用pop
从栈中删除元素。”
代码块设置如下:
当我们希望提醒你注意代码块的某个特定部分时,相关的行或项将以粗体显示:
命令行输入或输出如下所示:
黑体:表示新术语和重要词汇。例如,在菜单或对话框中出现的文字都以这种方式处理。例如:“降低算法复杂度的一种方法是在算法的准确度上进行折中,从而得到一种称为近似算法的算法。”
表示警告或重要的说明。
表示提示和技巧。