算法之美pdf
1. 《改变未来的九大算法》pdf下载在线阅读,求百度网盘云资源
《改变未来的九大算法》(【美】约翰·麦考密克(John MacCormick))电子书网盘下载免费在线阅读
资源链接:
链接:
书名:改变未来的九大算法
作者:【美】约翰·麦考密克(John MacCormick)
译者:管策
豆瓣评分:7.5
出版社:中信出版社
出版年份:2019-2
页数:272
内容简介:
计算机如何精确地传输海量数据,识别语音和笔迹;智能手机、平板电脑如何在几分之一秒内搜索整个页面;身处大数据时代的我们,究竟该如何应对变化莫测的世界。
计算机算法的底层建设为经济和产业发展提供了原始动力。在科技互联网时代,使用计算机和科技设备都不可避免地要依赖计算机科学的基础思想,而这些思想都诞生于20世纪。
《改变未来的九大算法》是一本科普读物,作者致力于将计算机科学的复杂思想为大众做深入浅出的解读。此书通过简明的语言和生动的例证,阐述了计算机王国的核心算法:搜索引擎、PageRank、公钥加密、纠错码、图形识别、数据压缩、数据库、数字签名等。在解释这些算法的同时,作者也向我们展示了充满科学原创精神的计算机世界:每一种算法的提出不但拓展了虚拟世界的领域,它同时也是人类智慧的彰显,可以被广泛运用于众多领域,以推动商业和社会文明的发展。
作者简介:
约翰·麦考密克(John MacCormick),计算机科学的领头人和导师。牛津大学博士,曾在惠普和微软从事研究工作。现任迪金森学院计算机学科的教授。多项专利所有者。
2. 数据结构与算法之美笔记——散列表(上)
摘要:
我们已经知道随机访问数组元素时间复杂度只有 ,效率极高,当我们想利用数组的这个特性时就需要将元素下标与存储信息对应。例如,一个商店只有四件商品,依次编号 0 至 3,这样就可以将四件商品信息按照编号对应下标的方式存储到数组中,依据编号就可以快速从数组中找到相应商品信息。
如果一段时间之后,商店盈利并且重新进货 100 件商品,商家想对大量商品在编号上区分类别,这时陵锋颂候需要使用类别编号加顺序编号的方式标识每件商品,这种编号变得复杂,并不能直接对应数组下标,此时的商品编号又该如何对应数组下标以实现快速查找商品的功能?这时候我们可以将类别编号去除之后按照顺序编号对应数组下标,同样也能享受数组高效率随机访问的福利。这个例子中,商品编号称为“ 键 ”或“ 关键字 ”,将键转化为数组对应下标的方法就是“ 散列函数 ”或“ Hash 函数 ”,由散列函数生成的值叫做“ 散列值 ”或“ Hash 值 ”,而这样的数组就是散列表。
从散列表的原理来看,数据通过散列函数计算得到散列值是关键,这个步骤中散列函数又是其中的核心,一个散列函数需要遵守以下三个原则。
因为散列函数生成的散列值对应数组下标,而数组下标就是非负整数,所以需要满足第一个原则;两个相等的数据经过散列算法得到的散列值肯定相等,否则利用散列值在散列表中查找数据就无从谈起;至于第三个原则虽然在情理之中,却不那么容易做到,即使是被广泛运用的散列算法也会出现散列值冲突的情况,导致无法满足第三个原则。
散列函数作为散列表的核心部分,尺郑必然不能拖散列表的执行效率后腿,毕竟散列表的查询、插入和删除操作都需要经过基告散列函数,所以散列函数不能太复杂,执行效率不能太低。由于散列函数不可避免地都会出现散列冲突情况,散列函数要尽量降低散列冲突,使散列值能够均匀地分布在散列表中。
解决散列冲突主要有“ 开放寻址 ”(open addressing)和“ 链表法 ”(chaining)两类方法。
开放寻址法是指插入操作时,当生成的散列值对应槽位已经被其他数据占用,就探测空闲位置供插入使用,其中探测方法又分为“ 线性探测 ”(Linear Probing)、“ 二次探测 ”(Quadratic Probing)和“ 双重散列 ”(Double hashing)三种。
线性探测是其中较为简单的一种,这种探测方式是当遇到散列冲突的情况就顺序查找(查找到数组尾部时转向数组头部继续查找),直到查找到空槽将数据插入。当进行查找操作时,也是同样的操作,利用散列值从散列表中取出对应元素,与目标数据比对,如果不相等就继续顺序查找,直到查找到对应元素或遇到空槽为止,最坏情况下查找操作的时间复杂度可能会下降为 。
散列表除了支持插入和查找操作外,当然也支持删除操作,不过并不能将需删除的元素置为空。如果删除操作是将元素置为空的话,查找操作遇到空槽就会结束,存储在被删除元素之后的数据就可能无法正确查找到,这时的删除操作应该使用标记的方式,而不是使用将元素置空,当查找到被标识已删除的元素将继续查找,而不是就此停止。
线性探测是一次一个元素的探测,二次探测就是使用都是线性探测的二次方步长探测。例如线性探测是 ,那二次探测对应的就是 。
双重探测是当第一个散列函数冲突时使用第二个散列函数运算散列值,利用这种方式探测。例如,当 冲突时,就使用 计算散列值,如果再冲突就使用 计算散列值,依此类推。
关于散列表的空位多少使用“ 装载因子 ”(load factor)表示,装载因子满足数学关系 ,也就是说装载因子越大,散列表的空闲空间越小,散列冲突的可能性也就越大,一般我们会保持散列表有一定比例的空闲空间。
为了保持散列表一定比例的空闲空间,在装载因子到达一定阈值时需要对散列表数据进行搬移,但散列表搬移比较耗时。你可以试想下这样的步骤,在申请一个新的更大的散列表空间后,需要将旧散列表的数据重新通过散列函数生成散列值,再存储到新散列表中,想想都觉得麻烦。
散列表搬移的操作肯定会降低散列表的操作效率,那能不能对这一过程进行改进?其实可以将低效的扩容操作分摊至插入操作,当装载因子达到阈值时不一次性进行散列表搬移,而是在每次插入操作时将一个旧散列表数据搬移至新散列表,这样搬移操作的执行效率得到了提高,插入操作的时间复杂度也依然能保持 的高效。当新旧两个散列表同时存在时查询操作就要略作修改,需先在新散列表中查询,如果没有查找到目标数据再到旧散列表中查找。
当然,如果你对内存有更高效的利用要求,可以在装载因子降低至某一阈值时对散列表进行缩容处理。
除了开放寻址之外,还可以使用链表法解决散列冲突的问题。散列值对应的槽位并不直接存储数据,而是将数据存储在槽位对应的链表上,当进行查找操作时,根据散列函数计算的散列值找到对应槽位,再在槽位对应的链表上查找对应数据。
链表法操作的时间复杂度与散列表槽位和数据在槽位上的分布情况有关,假设有 n 个数据均匀分布在 m 个槽位的散列表上,那链表法的时间复杂度为 。链表法可以不用像开放寻址一样关心装载因子,但需要注意散列函数对散列值的计算,使链表结点能够尽可能均匀地分布在散列表槽位上,避免散列表退化为链表。有时黑客甚至会精心制造数据,利用散列函数制造散列冲突,使数据集中某些槽位上,造成散列表性能的极度退化。
面对这样的恶意行为散列表只能坐以待毙吗?其实不然,当槽位上的链表过长时,可以将其改造成之前学习过的跳表等,链表改造为跳表后查询的时间复杂度也只是退化为 ,依然是可以接受的范围。
链表法在存储利用上比开放寻址更加高效,不用提前申请存储空间,当有新数据时申请一个新的结点就行。而且链表法对装载因子也不那么敏感,装载因子的增高也只是意味着槽位对应的链表更长而已,链表增长也有将链表改造为跳表等结构的应对策略,所以链表法在装载因子超过 1 的情况下都可保持高效。
开放寻址不存在像链表法一样有链表过长而导致效率降低的烦恼,不过装载因子是开放寻址的晴雨表,装载因子过高会造成散列冲突机率的上升,开放寻址就需要不断探测空闲位置,算法的执行成本会不断被提高。而且在删除操作时只能将数据先标记为删除,对于频繁增删的数据效率会受到影响。
当然也可以在这种风险出现前进行散列表的动态扩容,不过这样就会出现大量空闲的存储空间,导致存储的利用效率过低,这种现象在数据量越大的情况下越明显。所以开放寻址比较适用于数据量较小的情况。
链表法对于散列冲突的处理更加灵活,同时对存储空间的利用效率也更高,但链表结点除了存储数据外还需要存储指针,如果存储数据较小指针占用的存储甚至会导致整体存储翻倍的情况,但存储数据较大时指针占用的存储也就可以忽略不计,所以链表法较适合存储数据对象较大,但频繁的增删操作不会对链表法造成明显的影响。因为这样的特点,链表法更加适合大数据量,或者数据对象较大的时候,如果数据操作频繁,那链表法更是不二之选。
散列表由数组扩展而来,使用散列函数将键计算为散列值,散列值对应数据存储的数组下标。虽然散列表的执行效率较高,但会有散列冲突的问题,可以通过开放寻址法和链表法解决此问题。
开放寻址存储利用效率较低,适用数据量较小并且增删不频繁的情况,如果数据量较大,增删频繁的情况更加适用链表法,相对之下链表法更加普适。
3. 《算法心得:高效算法的奥秘(原书第2版)》pdf下载在线阅读,求百度网盘云资源
《算法心得:高效算法的奥秘(原书第2版)》([美] Henry S. Warren, Jr.)电子书网盘下载免费在线阅读
链接:
书名:算法心得:高效算法的奥秘(原书第2版)
作者:[美] Henry S. Warren, Jr.
译者:爱飞翔
豆瓣评分:8.8
出版社:机械工业出版社
出版年份:2014-3
页数:419
内容简介:
在本书中,作者给我们带来了一大批极为诱人的知识,其中包括各种节省程序运行时间的技巧、算法与窍门。学习了这些技术,程序员就可写出优雅高效的软件,同时还能洞悉其中原理。这些技术极为实用,而且其问题本身又非常有趣,有时甚至像猜谜解谜一般,需要奇思妙想才行。简而言之,软件开发者看到这些改进程序效率的妙计之后,定然大喜。
作者简介:
【作者简介】
Henry S. Warren, Jr.
计算机科学家,在IBM供职50余年,经历了IBM704时代、PowerPC时代及其后种种更迭。曾参与多个军事指挥与控制系统工程,并且参加了由Jack Schwarz领衔的“SET语言”项目。自1973年起,Hank就职于IBM研发部,努力探索编译器和计算机架构。当前正研究一种旨在每秒执行百亿亿次运算的超级计算机。Hank拥有纽约大学柯朗数学科学研究所计算机科学博士学位。
【译者简介】
爱飞翔
资深软件开发工程师,擅长Web开发、移动开发和游戏开发,有10余年开发经验,曾主导和参与了多个手机游戏和手机软件项目的开发,经验十分丰富。他是手机软件开发引擎AgileMobileEngine的创始人兼项目经理,同时也是CatEngine手机游戏开发引擎的联合创始人兼代码维护员。他对极限编程、设计模式、重构、测试驱动开发、敏捷软件开发等也有较深入的研究,目前负责敏捷移动开发网(http://www.agilemobidev.com/)的运营。业余爱好文学和历史,有一定的文学造诣。翻译并出版了多本计算机着作。
4. 《啊哈!算法》epub下载在线阅读,求百度网盘云资源
《啊哈!算法》(啊哈磊)电子书网盘下载免费在线阅读
链接:
书名:啊哈!算法
作者:啊哈磊
豆瓣评分:7.7
出版社:人民邮电出版社
出版年份:2014-6-1
页数:246
内容简介:
这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。
这是一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,
通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜
游戏,在轻松愉悦中便掌握算法精髓,感受算法之美。
本书中涉及到的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及到的算法有排序、枚举、
深度和广度优先搜索、图的遍历,当然还有图论中不可以缺少的四种最短路径算法、两种最小生成树算法、
割点与割边算法、二分图的最大匹配算法等。
网名啊哈磊。
曾在中科院玩过单片机。武汉大学历史上第一位以本科生身份加入MSRA(微软亚洲研究院)的小伙伴,在机器学习组从事搜索引擎方面的研究。
发表国际会议论文一篇(IEEE)。
全国青少年信息学奥林匹克金牌教练。
超萌超简洁的C语言编译器——“啊哈C编译器”作者。
2013年我的着作,有趣的编程科普书《啊哈C!》出版。
网址:www.ahalei.com
微博:weibo.com/ahalei
非常喜欢小朋友,每天都过得都非常开心。
至于为什么叫“啊哈磊”,因为我觉得这是一个很喜庆的名字。
作者简介:
网名啊哈磊。
曾在中科院玩过单片机。武汉大学历史上第一位以本科生身份加入MSRA(微软亚洲研究院)的小伙伴,在机器学习组从事搜索引擎方面的研究。
发表国际会议论文一篇(IEEE)。
全国青少年信息学奥林匹克金牌教练。
超萌超简洁的C语言编译器——“啊哈C编译器”作者。
2013年我的着作,有趣的编程科普书《啊哈C!》出版。
5. 求 《 算法之美)》电子书免费百度云网盘下载
《算法之美》网络网盘txt 最新全集下载
链接:
《算法之美》是2018年5月中信出版集团出版的一本图书,作者是布莱恩·克里斯汀和汤姆·格里菲思。本书通过讨论人类事务算法设计的概念,以帮助人们更好地处理日常生活中遇到的难题。万维钢、查尔斯·都希格等人对本书做出了评价。
6. 《算法之美:指导工作与生活的算法中文版》pdf下载在线阅读全文,求百度网盘云资源
《算法之美:指导工作与生活的算法中文版》网络网盘pdf最新全集下载:
链接: https://pan..com/s/1FAnlcekjDYJ7trQACaOIcQ
简介:这本书其实是一本讲述人生的电子书,书中内容以算法为主,全书一共分为了11个章节,非常值得一读!
7. 《编程之美》pdf下载在线阅读全文,求百度网盘云资源
《编程之美》网络网盘pdf最新全集下载:
链接: https://pan..com/s/15UUWmIkoqk2B17_t4vShRQ
简介:编程之美收集了约60道算法和程序设计题目,这些题目大部分在近年的笔试,面试中出现过,或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发,引导读者发现问题,分析问题,解决问题,寻找更优的解法。
8. 《算法(第4版)》txt下载在线阅读全文,求百度网盘云资源
《算法(第4版)》([美] Robert Sedgewick)电子书网盘下载免费在线阅读
链接: https://pan..com/s/19zRcn1hqg8YDHodr27ZPpA
书名:算法(第4版)
作者:[美] Robert Sedgewick
译者:谢路云
豆瓣评分:9.4
出版社:人民邮电出版社
出版年份:2012-10-1
页数:636
内容简介:
本书作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。第4版具体给出了每位程序员应知应会的50个算法,提供了实际代码,而且这些 Java 代码实现采用了模块化的编程风格,读者可以方便地加以改造。配套网站 algs4.cs.princeton.e 提供了本书内容摘要以及相关代码、测试数据、编程练习、教学课件等资源。
作者简介:
Robert Sedgewick,斯坦福大学博士(导师是Donald E. Knuth),从1985年开始一直担任普林斯顿大学计算机科学系教授,曾任该系主任,也是Adobe Systems公司董事会成员,曾在Xerox PARC、国防分析研究所(Institute for Defense Analyses)和法国国家信息与自动化研究所(INRIA)从事研究工作。他的研究方向包括解析组合学、数据结构和算法的分析与设计、程序可视化等。
Kevin Wayne,康奈尔大学博士,普林斯顿大学计算机科学系高级讲师。研究方向包括算法的设计、分析和实现,特别是图和离散优化。