我们眼中的数据结构与算法

我们眼中的数据结构与算法

数据结构与算法的重要性

计算机领域中存在一个经典公式:数据结构+算法=程序,由此可见数据结构与算法的重要性。

任何一种算法在实际应用时都会受到 资源限制 ——可用来存储数据的全部空间以及执行任务的限制时间。计算机功能日益强大,处理器的速度和内存容量在不断提升,但与此同时,人们对程序的需求也在不断提高,需要计算机解决的问题更加复杂、规模更大。那么选用更合适的数据结构以及更高效的算法就显得尤为重要。数据结构与算法是程序的基础,很大程度上决定了程序的 运行效率 ,在面对大规模数据时,不同的数据结构可能会使程序的运行时间相差几万倍。因此,对于程序本身来说,数据结构与算法的设计和选择能够决定程序运行的阈值。

对于我们而言,精通数据结构与算法能够帮助我们更好地理解程序运行原理,由此能够编写出效率更高的代码。学习计算机,绝不能仅仅学会程序语言的应用,对于任何一门知识都要知其然知其所以然,理解了背后的原理才能帮助我们更好地掌握知识。学会高级程序语言只是掌握了翻译能力,学会数据结构与算法才是掌握了写作能力, 数据结构与算法能够让我们从只会敲代码的 “工具人” 转变为懂得如何设计程序的 开发者

数据结构与算法的发展史

  1. 数据结构发展史

    数据结构是在计算机科学与技术的发展过程中产生的,当计算机需要处理的数据由简单的数值转变为具有一定结构和关系的系列数据时,简单的计算已经不能满足人们的需求,由此诞生了数据结构,用以处理复杂的数据之间的联系。

    1968年克努斯教授开创了数据结构的最初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。

    70年代初,数据结构作为一门独立的课程正式进入大学课堂。

  2. 算法发展史

    早在中国古代,算法已经被广泛应用与记载,“算法”一词最初起源于《周髀算经》。在中学时我们就曾学习过中国古代的一些经典算法,例如辗转相除法、秦九韶算法、割圆术等等。

    算法最初出现在数学计算中。9世纪波斯数学家al-Khwarizmi最初在数学上提出了算法这一概念,“算法”原为"algorism",意思是阿拉伯数字的运算法则,在18世纪演变为"algorithm"。欧几里得算法被人们认为是史上第一个算法。

    20世纪的英国数学家图灵提出了著名的图灵论题,并提出一种假想的计算机的抽象模型,这个模型被称为图灵机。图灵机的出现解决了算法定义的难题,图灵的思想对算法的发展起到了重要作用。

    1834年,巴贝奇提出了分析机的概念,由此将算法与计算机结合起来。

    此后,随着计算机科学与技术的不断发展,人们设计创造了各种算法,算法在计算机领域中得到广泛应用。

  3. 数据结构与算法的结合

    克努斯教授所著的《计算机程序设计艺术》中对数据结构与算法进行了权威的阐释,数据结构与算法被结合起来应用于计算机领域,将数据结构与算法巧妙结合能够帮助人们设计出更加完美、效率更高的程序。

数据结构与算法的名人轶事

  1. 艾伦·麦席森·图灵

    图灵被誉为计算机科学之父,在他的“论可计算数及其在判定问题中的应用”一文中,从一个全新的角度定义了可计算函数,给计算下了一个完全确定的定义,而且第一次把计算和自动机联系起来,对后世产生了巨大的影响,这种“自动机”后来被人们称为“图灵机”。这种数据模型的提出,极大推动了算法的发展。

  2. 唐纳德·克努特

    克努特教授在29岁提出算法(Algorithm)与数据结构(Data Structure)这两个基本概念。

    算法方面,克努特教授与他的学生共同设计出了Knuth-Bendix算法和Knuth-Morris-Pratt算法,应用于数学领域。

    在编译器设计方面,还曾设计出著名的LR(k)文法。

    其代表作品《计算机程序设计的艺术》已经长期被公认为经典计算机科学的定义性描述,对计算机科学领域产生了深远影响。

已标记关键词 清除标记
之前有个PDG的版本,这次我发个PDF的版本看看,清晰度还可以,再就是谁有习题的答案,发上来谢谢了。 =========================================== 本书是国外数据结构算法分析方面的标准教材,介绍了数据结构(大量数据的组织方法)以及算法分析(算法运行时间的估算)。本书的编写目标是同时讲授好的程序设计和算法分析技巧,使读者可以开发出具有最高效率的程序。 本书可作为高级数据结构课程或研究生一年级算法分析课程的教材,使用本书需具有一些中级程序设计知识,还需要离散数学的一些背景知识。 本书目录: 出版者的话 专家指导委员会 译者序 前言 第1章 引论 1.1 本书讨论的内容 1.2 数学知识复习 1.2.1 指数 1.2.2 对数 1.2.3 级数 1.2.4 模运算 1.2.5 证明方法 1.3 递归简论 总结 练习 第2章 算法分析 2.1 数学基础 2.2 模型 2.3 要分析的问题 2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 总结 练习 第3章 表、栈和队列 3.1 抽象数据类型(ADT) 3.2 表ADT 3.2.1 表的简单数组实现 3.2.2 链表 3.2.3 程序设计细节 3.2.4 常见的错误 3.2.5 双链表 3.2.6 循环链表 3.2.7 例子 3.2.8 链表的游标实现 3.3 栈ADT 3.3.1 栈模型 3.3.2 栈的实现 3.3.3 应用 3.4 队列ADT 3.4.1 队列模型 3.4.2 队列的数组实现 3.4.3 队列的应用 总结 练习 第4章 树 4.1 预备知识 4.1.1 树的实现 4.1.2 树的遍历及应用 4.2 二叉树 4.2.1 实现 4.2.2 表达式树 4.3 查找树ADT——二叉查找树 4.3.1 MakeEmpty 4.3.2 Find 4.3.3 FindMin和FindMax 4.3.4 Insert 4.3.5 Delete 4.3.6 平均情形分析 4.4 AVL树 4.4.1 单旋转 4.4.2 双旋转 4.5 伸展树 4.5.1 一个简单的想法 4.5.2 展开 4.6 树的遍历 4.7 B-树 总结 练习 参考文献 第5章 散列 5.1 一般想法 5.2 散列函数 5.3 分离链接法 5.4 开放定址法 5.4.1 线性探测法 5.4.2 平方探测法 5.4.3 双散列 5.5 再散列 5.6 可扩散列 总结 练习 参考文献 第6章 优先队列(堆) 6.1 模型 6.2 一些简单的实现 6.3 二叉堆 6.3.1 结构性质 6.3.2 堆序性质 6.3.3 基本的堆操作 6.3.4 其他的堆操作 6.4 优先队列的应用 6.4.1 选择问题 6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 6.6.1 左式堆的性质 6.6.2 左式堆的操作 6.7 斜堆 6.8 二项队列 6.8.1 二项队列结构 6.8.2 二项队列操作 6.8.3 二项队列的实现 总结 练习 参考文献 第7章 排序 7.1 预备知识 7.2 插入排序 7.2.1 算法 7.2.2 插入排序的分析 7.3 一些简单排序算法的下界 7.4 希尔排序 7.4.1 希尔排序的最坏情形分析 7.5 堆排序 7.5.1 堆排序的分析 7.6 归并排序 7.6.1 归并排序的分析 7.7 快速排序 7.7.1 选取枢纽元 7.7.2 分割策略 7.7.3 小数组 7.7.4 实际的快速排序例程 7.7.5 快速排序的分析 7.7.6 选择的线性期望时间算法 7.8 大型结构的排序 7.9 排序的一般下界 7.9.1 决策树 7.10 桶式排序 7.11 外部排序 7.11.1 为什么需要新的算法 7.11.2 外部排序模型 7.11.3 简单算法 7.11.4 多路合并 7.11.5 多相合并 7.11.6 替换选择 总结 练习 参考文献 第8章 不相交集ADT 8.1 等价关系 8.2 动态等价性问题 8.3 基本数据结构 8.4 灵巧求并算法 8.5 路径压缩 8.6 按秩求并和路径压缩的最坏情形 8.6.1 Union/Find算法分析 8.7 一个应用 总结 练习 参考文献 第9章 图论算法 9.1 若干定义 9.1.1 图的表示 9.2 拓扑排序 9.3 最短路径算法 9.3.1 无权最短路径 9.3.2 Dijkstra算法 9.3.3 具有负边值的图 9.3.4 无圈图 9.3.5 所有点对最短路径 9.4 网络流问题 9.4.1 一个简单的最大流算法 9.5 最小生成树 9.5.1 Prim算法 9.5.2 Kruskal算法 9.6 深度优先搜索的应用 9.6.1 无向图 9.6.2 双连通性 9.6.3 欧拉回路 9.6.4 有向图 9.6.5 查找强分支 9.7 NP完全性介绍 9.7.1 难与易 9.7.2 NP类 9.7.3 NP完全问题 总结 练习 参考文献 第10章 算法设计技巧 10.1 贪婪算法 10.1.1 一个简单的调度问题 10.1.2 Huffman编码 10.1.3 近似装箱问题 10.2 分治算法 10.2.1 分治算法的运行时间 10.2.2 最近点问题 10.2.3 选择问题 10.2.4 一些运算问题的理论改进 10.3 动态规划 10.3.1 用一个表代替递归 10.3.2 矩阵乘法的顺序安排 10.3.3 最优二叉查找树 10.3.4 所有点对最短路径 10.4 随机化算法 10.4.1 随机数发生器 10.4.2 跳跃表 10.4.3 素性测试 10.5 回溯算法 10.5.1 收费公路重建问题 10.5.2 博弈 总结 练习 参考文献 第11章 摊还分析 11.1 一个无关的智力问题 11.2 二项队列 11.3 斜堆 11.4 斐波那契堆 11.4.1 切除左式堆中的节点 11.4.2 二项队列的懒惰合并 11.4.3 斐波那契堆操作 11.4.4 时间界的证明 11.5 伸展树 总结 练习 参考文献 第12章 高级数据结构及其实现 12.1 自顶向下伸展树 12.2 红黑树 12.2.1 自底向上插入 12.2.2 自顶向下红黑树 12.2.3 自顶向下删除 12.3 确定性跳跃表 12.4 AA-树 12.5 treap树 12.6 k-d树 12.7 配对堆 总结 练习 参考文献 索引
相关推荐
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页