《程序员的数学思维修炼(趣味解读)》
数学在人类文明的发展过程中起着非常重要的作用。数学推动了重大的科学技术进步。从远古的“结绳记事”,到现代计算机技术的快速发展,都与数学这门学科的发展密不可分。
无论是日常生活中简单的商品交易计算,还是神舟飞船设计中复杂的计算,都离不开数学。生活即数学。没有二进制,就不会有现在的计算机;没有几何学,就没有现在的高楼大厦……。
对于程序员来说更需要知道:数学是计算机科学的基础。在我国,绝大部分大学的计算机科学系都是从数学系中分出来的。由此也可以看出,计算机科学与数学的关系非常紧密。
数学是一门化繁为简的学科。通过数学,可以对现实生活中的很多不同事物进行高度抽象,从而能找出不同事物的共性。不过,由于数学的这种高度抽象,又使数学变得很难学。特别是一些复杂的公式推导,看起来就头痛。
本书面向程序员介绍了程序设计中常用的数学基础知识。通过阅读本书,可以训练程序员的数学思维能力和程序设计能力,进而拓宽视野,增强职场竞争力。
本书特点
· 简单易懂 用通俗易懂的语言讲解知识点,尽量避免复杂的公式推导过程,让读者能够轻松阅读并掌握相关的数学知识。
· 门槛很低 阅读本书的读者不需要精通很多高深的数学知识,只需要具备基本的四则运算、乘方等数学基础知识和日常生活中的基本逻辑判断能力即可。
· 生动有趣 本书拒绝枯燥乏味的讲解,而是代之以轻松活泼的风格,讲解时列举了大量我们都很熟悉,而且非常有趣的数学实例。
· 内容丰富 本书从最简单的数据的表示开始,对素数、递归、排列组合、逻辑推理、几何构造、统筹规划等方面都会逐一介绍,涵盖了程序员需要掌握的数学知识。
· 图文并茂 讲解每个知识点和实例时,都给出了简单易懂的图示和必要分析,让读者理解起来清晰明了,没有任何障碍,也让读者感觉到学习数学并不困难。
本书内容概述
第1章通过一则童话故事导入了数据大小的知识,然后逐步介绍了十进制、二进制、八进制、十六进制以及其他常用进制的知识,还介绍了不同进制的转换方法。
第2章从素数的判断开始,逐步介绍了与素数相关的数学知识,包括孪生素数、梅森素数、哥德巴赫猜想、RSA的应用等内容。
第3章介绍递归这种自己调用自己的方法,通过阶乘、汉诺塔、斐波那契数列等经典实例,练习从复杂事物中发现递归结构的方法。
第4章的主题是排列组合,从乘法原理、加法原理入手,介绍了排列与组合的概念和关系,并研究了计算机中的字符编码、密码长度等相关内容。
第5章讨论余数。主要介绍使用余数对数据进行分组,如日历、一些小魔术都是通过余数分组的规则进行的;本章还讨论了计算机中的奇偶校验及两个有趣的问题(座位安排和智叟分牛)。
第6章介绍概率的相关知识,首先从两个常见的事例导入概率的概念,接着从军事故事、赌场游戏、中奖概率等方面介绍了概率的实际应用。
第7章学习翻番的知识。首先介绍翻番和翻倍的概念、计算方式。接着进一步通过复利的威力、对折纸张、舍罕王的赏赐等实例,展示了翻番这个令数据快速增长的数学概念。最后还介绍翻番的逆运算——折半的应用。
第8章学习数理逻辑的相关知识,介绍了逻辑、命题逻辑、布尔逻辑、逻辑的重叠与遗漏等概念,最后介绍了通过卡诺图化简逻辑表达式的方法。
第9章则在第8章的基础上进一步讨论了逻辑推理,包括演绎推理中的三段论、选言推理、假言推理、关系推理,以及归纳推理中的完全归纳推理和不完全归纳推理。
第10章介绍了几何图形构造的基础知识,从花盆摆放、残缺棋盘、丢失的线条等有趣实例,初步了解几何图形构造,最后还介绍了几何图形的分割与拼接。
第11章讨论统筹规划相关知识,首先从田忌赛马这个古老故事中看出统筹规划的重要性,然后通过生活中的两个简单例子认识统筹规划,最后还讨论了“背包问题”及其程序设计方法。
本书读者对象
本书可适用以下各类人员阅读:
· 计算机专业的学生;
· 数学专业的学生;
· 程序设计人员;
· 数学爱好者;
· 编程爱好者。
编写本书的过程中,虽然编者竭尽全力,不敢有丝毫疏忽,但恐百密一疏,书中仍难免存在不足之处,望广大读者批评指正。
编著者
《妙趣横生的算法(C语言实现)第2版》
程序 = 数据结构 + 算法
——著名的计算机科学家沃斯(Nikiklaus Wirth)
自从著名的计算机科学家沃斯将程序设计形象地用上面的公式表示出来后,这条“黄金定律”便成为了人们学习程序设计,进行程序开发的准则。要想成为一名真正专业的程序设计人员,基本的数据结构基础和常用的算法知识是必须掌握的。脱离了这两点,编写出来的程序一定不是健壮的好程序。
然而单纯地掌握一些数据结构基础和常用的算法知识也是远远不够的。空洞地掌握所谓的数据结构和算法等理论知识只是纸上谈兵,这些知识必须要依托于一门程序设计语言才具有真正的生命力,才能够转化为真实的程序代码,才能真正地解决实际问题。
本书就是将数据结构基础和常用的算法知识与目前广泛应用、最具群众基础的C语言相结合而产生的。本书的写作思想是理论与实践相结合,以实践为核心,以实例为主要 内容。
首先,本书总结归纳了数据结构基础、常用的排序查找算法和经典的算法思想,提纲挈领地阐述了核心的理论知识。这样可以使没有系统学习过或者不熟悉数据结构和算法等知识的读者,对这部分知识有一个基本的了解,并掌握基本的数据结构知识和常用而经典的算法思想,以便更加深入地学习本书的其他内容。
其次,本书列举了大量的编程实例,这些题目都按照知识体系进行了内容上的划分。本书列举的这些编程实例都是一些比较灵活有趣的题目,有些题目渗透了巧妙的算法思想,有些题目则必须借助特殊的数据结构才能更加容易解答。通过这些题目的训练,可以使读者开阔眼界,启迪思维,提高编程的兴趣。最重要的是能够提高读者算法设计的本领;提高读者灵活应用各种数据结构的本领;提高读者编写程序解决实际问题的能力。
关于本书第2版
本书第1版出版后广受读者好评,并且多次加印,被大量的算法入门人员和爱好者及一些参加算法竞赛的读者作为参考读物。但是随着技术的发展,第1版图书已经不能完全适应当前的阅读需求。例如,很多开发人员已经将C语言的编程环境由以前流行的Tubro C迁移到了当前流行的Visual Studio平台上,加之本书第1版图书在解析上还有改进空间。基于这些原因,我们对本书第1版进行了系统的改版,以方便读者更好地学习。相比第1版图书,本书第2版内容上的主要变化体现在以下几个方面:
* 书中涉及的实例代码在Visual Studio 2010环境下重新编译通过;
* 对一些叙述不清或不够通顺的语句进行了修改;
* 对第1版图书中存在的一些疏漏进行了修订;
* 给实例源代码增加了更加详细的注释;
* 给第1~3章中各增加了一节新内容,作为课后练习,并给出了参考答案;
* 对第2章中的快速排序和希尔排序等内容进行了较大幅度的修改,同时还新增加了堆排序的介绍及各种排序性能的比较;
* 新增了一章关于ACM程序设计竞赛的相关内容。
本书有何特点
1.结构清晰,知识全面
本书分为2篇。第1篇是基础知识介绍,主要介绍数据结构的基础知识和一些常用的算法思想。这部分内容为核心的理论知识,可以帮助读者学习和回顾数据结构和算法的知识,使读者在理论水平上有所提高,从而能够更加顺利地深入学习后续内容。第2篇主要是编程实例的介绍,通过一些非常有趣的编程实例使读者开阔眼界,发散思维,提高算法设计本领,提高灵活应用各种数据结构的本领,提高读者编写程序解决实际问题的能力。
2.实例丰富,讲解到位
本书的写作思想就是以实践为核心,以编程实例为主要内容。因此本书中包含了大量的编程实例,并都附有详细的分析和解答。作者认为讲解到位是本书与同类书籍相比的一大特点。本书尽量做到深入浅出,多用简单的语句配以图示来讲解比较复杂的问题,而且尽量做到讲解透彻明白,不敷衍读者。
3.题材新型,趣味性强
兴趣是最好的老师。本书在编写过程中始终贯穿这一思想。因此本书中的题目设置尽量做到既有练习意义,又富有趣味性。特别是在本书的第2篇中,列举了大量的兼顾难度和趣味性的经典题目,例如魔幻方阵、汉诺塔、魔王语言翻译、约瑟夫环、马踏棋盘、巧算24、八皇后问题等。这样使读者对所谓的难题也不再那么畏惧,而是更加愿意面对它。
4.重点突出,实用性强
本书的写作意图是通过讲解大量生动有趣的实例,培养读者的编程能力、算法设计思想和对数据结构的灵活运用。归根到底就是通过程序设计解决实际问题的能力。因此本书中的所有题目都不只是给出答案而已,而是从算法思想的层面来剖析,涉及复杂数据结构的内容,还通过图示的方法形象地加以说明。特别值得一提的是,本书的最后一章为算法设计与数据结构面试题精粹,这部分内容从实战和应试的角度出发,旨在巩固读者的知识水平和提高读者的应试能力,同时使得本书更具实用价值。
5.视频教学,高效直观
本书中的重点内容和实例提供了配套教学视频辅助讲解。读者可以先阅读书中的内容讲解,然后再结合教学视频进行学习,可以获得更加高效而直观的学习效果。
本书内容及知识体系
本书共11章,分为2篇,主要内容介绍如下。
第1篇 算法基础(第1~3章)
本篇主要介绍一些必备的算法基础知识,包括数据结构基础知识、常用的查找和排序方法、常用的算法思想。
第2篇 常用算法实例解析(第4~11章)
本篇主要介绍一些基于C语言的算法编程实例。包括编程的基本功、数学趣题、数据结构题、数值计算题、综合题、算法设计与数据结构面试题、ACM程序设计竞赛试题等。这些题目内涵丰富,兼顾趣味性,从不同侧面体现出对数据结构知识和算法设计思想的灵活运用,相信会对读者有一定帮助。
本书读者对象
* 对算法设计有兴趣的入门人员;
* 有一定编程基础的算法爱好者;
* 需要提高C语言编程水平的人员;
* 参加IT企业面试的人员;
* 信息学竞赛的参赛人员;
* 各种程序设计选拔赛的参赛人员;
* 大中专院校的学生。
编者