高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》

高级算法和数据结构

为什么要选择本书

谈及为什么需要花时间学算法,我至少可以列举出三个很好的理由。

(1)性能:选择正确的算法可以显著提升应用程序的速度。仅就搜索来说,用二分查找替 换线性搜索就能为我们帶来巨大的收益。

(2)安全性:如果你选用了错误的算法,攻击者就可以利用它使你的服务器、节点或应 用程序崩溃。比如哈希碰撞拒绝服务攻击,就利用了作为字典来存放POST 请求以提交参数 的哈希表,并使用有可能导致大量碰撞的序列来让这个哈希表退化,进而使整个服务器停止 响应。另一个关于安全性的有趣例子是,曾有黑客成功使用有缺陷的随机数生成器入侵在线 扑克网站。1

(3)设计代码的效率:如果有合适的构建模块可用来完成各种事情(特别是如果还能重用 代码的话),你就能更快地实现代码的编写,而且会让代码更整洁。

那么,为什么推荐你阅读本书呢?一个很重要的原因就是,在本书中,我精挑细选地为你 准备了一个具有战略意义的“高级算法库”,其中的算法能够帮助你改进代码,进而应对现代系 统面临的各种挑战。

此外,我试着用一种不同于普通教材的方法来介绍这些算法。虽然本书也会解释算法背后 的理论,但更侧重于给出使用这些算法的实际应用程序的相关背景信息,以及在什么时候应该 使用这些算法的建议。

在日常工作中,你通常要做的是处理某个大型软件(也可能是遗留软件)上的某个特定部 分。但是,在整个职业生涯中,你肯定会遇到需要设计大型软件的情况。到了那时,你就会用 上本书讨论的大部分内容了。我将尽可能地给出有关如何编写简洁且高效代码的建议,以帮助 你解决将来要面对的相关问题。

正是因为采用了这种新的方式来介绍算法,所以在每一章中,我都会列举有助于解决某些 问题的数据结构。这是一本当你需要用以提高应用程序性能的建议时,可以随时参考的辅助性 手册。

适读人群 :1.高等院校计算机相关专业本科高年级学生以及研究生2.从事与算法相关工作的开发者、程序员、工程师

1.使用特定的数据结构和(或)算法来提高性能”,解决工程实战中存在的真实问题。
2.Github国内大厂、美国大厂的面试题中会多有涉及。
3.涵盖国内大厂、美国大厂常见面试,包括动态规划、布隆过滤器、图计算等。

这是一本关于“高级/进阶”算法和数据结构的图书,主要介绍了用于Web 应用程序、系统 编程和数据处理领域的各种算法,旨在让读者了解如何用这些算法应对各种棘手的编码挑战, 以及如何将其应用于具体问题,以应对新技术浪潮下的“棘手”问题。

本书对一些广为人知的基本算法进行了扩展,还介绍了用于改善优先队列、有效缓存、对 数据进行集群等的技术,以期读者能针对不同编程问题选出更好的解决方案。书中示例大多辅 以图解,并以不囿于特定语言的伪代码以及多种语言的代码样本加以阐释。

学完本书,读者可以了解高级算法和数据结构的相关内容,并能运用这些知识让代码具备 更优性能,甚至能够独立设计数据结构,应对需要自定义解决方案的情况。

本书可作为高等院校计算机相关专业本科高年级学生以及研究生的学习用书,也可供从事与 算法相关工作的开发者参考。

本书的内容是如何组织的:路线图

第 1 章定义了算法和数据结构,阐释了它们的区别,并通过一个例子探究了用不同算法解 决问题的过程,以及如何利用这些算法来找到更好的解决方案。

从第2章开始,本书剩余的内容将分为三大部分以及附录。每一部分会集中介绍一大类内 容——可以是某个抽象的目标,也可以是我们需要解决的某类问题。

第一部分探讨了一些高级数据结构,目的是让你进一步掌握像跟踪一个或一组事物这样的 基本操作。这一部分旨在让你熟悉这样一种思维模式:对数据执行操作的方法有很多,而最好 的方法取决于上下文和需求。

第2章介绍了二叉堆的高级变体——d 叉堆,还描述了第一部分各章中用来介绍各种主题的 编撰结构。

第 3 章利用树堆进一步探讨了堆的高级用法。树堆是二叉搜索树和堆的混合体,可以在不 同的上下文中提供帮助。

第4章介绍了布隆过滤器。这是哈希表的一种高级形式,可以帮助我们节省内存,同时将 查找操作的平摊时间复杂度维持在常数级别。

第5章介绍了一些用来跟踪不交集的替代数据结构。不交集是构建高级算法的基石,已用 在若干实际应用中。

第6章介绍了两种在存储和查找字符串方面都优于通用容器的数据结构: trie (前缀树)和 基数树(又称为压缩前缀树)。

第7章基于前面介绍的数据结构构建了一种能有效处理缓存的组合数据结构: LRU 缓存,还 详细讨论了LFU 缓存 (LRU 缓存的变体)以及如何在多线程环境中同步共享容器的问题。

第二部分探讨搜索算法的一种特殊情况:处理多维数据时应该如何索引这些数据,以及如 何执行空间查询。本书将再次展示一些比使用基本搜索算法有更大改进的专用数据结构。不仅 如此,这一部分还将描述另一个重要的主题——聚类。聚类用到了大量的空间查询,还用到了MapReduce 这样的分布式计算模型。

第8章探讨了最近邻问题。

第9章描述了k-d 树——一种支持在多维数据集上进行高效搜索的解决方案。 第10章介绍了树的更多高级版本,如 SS 树和R 树。

第11章深入探讨了如何基于需要派送的客户地址找到最近的仓库,还着重介绍了最近邻搜 索的应用。

第12 章介绍了三种旨在高效实现最近邻搜索的聚类算法: k 均值算法、DBSCAN 算法和 OPTICS 算法。

第13章介绍了MapReduce (一种强大的分布式计算模型),并探讨了如何将其应用到第12 章所讨论的聚类算法上。

第三部分只关注一种数据结构——图。这部分内容将介绍各种旨在推动当今人工智能和大 数据发展的算法。

第14章介绍了图数据结构的基础知识,还介绍了深度优先遍历(DFS)、广度优先遍历(BFS)、 迪杰斯特拉算法以及A*算法,并描述了如何使用它们来解决“最短路径”问题。

第15章介绍了图嵌入、平面性以及稍后几章将要尝试解决的几个问题,例如如何找到对图 进行嵌入时的最小交叉数,以及如何更好地绘制图。

第16章描述了一种我们在机器学习中经常要用到的基本算法——梯度下降算法,并展示了 如何将这种算法应用于图以及图嵌入。

第17章在第16章的基础上介绍了模拟退火算法——这是一种更强大的优化技术。在处理 不可微函数或是具有多个局部最小值的函数时,这种算法能够克服梯度下降算法的缺点。

第18章描述了遗传算法——这是一种十分高级的优化技术,有助于加快收敛速度。

本书各章会按照“提出问题→设计数据结构作为解决方案→实现解决方案并分析运行时间 和内存需求”这一结构来安排内容。

最后,附录部分涵盖了阅读本书所必须掌握的那些关键主题。附录不是基于示例来讲解的, 而是采用了与正文不同的内容组织方式。附录旨在向读者提供在开始阅读正文之前就应该熟悉的 各种知识的摘要,其中的大部分主题是基础算法课程中的内容。我们建议读者在阅读第2章之前 浏览一遍附录中的内容。

附录 A 介绍了用来描述算法的伪代码的各种符号。

附录B 提供了对大O 符号以及时间分析与空间分析的总结。

附录C 和附录D 给出了各种核心数据结构的摘要。这些数据结构是本书将要介绍的各种高 级数据结构的基础模块。

附录 E 解释了递归。递归是一种比较具有挑战性的编程技术,旨在对算法进行更明确、更 简洁的定义。当然,在采用递归时,我们需要对利弊进行权衡。

附录 F 给出了不同类型的随机算法的定义,包括蒙特卡罗算法、拉斯维加斯算法,还介绍 了各种分类问题和随机解决方案的评估指标。

关于代码

本书中的算法是用伪代码加以解释的,因此读者不需要有特定编程语言的背景知识。

不过,我们还是希望读者对基本的、与语言无关的编程概念有一定的了解,例如循环、条 件、布尔运算符、变量以及赋值的相关概念。

附录 A 提供了一份简短的指南,对本书用到的语法(或者更确切地说,伪语法)进行了介绍。我们建议读者能够在开始阅读第1章之前浏览一遍附录A。当然,如果你对自己非常有 信心,可以直接阅读正文中的代码,当觉得对其中使用的语法不甚了解时,再参考附录 A 中 的内容。

本书给出了伪代码,如果你对特定的编程语言感兴趣,或者想要弄清楚书中的概念是如何 用真实的可执行代码来实现的,可访问本书的GitHub 仓库,以了解如何使用不同的编程语言(如 Java 、Python 、JavaScript) 实现本书介绍的各种数据结构。

关于作者

Marcello La Rocca现为一家电商公司的高级软件工程师,曾参与开发 Twitter、微软和苹果 等公司的大型Web 应用程序和数据基础设施,并发明了NeatSort 这一自适应排序算法。他的主 要研究领域为图、算法优化、机器学习和量子计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209851.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能发展史

人工智能(AI)的发展史是一段跨越数十年的旅程,涵盖了从早期理论探索到现代技术革新的广泛内容。人工智能的发展历程展示了从最初的概念探索到现代技术突破的演变。尽管经历了多次起伏,但AI领域持续进步,不断拓展其应用…

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下: 注:骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 (TKP),你要找到最短的…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码(不在Android源码) 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动,有个技巧可以new 空proje…

个人博客搭建保姆级教程-HTML页面编写篇

选择模板 首先我们要选一个好的模板,然后对模板进行剪裁。我的模板是在站长之家进行下载的 素材下载-分享综合设计素材免费下载的平台-站长素材 我选的模板的具体地址是 个人博客资讯网页模板 这里需要我们学习一下在前边一篇文章里提到的HTML、JavaScript、CSS…

C++ :运算符重载

运算符重载: 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C编译器,当遇到该重载的运算符…

华为拆分零部件业务,长安入股,赛力斯接洽中

作者 |德新 编辑 |王博 11月26日,长安汽车官宣与华为在智能汽车零部件业务上的投资与合作: 华为拟成立一家新的公司,并将其在智能汽车解决方案业务上的核心技术和资源注入新公司,长安汽车及关联方有意投资该新公司。 参照目前长…

浮点数二分例题:数的三次方根-Java版

//浮点数二分,正常写就行,不用考虑死循环问题import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);Double n sc.nextDouble();double l -100,r 100;//数据范围是100000,开了三次方后不会超过100//小知…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了,一些概念和操作已经模糊。 最近与人聊起SQL注入,重新翻阅,暂记于此。 重点:敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

打破卫浴行业冰山!九牧重构高端服务品牌“点线面”新秩序

文 | 螳螂观察 作者 | 余一 说到服务,你首先会想到哪个品牌?海底捞大概率会是其中之一。 一个餐饮品牌,不靠价格、口味出圈,而是凭借服务走向全球市场,古往今来或许也是头一家了,而无微不至的的服务&…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类…

MySQL安装

目录 MySQL简介 MySQL安装 连接MySQL数据库 MySQL简介 MySQL是最流行的关系型数据库管理系统之一,属于Oracle旗下产品。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL作为网站数据…

JVM:双亲委派(未完结)

类加载 定义 一个java文件从编写代码到最终运行,必须要经历编译和类加载的过程,如下图(图源自b站视频up主“跟着Mic学架构”)。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中,得到一…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料,分享一下; 一些模块的流程图,比如动画模块: 或角色相关流程: 由于图片比较大,上传到了网络,可自取: 链接:https://pan.baidu.com/s/1BQ2KiuP08c…

GitHub项目推荐-Deoldify

有小伙伴推荐了一个老照片上色的GitHub项目,看了简介,还不错,推荐给大家。 项目地址 GitHub - SpenserCai/sd-webui-deoldify: DeOldify for Stable Diffusion WebUI:This is an extension for StableDiffusions AUTOMATIC1111 w…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

SWD和JTAG

1、调试接口概念 1)SWD:Serial Wire Debug,代表串行线调试,是ARM设计的协议,用于对其微控制器进行编程和调试。 SWD 引脚: SWDIO–串行数据线,用于数据的读出和写入SWDCLK–串行时钟线&#…

实现用户登陆

输入用户名和密码,如果输入用户名和密码正确,允许登录 编程过程中采用字符串拉接。 SQL注入,当使用拼接的sql语句. 输入密码时把语句拼接成or,or后面跟上一个条件正确的式子。 Java 防止sql注入,预编译手段&#xff…

使用Pytorch从零开始实现CLIP

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…