新書推薦:
《
超越百岁看这本就够了
》
售價:NT$
254.0
《
亚洲戏剧史·南亚卷
》
售價:NT$
653.0
《
中国历代竹器图谱与数字活化
》
售價:NT$
2540.0
《
EDA技术与设计(第2版)
》
售價:NT$
387.0
《
揉碎浪漫(全两册)
》
售價:NT$
320.0
《
古籍善本
》
售價:NT$
2448.0
《
人民币国际化报告2024:可持续全球供应链体系与国际货币金融变革
》
售價:NT$
398.0
《
道德经新注 81幅作者亲绘哲理中国画,图文解读道德经
》
售價:NT$
653.0
|
編輯推薦: |
本书特色:
(1)由浅入深,循序渐进。每种算法策略从设计思想、算法框架入手,由易到难地讲解经典问题的求解过程。
(2)示例丰富,重视启发。书中列举大量的具有典型性的求解问题,深入剖析采用相关算法策略求解的思路,清晰地展示算法设计的过程。
(3)注重求解问题的多维性。同一个问题采用多种算法策略实现,通过不同算法策略的比较,使学生更容易了解每一种算法策略的设计特点和各自的优缺点。
(4)强调实践和动手能力的培养。书中针对相关知识点以实战题形式讨论了力扣中国网站部分在线编程题的设计思路和解决过程,让学生体会到“学以致用”和解决实际问题的乐趣。
|
內容簡介: |
本书结合Python语言的各种数据类型介绍穷举法、归纳法、迭代法和递归法等基本算法设计方法,重点讨论分治法、回溯法、分支限界法、贪心法和动态规划五大算法设计策略的原理和算法设计框架,通过大量典型示例和LeetCode实战题解析了多途径构建模型、求解和验证的过程。
全书既注重原理又注重实践,配有大量图表、练习题、上机实验题和在线编程题,内容丰富,概念讲解清楚,表达严谨,逻辑性强,语言精练,可读性好。
本书既便于教师课堂讲授,又便于自学者阅读,适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。
|
目錄:
|
扫一扫
源码下载
第1章算法入门——概论/
1.1算法概述/
1.1.1什么是算法/
1.1.2算法的描述/
1.1.3算法设计的基本步骤/
1.2算法分析/
1.2.1算法的时间复杂度分析/
1.2.2算法的空间复杂度分析/
习题1/
第2章工之利器——常用数据结构及其应用/
2.1线性表——数组/
2.1.1线性表的定义/
2.1.2Python列表/
2.1.3列表元素的排序/
2.1.4列表的复制/
2.1.5实战——移除元素(LeetCode27★)/
2.2线性表——链表/
2.2.1单链表/
2.2.2实战——反转链表(LeetCode206★)/
2.3字符串/
2.3.1字符串的定义/
2.3.2Python中的字符串/
2.3.3实战——最大重复子字符串(LeetCode1668★)/
2.4栈/
2.4.1栈的定义/
2.4.2用Python列表实现栈/
2.4.3实战——使括号有效的最少添加
(LeetCode921★★)/
2.5双端队列/
2.5.1双端队列的定义/
2.5.2Python中的双端队列/
2.5.3实战——滑动窗口中的最大值
(LeetCode239★★★)/
2.6队列/
2.6.1队列的定义/
2.6.2Python中的队列/
2.6.3实战——无法吃午餐的学生的数量
(LeetCode1700★)/
2.7优先队列/
2.7.1优先队列的定义/
2.7.2Python中的优先队列/
2.7.3实战——数据流中第k大的元素
(LeetCode703★)/
2.8树和二叉树/
2.8.1树/
2.8.2二叉树/
2.8.3实战——二叉树的完全性检验
(LeetCode958★★)/
2.9图/
2.9.1图的基础/
2.9.2实战——课程表(LeetCode207★★)/
2.10并查集/
2.10.1并查集的基础/
2.10.2实战——省份的数量(LeetCode547★★)/
2.11二叉排序树和平衡二叉树/
2.11.1二叉排序树/
2.11.2平衡二叉树/
2.11.3红黑树/
2.11.4Python中的有序类/
2.11.5实战——前k个高频单词(LeetCode692★★)/
2.12哈希表/
2.12.1哈希表的基础/
2.12.2Python中的哈希表/
2.12.3实战——多数元素(LeetCode169★)/
习题2/
第3章技能——基本算法设计方法/
3.1穷举法/
3.1.1穷举法概述/
3.1.2最大连续子序列和/
3.1.3实战——最大子序列和(LeetCode53★)/
3.2归纳法/
3.2.1归纳法概述/
3.2.2直接插入排序/
3.2.3实战——不同路径(LeetCode62★★)/
3.2.4猴子摘桃子问题/
3.3迭代法/
3.3.1迭代法概述/
3.3.2简单选择排序/
3.3.3实战——多数元素(LeetCode169★)/
3.3.4求幂集/
3.3.5实战——子集(LeetCode78★★)/
3.4递归法/
3.4.1递归法概述/
3.4.2冒泡排序/
3.4.3求全排列/
3.4.4实战——字符串解码(LeetCode394★★)/
3.5递推式计算/
3.5.1直接展开法/
3.5.2递归树方法/
3.5.3主方法/
习题3/
第4章分而治之——分治法/
4.1分治法概述/
4.1.1什么是分治法/
4.1.2分治法算法的框架/
4.2求解排序问题/
4.2.1快速排序/
4.2.2实战——最小的k个数(面试题17.14★★)/
4.2.3归并排序/
4.2.4实战——数组中的逆序对(剑指Offer51★★★)/
4.3求解查找问题/
4.3.1查找最大和次大元素/
4.3.2二分查找/
4.3.3二分查找的扩展/
4.3.4实战——寻找峰值(LeetCode162★★)/
4.3.5查找两个等长有序序列的中位数/
4.3.6查找假币问题/
4.4求解组合问题/
4.4.1最大连续子序列的和/
4.4.2实战——最大子序列的和(LeetCode53★)/
4.4.3实战——多数元素(LeetCode169★)/
4.4.4实战——三数之和(LeetCode15★★)/
4.4.5求最近点对距离/
习题4/
第5章走不下去就回退——回溯法/
5.1回溯法概述/
5.1.1问题的解空间/
5.1.2什么是回溯法/
5.1.3回溯法算法的时间分析/
5.2深度优先搜索/
5.2.1图的深度优先遍历/
5.2.2深度优先遍历和回溯法的差别/
5.2.3实战——二叉树的所有路径(LeetCode257★)/
5.3基于子集树框架的问题求解/
5.3.1子集树算法框架概述/
5.3.2实战——子集(LeetCode78★★)/
5.3.3实战——子集Ⅱ(LeetCode90★★)/
5.3.4实战——目标和(LeetCode494★★)/
5.3.5子集和问题/
5.3.6简单装载问题/
5.3.70/1背包问题/
5.3.8完全背包问题/
5.3.9实战——皇后Ⅱ(LeetCode52★★★)/
5.3.10任务分配问题/
5.3.11*实战——完成所有工作的最短时间
(LeetCode1723★★★)/
5.3.12图的m着色/
5.4基于排列树框架的问题求解/
5.4.1排列树算法框架概述/
5.4.2实战——含重复元素的全排列Ⅱ(LeetCode47★★)/
5.4.3任务分配问题/
5.4.4货郎担问题/
习题5/
第6章朝最优解方向前进——分支限界法/
6.1分支限界法概述/
6.1.1什么是分支限界法/
6.1.2分支限界法的设计要点/
6.1.3分支限界法的时间分析/
6.2广度优先搜索/
6.2.1图的广度优先遍历/
6.2.2广度优先搜索算法框架/
6.2.3实战——到家的最少跳跃次数(LeetCode1654★★)/
6.2.4实战——滑动谜题(LeetCode773★★★)/
6.2.5实战——腐烂的橘子(LeetCode994★★)/
6.3队列式分支限界法/
6.3.1队列式分支限界法概述/
6.3.2图的单源最短路径/
6.3.3SPFA算法/
6.3.4实战——网络延迟时间(LeetCode743★★)/
6.3.50/1背包问题/
6.4优先队列式分支限界法/
6.4.1优先队列式分支限界法概述/
6.4.2图的单源最短路径/
6.4.3实战——最小体力消耗路径(LeetCode1631★★)/
6.4.4*实战——完成所有工作的最短时间
(LeetCode1723★★★)/
6.4.50/1背包问题/
6.4.6任务分配问题/
6.4.7货郎担问题/
习题6/
第7章每一步局部最优——贪心法/
7.1贪心法概述/
7.1.1什么是贪心法/
7.1.2贪心法求解问题具有的性质/
7.1.3实战——分发饼干(LeetCode455★)/
7.1.4贪心法的一般求解过程/
7.2求解组合问题/
7.2.1活动安排问题Ⅰ/
7.2.2实战——无重叠区间(LeetCode435★★)/
7.2.3求解背包问题/
7.2.4实战——雪糕的最大数量(LeetCode1833★★)/
7.2.5实战——最大数(LeetCode179★★)/
7.2.6求解零钱兑换问题/
7.3求解图问题/
7.3.1使用Prim算法构造最小生成树/
7.3.2使用Kruskal算法构造最小生成树/
7.3.3实战——连接所有点的最小费用
(LeetCode1584★★)/
7.3.4使用Dijkstra算法求单源最短路径/
7.3.5实战——网络延迟时间(LeetCode743★★)/
7.4求解调度问题/
7.4.1不带惩罚的调度问题/
7.4.2带惩罚的调度问题/
7.5哈夫曼编码/
7.5.1哈夫曼树和哈夫曼编码/
7.5.2实战——最后一块石头的重量
(LeetCode1046★)/
习题7/
第8章保存子问题的解——动态规划/
8.1动态规划概述/
8.1.1从一个简单示例入门/
8.1.2动态规划的原理/
8.1.3动态规划求解问题的性质和步骤/
8.1.4动态规划与其他方法的比较/
8.2一维动态规划/
8.2.1最大连续子序列和/
8.2.2实战——最大子序列和(LeetCode53★)/
8.2.3最长递增子序列/
8.2.4*活动安排问题Ⅱ/
8.3二维动态规划/
8.3.1三角形的最小路径和/
8.3.2实战——下降路径最小和(LeetCode931★★)/
8.4三维动态规划/
8.4.1使用Floyd算法求多源最短路径/
8.4.2*双机调度问题/
8.5字符串动态规划/
8.5.1最长公共子序列/
8.5.2编辑距离/
8.6背包动态规划/
8.6.10/1背包问题/
8.6.2实战——目标和(LeetCode494★★)/
8.6.3完全背包问题/
8.6.4实战——零钱兑换(LeetCode322★★)/
8.6.5*多重背包问题/
8.7树形动态规划/
8.7.1树形动态规划概述/
8.7.2实战——找矿(LeetCode337★★)/
8.7.3实战——监控二叉树(LeetCode968★★★)/
8.8区间动态规划/
8.8.1区间动态规划概述/
8.8.2矩阵连乘问题/
8.8.3实战——最长回文子串(LeetCode5★★)/
习题8/
第9章最难问题——NP完全问题/
9.1P类和NP类/
9.1.1易解问题和难解问题/
9.1.2判定问题/
9.1.3P类/
9.1.4NP类/
9.2多项式时间变换和NP完全问题/
9.2.1多项式时间变换/
9.2.2NP完全性及其性质/
9.2.3第一个NP完全问题/
9.2.4其他NP完全问题/
习题9/
参考文献/
|
內容試閱:
|
党的二十大报告指出: 教育、科技、人才是全面建设社会主义现代化国家的基础性、战略性支撑。必须坚持科技是第一生产力、人才是第一资源、创新是第一动力,深入实施科教兴国战略、人才强国战略、创新驱动发展战略,开辟发展新领域新赛道,不断塑造发展新动能新优势。高等教育与经济社会发展紧密相连,对促进就业创业、助力经济社会发展、增进人民福祉具有重要意义。
用计算机求解问题就是将特定问题的求解过程转换为计算机可以执行的程序。能够设计好的程序是计算机专业学生的基本功。在计算机教学体系中编程类的主要课程有“高级程序设计语言”“数据结构”“算法设计与分析”等,这些课程相互承接,程序设计语言是求解问题的工具,数据结构是求解问题的基础,算法设计是求解问题的关键。
“算法设计与分析”课程是计算机科学与技术等专业的必修课,课程目的是通过学习掌握算法设计的主要策略和算法复杂性分析的方法,并能熟练运用各种数据结构和常用算法策略设计高效算法,培养学生分析问题和解决复杂工程问题的能力,为学生进一步学习后续课程奠定良好的基础。本书是编者长期从事“数据结构”“算法设计与分析”课程教学的经验总结,凝聚了编者多年的教学体会和教学理念。
1. 本书内容
全书由9章构成,各章的内容如下。
第1章为算法入门——概论,介绍算法的概念、算法描述方法、算法设计步骤和算法时空分析方法。
第2章为工之利器——常用数据结构及其应用,结合Python中的各种数据类型介绍线性表、字符串、栈、双端队列、队列、优先队列、树和二叉树、图、并查集、二叉排序树和平衡二叉树、哈希表等数据结构原理和应用。
第3章为技能——基本算法设计方法,介绍穷举法、归纳法、迭代法和递归法等常用的算法设计方法,讨论递推式计算等基本算法分析方法。
第4章为分而治之——分治法,介绍分治法的原理和框架,讨论利用分治法求解排序问题、查找问题和组合问题等,包括快速排序、归并排序、二分查找、假币问题、最大连续子序列和、多数元素和最近点对距离等典型算法。
第5章为走不下去就回退——回溯法,介绍解空间的概念和回溯法框架,根据解空间的类型分别讨论基于子集树框架和基于排列树框架的问题求解方法,包括子集和问题、简单装载问题、0/1背包问题、n皇后问题、任务分配问题、图的m着色和货郎担问题等典型算法。
第6章为朝最优解方向前进——分支限界法,介绍分支限界法的要点和框架,讨论广度优先搜索、队列式分支限界法和优先队列式分支限界法,包括图的单源最短路径、0/1背包问题、任务分配问题和货郎担问题等典型算法。
第7章为每一步局部最优——贪心法,介绍贪心法的策略和要点,讨论采用贪心法求解组合问题、图问题、调度问题和哈夫曼编码,包括活动安排问题Ⅰ、Prim算法、Kruskal算法、Dijkstra算法和不带惩罚/带惩罚的调度问题等典型算法。
第8章为保存子问题的解——动态规划,介绍动态规划的原理和要点,讨论一维动态规划、二维动态规划、三维动态规划、字符串动态规划、背包动态规划、树形动态规划和区间动态规划算法设计方法,包括最大连续子序列和、最长递增子序列、活动安排问题Ⅱ、三角形的最小路径和、Floyd算法、双机调度、最长公共子序列、编辑距离、0/1背包问题、完全背包问题和多重背包问题等典型算法。
第9章为最难问题——NP完全问题,介绍P类、NP类和NP完全问题。
书中带“*”符号的部分作为选学内容。
2. 本书特色
本书具有以下鲜明特色。
(1) 由浅入深,循序渐进。每种算法策略从设计思想、算法框架入手,由易到难地讲解经典问题的求解过程,使读者既能学到求解问题的方法,又能通过对算法策略的反复应用掌握其核心原理,以收到融会贯通之效。
(2) 示例丰富,重视启发。书中列举大量具有典型性的求解问题,深入剖析采用相关算法策略求解的思路,清晰地展示算法设计的过程,并举一反三,激发学生学习算法设计的兴趣。
(3) 注重求解问题的多维性。同一个问题采用多种算法策略实现,例如0/1背包问题采用回溯法、分支限界法和动态规划求解。通过不同算法策略的比较,使学生更容易了解每一种算法策略的设计特点和各自的优缺点,以提高算法设计的效率。
(4) 强调实践和动手能力的培养。书中针对相关知识点以实战题形式讨论了力扣中国网站部分在线编程题的设计思路和解题过程,让学生体会到“学以致用”和解决实际问题的乐趣。实战题按难度分为3个级别,即★、★★和★★★,分别对应简单、中等和困难级别。书中绝大部分实战题和全部在线编程题选自力扣中国网站,该网站是全球领先的面向社会大众的在线编程学习平台,教师和学生免费注册后可以在该平台上进行实训和交流学习。
3. 教学资源
为了方便教师教学和学生学习,本书提供了全面、丰富的教学资源。配套教学资源包括的内容如下。
(1) 教学PPT: 提供全部教学内容的精美PPT课件,共计1017页,供任课教师在教学中使用。
(2) 源程序代码: 所有源代码按章组织,例如ch3文件夹存放第3章的源代码,其中perm.py为求全排列的源代码。
(3) “算法设计与分析”课程教学大纲和电子教案: 包含教学目的、课程内容和学时分配(44学时),以及各章的课程思政要点,每课时的教学内容安排。
(4) “算法设计与分析”实验课程教学大纲: 包含课程介绍、教学目的、实验基本要求与方式、实验报告、实验内容与学时分配(15~21学时),以及推荐的在线编程题目。
(5) 本书大部分知识点配套了教学视频,视频采用微课碎片化形式组织,总时长超过19小时。
(6) 本书配套在线题库,主要包含单选题和填空题,总计超过500道,并提供习题答案。
资源下载提示
课件等资源: 扫描封底的“图书资源”二维码,在公众号“书圈”下载。
素材(源码)等资源: 扫描目录上方的二维码下载。
在线自测题: 扫描封底的作业系统二维码,再扫描自测题二维码,可以在线做题及查看答案。
微课视频: 扫描封底的文泉云盘防盗码,再扫描书中相应章节的视频讲解二维码,可以在线学习。
本书的出版得到武汉大学计算机学院核心课程建设项目的资助和清华大学出版社魏江江分社长的全力支持,王冰飞老师给予精心编辑,力扣中国网站提供了无私的帮助,在编写中河南工程学院张天伍、湖南涉外经济学院邹竞、百色学院牛思先等老师提供了具有建设性的建议,编者在此一并表示衷心的感谢。尽管编者不遗余力,但由于水平所限,书中仍存在不足之处,敬请广大教师和同学批评指正。
编者
2024年8月
|
|