编辑推荐
《数据结构》(C语言版)适合作为高等院校计算机专业算法与数据结构课程(C语言实现)的本科和研究生教材,也可供算法与数据结构受好者自学参考。
内容简介
《数据结构》(C语言版)针对采用ANSI C实现数据结构进行了全面的描述和深入的讨论。书中详细讨论了栈、队列、链表以及查找结构、高级树结构等功能,对裴波那契堆、伸展树、红黑树、2-3树、2-3-4树、二项堆、最小-最大堆、双端堆等新的数据结构进行了有效分析。《数据结构》(C语言版)对一些特殊形式的堆结构,诸如应用在双端优先队列中的最小-最大堆和双端堆的数据结构以及左高树、裴波那契堆、二项堆等数据结构,提供了经过编译和测试的程序和算法。《数据结构》(C语言版)深入阐述了平摊复杂性问题,对大多数算法进行了时间复杂性的分析。
作者简介
Ellis Horowitz于成斯康星-麦迪逊大学获得计算机科学博士学位。他从事数据结构、算法和软件设计等领域的计算机科学教育。
内页插图
目录
出版者的话
专家指导委员会
译者序
前言
第1章 基本概念
1.1 综述:系统生命周期
1.2 算法描述
1.2.1 引言
1.2.2 递归算法
1.3 数据抽象
1.4 算法的性能分析
1.4.1 空间复杂性
1.4.2 时间复杂性
1.4.3 渐近记号(O,Ω,Θ)
1.4.4 实际可行的复杂性
1.5 性能测量
1.6 参考文献和文献选读
第2章 数组与结构
2.1 ADT数组
2.2 结构与共用体
2.2.1 结构
2.2.2 共用体
2.2.3 结构的内部实现
2.2.4 自引用结构
2.3 ADT多项式
2.4 ADT稀疏矩阵
2.4.1 概述
2.4.2 矩阵转置
2.4.3 矩阵乘法
2.5 多维数组的存储表示
2.6 ADT字符串
2.6.1 概述
2.6.2 模式匹配
2.7 参考文献和文献选读
2.8 附加习题
第3章 栈与队列
3.1 ADT栈
3.2 ADT队列
3.3 迷宫问题
3.4 表达式求值
3.4.1 概述
3.4.2 后缀表达式求值
3.4.3 中缀表达式到后缀表达式的转换
3.5 多栈和多队列
3.6 参考文献和文献选读
3.7 附加习题
第4章 链表
4.1 指针
4.1.1 指针的危险性
4.1.2 动态存储分配
4.2 单向链表
4.3 动态链栈与动态链队列
4.4 多项式
4.4.1 多项式的单向链表表示
4.4.2 多项式加法
4.4.3 多项式删除
4.4.4 多项式的循环链表表示
4.4.5 小结
4.5 链表的其他操作
4.5.1 单向链表的操作
4.5.2 循环链表的操作
4.6 等价关系
4.7 稀疏矩阵
4.8 双向链表
4.9 参考文献和文献选读
4.10 附加习题
第5章 树
5.1 概述
5.1.1 术语
5.1.2 树的存储表示
5.2 二叉树
5.2.1 抽象数据型
5.2.2 二叉树的性质
5.2.3 二叉树的存储表示
5.3 二叉树的遍历
5.4 二叉树的其他操作
5.5 线索二叉树
5.6 堆
5.6.1 ADT堆
5.6.2 优先级队列
5.6.3 最大堆的插入操作
5.6.4 最大堆的删除操作
5.7 二叉查找树
5.7.1 概述
5.7.2 二叉查找树的查找
5.7.3 二叉查找树的插入
5.7.4 二叉查找树的删除
5.7.5 二叉查找树的高度
5.8 选择树
5.9 森林
5.9.1 森林转换为二又树
5.9.2 森林的遍历
5.10 集合表示
5.10.1 Union和Find操作
5.10.2 等价类
5.11 二叉树计数
5.11.1 不同的二叉树
5.11.2 栈排列
5.11.3 矩阵乘法
5.11.4 不同的二叉树数量
5.12 参考文献和文献选读
5.13 附加习题
第6章 图
6.1 ADT图
6.1.1 概述
6.1.2 定义
6.1.3 图的存储表示
6.2 图的基本操作
6.2.1 深度优先搜索
6.2.2 广度优先搜索
6.2.3 连通分支
6.2.4 生成树
6.2.5 双连通分支与关节点
6.3 最小代价生成树
6.4 最短路径与传递闭包
6.4.1 单源多目标最短路径
6.4.2 所有顶点对之间的最短路径
6.4.3 传递闭包
6.5 活动网络
6.5.1 AOV网
6.5.2 AOE网
6.6 参考文献和文献选读
6.7 附加习题
第7章 排序
7.1 查找与表验证
7.1.1 概述
7.1.2 顺序查找
7.1.3 折半查找
7.1.4 表验证
7.2 定义
7.3 插入排序
7.4 快速排序
7.5 最优的排序时间
7.6 归并排序
7.6.1 归并
7.6.2 归并排序的迭代算法
7.6.3 归并排序的递归算法
7.7 堆排序
7.8 基数排序
7.9 利用链表和映射表进行排序
7.10 内部排序总结
7.11外部排序
7.11.1 概述
7.11.2 k路归并
7.11.3 并行操作的缓冲区处理
7.11.4 归并段的生成
7.11.5 归并段的最优归并
……
第8章 散列
第9章 堆结构
第10章 查找结构
附录 ANSI C和K&RC;
索引
前言/序言
《算法的艺术:探索高效解决问题的智慧》 一、 启程:从理解问题到构建桥梁 在浩瀚的计算机科学领域,我们常常面临着看似复杂、难以逾越的挑战。这些挑战,归根结底,是我们如何有效地组织和处理信息,从而找到解决问题的最佳路径。想象一下,你身处一个巨大的迷宫,如何才能最快地找到出口?或者,你需要在一堆杂乱无章的书籍中,迅速找到一本特定的书?这些场景,无不指向核心的问题:如何高效地表示和操作数据,从而解决问题的本质。 《算法的艺术》并非一本陈列枯燥符号和抽象定义的教科书,它更像是一次深入的探索之旅,邀请你一同走进算法设计的殿堂。这本书旨在帮助你培养一种“思考”如何解决问题的能力,而不仅仅是学习已有的解决方案。它将引导你理解,为什么某些方法比其他方法更优越,为何在不同的场景下需要选择不同的策略。 本书的起点,将是对“问题”本身的深度剖析。我们将一同审视那些在计算机科学中最具代表性的问题,它们可能涉及排序、查找、图的遍历、资源的分配,甚至是模拟现实世界的复杂现象。理解问题的本质,是设计高效算法的第一步,也是最关键的一步。我们将学习如何将一个宏大的问题分解为更小、更易于管理的部分,并从中识别出可重复出现的模式。 在理解问题的基础上,我们将开始学习构建“桥梁”——也就是算法。算法,本质上是一系列清晰、有序的指令,能够指导计算机一步步地完成特定的任务。它如同为解决问题量身定制的“食谱”,每一步都精确无误,最终导向预期的结果。本书不会仅仅罗列算法的名字,而是深入探讨算法的设计思想,例如分治法(Divide and Conquer)如何将大问题分解,贪心算法(Greedy Algorithms)如何通过局部最优解推导全局最优解,以及动态规划(Dynamic Programming)如何通过存储中间结果避免重复计算。 二、 筑基:构建高效的“数据仓库” 要高效地处理信息,首先需要一个有序、易于访问的“数据仓库”。《算法的艺术》将带领你深入了解各种“数据结构”,它们是组织和存储数据的艺术,是算法得以施展的舞台。 我们首先会从最基础的“线性数据结构”开始。链表(Linked Lists)将让你领略到动态内存管理的魅力,它允许你在需要时灵活地增加或删除元素,而无需预先分配固定的空间。队列(Queues)和栈(Stacks)则是解决特定问题的利器,它们遵循“先进先出”(FIFO)或“后进先出”(LIFO)的原则,在任务调度、表达式求值等领域发挥着至关重要的作用。 接着,我们将进入更广阔的“非线性数据结构”的世界。树(Trees)是其中最重要的一类,尤其是二叉搜索树(Binary Search Trees)。通过理解树的遍历方式,如前序、中序和后序遍历,你将能够以不同的顺序访问和处理树中的数据。更进一步,我们将探索平衡二叉搜索树(Balanced Binary Search Trees),如AVL树和红黑树,它们通过维持树的平衡,极大地提高了查找、插入和删除操作的效率,即使在数据量庞大的情况下也能保持快速响应。 图(Graphs)则为我们描绘了现实世界中错综复杂的关系网络。无论是社交网络中的好友关系,还是城市之间的道路连接,图都能以其简洁而强大的方式进行建模。《算法的艺术》将详细介绍图的表示方法,如邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List),并深入探讨图的遍历算法,如广度优先搜索(BFS)和深度优先搜索(DFS)。这些算法是解决路径查找、连通性分析等问题的基石。 此外,我们还将学习哈希表(Hash Tables),一种以空间换时间的高效查找数据结构。通过理解哈希函数的设计和冲突解决策略,你将能够实现近乎常数时间复杂度的查找操作,这在搜索引擎、数据库索引等应用中不可或缺。 三、 锤炼:精进算法的“技艺” 掌握了基本的数据结构,接下来的任务便是锤炼算法的“技艺”,学习如何设计和分析算法,确保其高效且可靠。 排序(Sorting)是算法领域永恒的主题。《算法的艺术》将从简单的冒泡排序、插入排序开始,逐步深入到更高效的归并排序(Merge Sort)和快速排序(Quick Sort)。你将学习到它们的工作原理,分析它们的时空复杂度,并理解它们在不同数据规模和分布下的性能差异。堆排序(Heap Sort)也将是我们的重要学习内容,它利用堆这种数据结构,以高效的方式实现排序。 查找(Searching)与排序相辅相成。除了线性查找,我们还将重点学习二分查找(Binary Search),它利用有序数据的特性,能够以对数时间复杂度快速定位目标元素。 图算法是解决网络问题和路径规划的关键。《算法的艺术》将带领你探索最短路径算法,如Dijkstra算法和Floyd-Warshall算法,它们能够帮助我们找到网络中两个节点之间的最短距离。拓扑排序(Topological Sort)则在任务依赖关系分析中发挥着重要作用。 我们还将学习如何使用“动态规划”来解决一系列具有重叠子问题和最优子结构的问题,例如经典的背包问题(Knapsack Problem)和最长公共子序列(Longest Common Subsequence)问题。通过识别和利用子问题的重叠性,动态规划能够显著提高算法的效率。 “回溯法”(Backtracking)和“分支限界法”(Branch and Bound)则是解决组合优化问题的强大工具,它们通过系统地搜索解空间,并利用剪枝技术来排除不可能的解,从而找到最优解。 四、 融汇:实践与应用 《算法的艺术》不仅仅停留在理论层面,它更加注重将所学知识融汇于实践。每一章都将包含精心设计的练习题和实际案例分析,帮助你巩固理解,并学会如何将算法应用于解决现实世界的问题。 你将有机会亲手实现各种经典算法,在编码的过程中深化对算法细节的理解。通过调试和优化你的代码,你将更能体会到算法设计的精妙之处。 本书还将探讨如何分析算法的性能。理解时空复杂度(Time and Space Complexity)将是评价算法优劣的核心指标。你将学习到如何使用大O表示法(Big O Notation)来描述算法的增长趋势,并学会比较不同算法的效率,从而在实际应用中做出明智的选择。 此外,《算法的艺术》还会触及一些更高级的主题,例如字符串匹配算法(String Matching Algorithms),它们在文本搜索和模式识别中扮演着重要角色。你还将了解到一些概率性算法(Randomized Algorithms)的思想,以及它们在某些复杂问题上的独特优势。 五、 远航:成为问题解决的“匠人” 《算法的艺术》的最终目标,是帮助你成为一个更加敏锐、更加高效的问题解决者。它不仅仅传授知识,更重要的是培养一种思维方式。你将学会如何分析问题的结构,如何选择合适的数据结构来组织数据,以及如何设计出优雅且高效的算法来解决问题。 这本书将激励你不断思考“为什么”,而不是仅仅记住“是什么”。通过对算法设计原则的深刻理解,你将能够举一反三,应对各种新颖和复杂的挑战。无论你未来从事软件开发、数据科学、人工智能,还是其他任何与计算机相关的领域,扎实的算法基础都将是你最宝贵的财富。 当你翻阅完《算法的艺术》,你将不仅掌握一套解决问题的工具集,更将拥有一双洞察问题本质、设计高效解决方案的“慧眼”。你将不再是那个面对复杂问题束手无策的初学者,而是那个能够从容构建“桥梁”,驾驭“数据仓库”,精进算法“技艺”,并将这一切融汇贯通,成为真正的问题解决“匠人”。这是一段充满挑战,但也无比 rewarding 的旅程,等待着你的加入。
我一直觉得,学习编程,尤其是像数据结构这样偏理论性的学科,代码的质量和清晰度至关重要。在这本书里,我看到了作者在这方面的用心。每一个算法的实现,都经过了精心打磨,代码风格统一,注释清晰,即使是像图的深度优先搜索和广度优先搜索这样稍显复杂的算法,通过书中的代码,我也能一步步地跟着理清思路。我试着在自己的编译器里运行了几个例子,发现代码不仅能够正确运行,而且具有很好的可读性。这让我能够更专注于理解算法的逻辑,而不是被晦涩的代码所困扰。这种细致入微的处理,对于提升我的编程实践能力,起到了极大的帮助。