本书和传统同类书籍的区别是除了介绍基本的数据结构容器如栈、队列、链表、树、二叉树、红黑树、AVL树和图之外,引进了多任务;还介绍了将任意数据结构容器变成支持多任务的方法;另外,还增加了复合数据结构和动态数据结构等新内容的介绍。在复合数据结构中不仅介绍了哈希链表、哈希红黑树、哈希AVL树等容器,还介绍了复合数据结构的通用设计方法;在动态数据结构中主要介绍了动态环形队列、动态等尺寸内存管理算法。在内存管理中介绍了在应用程序层实现的内存垃圾回收算法、内存泄漏检查和内存越界检查的方法等。本书选取的内容均侧重于在实际中有广泛应用的数据结构和算法,有很好的商业使用价值。\r\n 本书大部分章节中都列举并介绍了应用实例,如用AVL树等容器实现的搜索引擎、用数组实现HOOK管理、用链表实现的短信息系统中的CACHE管理、用哈希表实现WebServer中的CACHE文件管理和用哈希AVL树实现抗DoS/DDoS攻击等。\r\n 书中重点介绍了软件的各种质量特性如时间效率和空间效率之间的关系,介绍了如何在各种质量特性间取得均衡的原则,并介绍了各种数据结构算法的应用场合和范围。\r\n 本书介绍的所有数据结构及算法都以不同复杂程度给出其编码实现。为了便于读者自学,每章末附有小结和思考练习题。\r\n 本书可供高校计算机及相关专业作为教学参考书,对从事软件开发与应用的科研人员、工程技术人员以及其他相关人员也具有较高的参考价值。
1 绪论 \r\n 1.1 引言\r\n 1.2 C语言编程常见问题分析\r\n 1.2.1 参数校验问题\r\n 1.2.2 return语句的问题\r\n 1.2.3 while循环和for循环的问题\r\n 1.2.4 if语句的多个判断问题\r\n 1.2.5 goto语句问题\r\n 1.2.6 switch…case和if…elseif的效率区别\r\n 1.3 任意数据类型处理\r\n 1.3.1 任意数据类型处理的设计方法\r\n 1.3.2 任意数据类型处理的实例\r\n 1.3.3 任意数据类型处理的回调函数封装\r\n 1.4 多任务介绍\r\n 1.4.1 多任务简介\r\n 1.4.2 锁的概念\r\n 1.4.3 Windows下常用多任务操作函数\r\n 1.4.4 Linux/Unix下常用多任务操作函数\r\n 1.4.5 VxWorks下常用多任务操作函数\r\n 1.4.6 多任务函数的封装\r\n 1.5 软件设计简介\r\n 1.5.1 软件设计历史简述\r\n 1.5.2 微观设计学原理简介\r\n2 数组\r\n 2.1 栈\r\n 2.1.1 栈的基本概念\r\n 2.1.2 栈的编码实现\r\n 2.1.3 多任务栈的实现\r\n 2.2 队列\r\n 2.2.1 队列的基本概念和接口\r\n 2.2.2 环形队列(Queue)\r\n 2.2.3 STL中的动态队列(STL∷deque)\r\n 2.2.4 动态环形队列 \r\n 2.2.5 各种队列的时间效率测试及分析 \r\n 2.2.6 各种队列的适用范围 \r\n 2.2.7 关于时间效率和空间效率的原则\r\n 2.3 排序表\r\n 2.3.1 排序算法介绍 \r\n 2.3.2 快速排序算法\r\n 2.3.3 排序表的设计\r\n 2.3.4 非递归的快速排序算法\r\n 2.3.5 快速排序算法的复杂度分析\r\n 2.3.6 二分查找算法\r\n 2.4 实例:HOOK管理功能的实现\r\n 2.4.1 单个函数的HOOK实现\r\n 2.4.2 多个函数的HOOK实现\r\n 2.4.3 HOOK功能的应用简介\r\n 2.4.4 HOOK使用的注意事项 \r\n 本章小结\r\n 习题与思考 \r\n3 链表\r\n 3.1 单向链表\r\n 3.1.1 单向链表的存储表示\r\n 3.1.2 单向链表的接口设计\r\n 3.1.3 单向链表的基本功能编码实现\r\n 3.2 单向链表的逐个节点遍历\r\n 3.2.1 单向链表逐个节点遍历基本概念\r\n 3.2.2 单向链表逐个节点遍历编码实现\r\n 3.3 单向链表的排序\r\n 3.3.1 插入排序\r\n 3.3.2 归并插入排序 \r\n 3.3.3 基数排序 \r\n 3.4 双向链表 \r\n 3.4.1 双向链表的基本概念\r\n 3.4.2 双向链表的设计\r\n 3.4.3 双向链表的编码实现\r\n 3.5 使用整块内存的链表\r\n 3.5.1 整块内存链表的基本概念 \r\n 3.5.2 整块内存链表的编码实现\r\n 3.6 实例:使用链表管理短信息系统的CACHE \r\n 3.6.1 短信息系统的CACHE管理基本概念\r\n 3.6.2 短信息系统的发送和接收分析 \r\n 3.6.3 短信息系统CACHE管理的编码实现 \r\n 本章小结\r\n 习题与思考\r\n4 哈希表\r\n5 树\r\n6 复合二叉树\r\n7 图\r\n8 多任务算法\r\n9 内存管理算法\r\n附 参考答案
自序
软件的核心技术是什么?一个软件要做出来后很难模仿才能称之为拥有核心技术。软件上市后,只要使用一下便知道有哪些功能,所以功能性需求是非常容易模仿的。比较难模仿的有两个方面:一是软件设计,二是数据结构与算法。好的算法可以申请专利,用作保护知识产权和限制竞争对手的重要手段,由此可见算法在软件中的重要意义。软件研发人员和测试人员的最大区别在于研发人员在数据结构与算法方面要掌握得更好。
十年前,当我初次来到深圳开始职业软件生涯时,出于对数学的热爱,闲暇时经常看一些数据结构与算法方面的书籍和资料,常从其中受到启发。经过七年的日积月累后,忽然发现CPU的速度已快到达极限,多核CPU已投入实际使用,未来将是多核CPU的天下,对多任务编程提出了更高的要求,而目前数据结构与算法方面的书籍均没有涉足多任务方面,乃下定决心写作本书,在历时三年的写作过程中又有一些新的心得写入了本书中。
数据结构与算法已经成为软件开发工程师的必备的基础知识之一,在学校里,它已经成为计算机学科的重要课程,同时也成为许多其他专业的热门选修课,社会上大多数公司在招聘软件开发人员时必然会考察应聘人员数据结构与算法的掌握程度,并将此作为衡量应聘者水平的重要依据。本书是为那些已从事软件开发或即将从事软件开发的人员而写,也可以供专业人士参考。本书注重实践,注重软件的设计与实现,为软件开发人员向职业化方向发展和进一步提升打好基础。
本书重点讲解了多任务方面的内容,讲解了使数据结构支持多任务的算法。讲解了很多新的数据结构与算法,也讲解了数据结构的设计思想,如复合数据结构和动态数据结构的设计思想,本书中的哈希红黑树和哈希AVL树的设计就是复合数据结构设计的典范,而动态等尺寸内存管理算法则是动态数据结构设计的代表。传统的垃圾收集算法在进行垃圾内存收集时应用程序会被停住,本书提供的算法在进行垃圾内存收集时不影响应用程序的运行,并且可以在应用程序层使用,效率很高。本书中的实例也都是选用比较热门的商业应用如搜索引擎、短信息系统、抗DoS攻击,WebServer等。
为了使更多的人能看懂此书,本书代码基本都使用C语言来实现,只有少数代码使用C++实现,因此具有C语言基础知识就可以阅读本书,本书的代码也很容易改写成C++,喜欢使用C++的朋友可以按照光盘中的版权申明要求将本书代码改成用C++实现,本书光盘附带的代码是可以免费使用和修改的。
本书最终得以完成有赖于许多人的帮助。首先感谢我的妻子和两岁多的儿子,在忘我投入写作的无数个周末和假日,儿子也渐渐地从襁褓长大到能四处探险。在写作过程中,他虽经常给我捣乱,但也给我带来很多欢乐,他的成长也伴随了这本书的成型。为了使我能完成自己的宿愿,妻子放弃了自己的工作,默默承担起照顾孩子和家庭的重担,有时还要帮我作一些书稿的录入工作。
感谢华中科技大学出版社对此书的重视,感谢编辑王红梅和刘勤老师等人,他们的工作大大改善了本书的质量。
感谢最初引导我进入软件行业的邓耀斌、唐玉天两人。感谢当年在 Santa Cruz 一起工作过的Neil Readshaw,九年前正是在他的指导和帮助下,我对多任务下的数据结构和算法的理解有了较大的飞跃。
本书的写作过程中参考了国内外许多有关数据结构与算法方面的文献,在此,我谨向那些卓有建树的专家、学者致以诚挚的感谢!本书的写作还得到了许多朋友的帮助和鼓励,温野、唐文宁、罗巍等人帮助校对过部分章节的内容,并给出了很好的改进建议。一些朋友多年来持续给予了我鼓励和帮助,包括章俊良、邓耀斌、张莉、洪建明等,章俊良博士还帮我查阅过关于哈密顿圈算法的一些论文资料,还有很多人请恕我在这里不能把他们一一列出,在此对他们一并表示感谢!
周伟明
2006年3月
周伟明,作者有较丰富的实践经验,曾工作于美国加州的DASCOM Inc公司(现为IBM的全资子公司)和国内某大型电信设备研发公司等各名企业,一直从事网络安全软件、网络服务器软件,机器翻译软件、工作软件、嵌入式系统软件等研发工作,亲自写过的源代码愈40万行。
无封面