算法导论

《算法导论中文版》PDF 下载

 ̄綄美尐妖づ 提交于 2019-12-05 10:03:00
电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。   全书选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在IT专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。   第3版的主要变化:   ·新增了van Emde Boas树和多线程算法,并且将矩阵基础移至附录。   ·修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。   ·移除两章很少讲授的内容:二项堆和排序网络。   ·修订了动态规划和贪心算法相关内容。   ·流网络相关材料现在基于边上的全部流。   ·由于关于矩阵基础和Strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。   ·修改了对Knuth-Morris-Pratt字符串匹配算法的讨论。   ·新增100道练习和28道思考题,还更新并补充了参考文献。 城通网盘链接:https:/

算法导论

时光怂恿深爱的人放手 提交于 2019-12-05 09:48:35
   一.算法   非形式地说,算法【algorithm】就是任何定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。   我们也可以把算法看成是用于求解计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。例如,我们可能需要把一个数列进行升序排序。实际上,这个问题经常出现,并且为引入许多标准的设计技术和分析工具提供了足够的理由。   输入:n个数的一个序列(a 1 ,a2,...,an)   输出:输入序列的一个排序(a` 1 ,a`2,...,a`n)   例如,给定输入序列(6,3,1,2,8,5),排序算法将返回序列(1,2,3,5,6,8)作为输出。这样的输入序列称为排序问题的一个实例。一般来说,问题实例由计算该问题解所必需的【满足问题陈述中的各种约束】输入组成。   因为许多程序使用排序作为中间步骤,所以排序是计算机科学中的一个基本操作。因此,已有许多好的排序算法供我们任意使用。对于给定应用,哪个算法最好依赖于一下因素:将要被排序的项数、这些项已被稍微排序的程度、关于项值的可能限制、计算机的体系结构、以及使用的存储设备的种类【内存、磁盘或磁带】。   若对每个输入实例算法都以正确的输出结束,则称该算法是正确的

【算法导论】2-1 插入排序insertion-sort.cpp

孤街浪徒 提交于 2019-12-04 19:10:05
#include <iostream> using namespace std ; //插入排序算法,书p10 正确性证明见p11 时间复杂度o(n平方) int main1() { int a[ 10 ]={ 5 , 6 , 2 , 1 , 3 , 7 , 8 , 10 , 9 , 4 }; int time= 0 ; int j= 0 ,i= 0 ; int key= 0 ; for (j= 1 ;j< 10 ;j++) { key=a[j]; i=j- 1 ; while (i>= 0 &&a[i]>key) { time++; a[i+ 1 ]=a[i]; i=i- 1 ; //实际上是完成交换 } a[i+ 1 ]=key; for (i= 0 ;i< 10 ;i++) cout <<a[i]<< " " ; cout <<endl; } for (i= 0 ;i< 10 ;i++) cout <<a[i]<< " " ; cout <<endl; cout <<time<<endl; } //测试输出如下: //5 6 2 1 3 7 8 10 9 4 //2 5 6 1 3 7 8 10 9 4 //1 2 5 6 3 7 8 10 9 4 //1 2 3 5 6 7 8 10 9 4 //1 2 3 5 6 7 8 10 9 4 //1 2 3 5 6 7 8 10

《算法导论》动态规划―最优二分搜索树

匿名 (未验证) 提交于 2019-12-03 00:41:02
?假如我们现在在设计一个英文翻译程序,要把英文翻译成汉语,显然我们需要知道每个单词对应的汉语意思。我们可以建立一颗二分搜索树来实现英语到汉语的关联。为了更快速地翻译,我们可以使用AVL树或者红黑树使每次查询的时间复杂度Θ(lgn),实际上对于字典翻译程序来说这么做存在一个问题,比如“the”这个单词经常用,却很有可能存在于十分远离树根的位置,而“machicolation”这种不常用的单词很可能存在于十分靠近树根的位置,这就导致查询频率高的单词需要的查询时间更长,而查询频率很低的单词查询时间却很短。这明显不符合我们的期望,我们希望高频率的单词用更少的时间查询到,低频率的单词则用相对更长的时间查询到,也就是高频单词靠近树根,而低频单词远离树根。这时,我们就需要一颗最优二分搜索树来解决这个问题。 给定一个组长度为n关键字的有序序列K=< k1, k2, k3 ・・・・ kn > 以及对应关键字的出现概率P=< p1, p2, p3 ・・・・ pn > 由于我们要检索的关键字可能不在树中,所以我们需要n+1个伪关键字 给定一组长度为n+1的伪关键字D=< d0, d1, d2 ・・・・ dn > 其中d0表示小于任何一个关键字的值,dn表示大于任何一个关键字的值,当 i != 0 && i != n 时,di 表示所有大于ki且小于ki+1的不存在于序列K中的值的集合(不考虑值相等的情况

算法导论 第三章 函数的增长

匿名 (未验证) 提交于 2019-12-03 00:05:01
算法导论 第三章 函数的增长 1.渐近紧确界 渐近记号Θ、Ο、o、Ω、ω详解 链接:https://blog.csdn.net/so_geili/article/details/53353593 ##目录: 1.渐近紧确界记号:Θ ΘΘ(big-theta) 4.非渐近紧确上界:o(小-oh) 5.非渐近紧确下界:ω(小-omege) 6.渐近记号Θ、Ο、o、Ω、ω关系 7.参考资料 来源:博客园 作者: 柠檬味呀 链接:https://www.cnblogs.com/wwqdata/p/11520333.html

红黑树笔记

此生再无相见时 提交于 2019-12-02 20:03:36
摘要 本博文默认读者已经明白了二叉搜索树的插入和删除算法,熟练的掌握左右旋。本文适合掌握BiTree和AVL树的读者,但想学习红黑树的读者。 简介 ​ 红黑树(Red Black Tree) 是一种 自平衡二叉查找树 ,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来, 在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树” 。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以 在O(log n)时间内做查找,插入和删除 ,这里的n 是树中元素的数目。 性质 性质1. 节点是红色或黑色。 性质2. 根节点是黑色。 性质3. 每个叶结点(NIL)是黑色的 性质4 . 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5 . 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 ——from《算法导论》P174 定义 定义1. 树中的每一个结点具有五个属性:color, key, left, right, p

大数据算法导论

痞子三分冷 提交于 2019-12-02 06:01:46
第01课 算法概论,程序=算法+数据结构,时间不允许的算法无任何意义,分而治之,贪心算法,大数据的挑战.zip 第02课 从排序说起,估计算法复杂度 第03课 基本数据结构及应用,栈,队列,链表,哈希函数和哈希表 第04课 二叉树,B树,红黑树等各种树结构及其应用 第05课 面试题与ACM题选讲(1) 第06课 面试题与ACM题选讲(2) 第07课 矩阵计算问题,超巨型矩阵与稀疏矩阵的存储和计算 第08课 现实世界的信息安全原来是数论算法决定的,RSA算法.zip 第09课 字符串匹配问题,海量字符串处理。BLAST算法与基因匹配 第10课 面试题与ACM题选讲(3) 第11课 面试题与ACM题选讲(4) 第12课 图算法及其在交换机,路由器等网络设备中的应用,最小生成树,最短路算法 第13课 运筹学算法简介,线性规划,动态规划,最大流算法 数据库系统实现(第二版).zip 大数据算法课程作业.zip Database System Implementation, Garcia-Molina, Ullman, Widom, 2ed, Pearson, 2009, 662s.zip 来源: https://blog.csdn.net/kkwant/article/details/102727510

算法导论_计数排序学习笔记

流过昼夜 提交于 2019-11-30 01:37:59
计数排序学习笔记 时间复杂度为Θ(n)+Θ(k)=Θ(n+k);限制为需要知道待排序数组中元素的取值范围,以确定k值。 //注意下标,数组C[]的下标范围为0~k,包括k,因为要排序的数字的范围是0~k //数组b的下标范围为1~n,包括n //b的下标不能为0,如下标为0,则表示c[i]=0,而实际上c[i]=0时,对应的a中所有小于等于i的元素已经访问完 //c[i]最后表示a[n]中小于等于i的元素的总个数,b[c[a[i]]]=a[i]表示a[i]在数组b中的位置 //例如,a[5]=10表示数组a中第6个元素为10,c[10]=3,表示a中小于等于10的元素个数为3, // b[3]=a[5]=10表示10在b中的位置为3 // #include <iostream> using namespace std; void CountSort(int a[],int b[],int n,int k); int main() { int n = 8; int k = 5; int a[] = {2,5,3,0,2,3,0,3}; int b[n+1]; cout << "a[n]:" << endl; for(int i=0 ; i<n ; i++){ cout << a[i] << " "; } cout << endl; CountSort(a,b,n,k); cout <

算法导论 第三章 函数的增长

杀马特。学长 韩版系。学妹 提交于 2019-11-29 15:02:21
算法导论 第三章 函数的增长 1.渐近紧确界 渐近记号Θ、Ο、o、Ω、ω详解 链接:https://blog.csdn.net/so_geili/article/details/53353593 ##目录: 1.渐近紧确界记号:Θ ΘΘ(big-theta) 2.渐近上界记号 :O OO(big-oh) 3.渐近下界记号 :Ω ΩΩ(big-omege) 4.非渐近紧确上界:o(小-oh) 5.非渐近紧确下界:ω(小-omege) 6.渐近记号Θ、Ο、o、Ω、ω关系 7.参考资料 来源: https://www.cnblogs.com/wwqdata/p/11520333.html

C++学习之路1----插入排序

筅森魡賤 提交于 2019-11-29 06:22:36
目前C++就是大学本科C语言课程+研一赶鸭子上架边查语法边写了一个project(只得了二十分(满分一百的样子))的水平。。。自学python到字典章节,但又不想丢下C语言,所以先在这里立一个小小的flag,希望以后每天都能来更点东西。。 今天刚开始看算法导论的书,所以先写一点关于排序的问题----插入排序(INSERTION SORT),输入为数组a[5,2,4,6,1,3],输出元素从小到大排列的a数组。 完整代码: #include<iostream> using namespace std; void print(int a[], int n) { for (int j = 0; j < n; j++) { cout << a[j] << " "; } cout << endl; } void insertSort(int a[], int n) { for (int i = 1; i < n; i++) { if (a[i] < a[i - 1]) { int j = i - 1; int X = a[i]; while (j >= 0 && X < a[j]) { //a[j + 1] = a[j]; swap(a[j + 1], a[j]); j--; } //a[j+1] = X; } } } int main() { int a[6] = { 5,2,4,6,1