标签分类
当前位置:首页 > > 算法电子书网盘下载
算法笔记 算法笔记
码小辫

码小辫 提供上传

资源
34
粉丝
48
喜欢
389
评论
18

    算法笔记 PDF 原书影印版

    算法电子书
    • 发布时间:

    给大家带来的一篇关于算法相关的电子书资源,介绍了关于算法笔记、晴神方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小154.8 MB,胡凡,曾磊编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.4

  • 算法笔记 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1q4PkgRgHKZfrQaPPTYOdJ
  • 分享码:awy9
  • 算法笔记

    算法笔记电子书封面

    读者评价

    这本书重复着拜读了三遍,刚读完第三遍。第一次为了408专业课,第二次为了9月份的PAT,现在为了考研复试。每次拜服都很有收获。适合有一定C语言基础的同学,由入门到深入,针对PAT考试和一般竞赛已经足够了。非常值得阅读,是算法竞赛的必备先读书籍。
    感觉作为 PAT 的参考书有点埋没它了(目标受众略窄),真的是很好的数据结构和算法入门书。很好理解也容易实现,作为入门小白跟着敲下来收获很大。
    入门温习的好书,一周看完,细节好评,也给了读者思考的空间(总有几个为什么留给你)

    内容介绍

    这是一本零基础就能读懂的算法书籍,读者不需要因为自己没有语言基础而畏惧。书籍的第2章便是一个C语言的入门教程,内容非常易懂,并且十分实用,阅读完这章就可以对本书需要的C语言基础有一个较好的掌握。
    本书已经覆盖了大部分基础经典算法,不仅可以作为考研机试和PAT的学习教材,对其他的一些算法考试(例如CCF的CSP考试)或者考研初试的数据结构科目的学习和理解也很有帮助,甚至仅仅想学习经典算法的读者也能从本书中学到许多知识,本书还有配套的《算法笔记上机训练实战指南》
    本书的作者是同样经历过考研机试和各类算法考试的专家型学长,知晓这类考试中的痛点,以及考生在学习算法时容易产生困惑的地方,因此可以把本书看作是学长为你奉献的满满的经验干货,这是有价值的东西。
    本书的试印版本献给了浙大考研学子,并令当年的浙大考研机试平均分增加了十多分,收获了考生的大量好评。但作者并没有止步于此,经过了半年多时间的内容完善和补充之后,新的版本在新一年的考研机试中再次获得了考生的一致赞美。最后,在经过精心整理之后,书籍终于定稿,并编撰成书。
    我们知道,纸质书籍的一个弱点就在于不能像软件一样随时更新内容,但本书采用了与二维码相结合的方式,使得本书变为能够随时更新内容的书籍,读者也可以随时从二维码中找到勘误。这种作者和读者能够相互沟通的方式让书籍变“活”了,也能够帮助提升读者对知识的理解。
    内容简介
    本书内容包括:C/C++快速入门、入门模拟、算法初步、数学问题、C++标准模板库(STL)、数据结构专题(二章)、搜索专题、图算法专题、动态规划专题、字符串专题、专题扩展。本书印有二维码,用来实时更新、补充内容及发布勘误的。
    本书可作为计算机专业研究生入学考试复试上机、各类算法等级考试(如PAT、CSP等)的辅导书,也可作为“数据结构”科目的考研教材及辅导书内容的补充。本书还是学习C语言、数据结构与算法的入门辅导书,非常适合零基础的学习者对经典算法进行学习。

    内容节选

    机器学习10大经典算法详解

    本文为大家分享了机器学习10大经典算法,供大家参考,具体内容如下

    1、C4.5

    C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法.  C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:

     1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;

    2)在树构造过程中进行剪枝;

    3)能够完成对连续属性的离散化处理;

    4)能够对不完整数据进行处理。

    C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。 

    2、The k-means algorithm即K-Means算法

    k-means algorithm算法是一个聚类算法,把n的对象根据他们的属性分为k个分割,k < n。它与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。它假设对象属性来自于空间向量,并且目标是使各个群组内部的均方误差总和最小。 

    3、Support vector machines支持向量机

    支持向量机(Support Vector Machine),简称SV机(论文中一般简称SVM)。它是一种监督式学习的方法,它广泛的应用于统计分类以及回归分析中。支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。一个极好的指南是C.J.C Burges的《模式识别支持向量机指南》。van der Walt和Barnard将支持向量机和其他分类器进行了比较。 

    4、The Apriori algorithm

    Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。 

    5、最大期望(EM)算法

    在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variabl)。最大期望经常用在机器学习和计算机视觉的数据集聚(Data Clustering)领域。 

    6、PageRank网页排名

    PageRank是Google算法的重要内容。2001年9月被授予美国专利,专利人是Google创始人之一拉里·佩奇(Larry Page)。因此,PageRank里的page不是指网页,而是指佩奇,即这个等级方法是以佩奇来命名的。

    PageRank根据网站的外部链接和内部链接的数量和质量俩衡量网站的价值。PageRank背后的概念是,每个到页面的链接都是对该页面的一次投票,被链接的越多,就意味着被其他网站投票越多。这个就是所谓的“链接流行度”——衡量多少人愿意将他们的网站和你的网站挂钩。PageRank这个概念引自学术中一篇论文的被引述的频度——即被别人引述的次数越多,一般判断这篇论文的权威性就越高。 

    7、AdaBoost

    Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。 

    8、kNN: k-nearest neighbor classification

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 

    9、Naive Bayes朴素贝叶斯

    在众多的分类模型中,应用最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBC)。朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。 

    10、CART:分类与回归树

    CART, Classification and Regression Trees。在分类树下面有两个关键的思想。第一个是关于递归地划分自变量空间的想法;第二个想法是用验证数据进行剪枝。

    目录

    • 第1章 如何使用本书 1
    • 1.1 本书的基本内容 1
    • 1.2 如何选择编程语言和编译器 1
    • 1.3 在线评测系统 2
    • 1.4 常见的评测结果 3
    • 1.5 如何高效地做题 4
    • 第2章 C/C++快速入门 5
    • 2.1 基本数据类型 7
    • 2.1.1 变量的定义 7
    • 2.1.2 变量类型 7
    • 2.1.3 强制类型转换 11
    • 2.1.4 符号常量和const常量 12
    • 2.1.5 运算符 14
    • 2.2 顺序结构 17
    • 2.2.1 赋值表达式 17
    • 2.2.2 使用scanf和printf输入/输出 18
    • 2.2.3 使用getchar和putchar输入/输出字符 23
    • 2.2.4 注释 24
    • 2.2.5 typedef 24
    • 2.2.6 常用math函数 25
    • 2.3 选择结构 28
    • 2.3.1 if语句 28
    • 2.3.2 if语句的嵌套 31
    • 2.3.3 switch语句 32
    • 2.4 循环结构 34
    • 2.4.1 while语句 34
    • 2.4.2 do while语句 35
    • 2.4.3 for语句 36
    • 2.4.4 break和continue语句 38
    • 2.5 数组 39
    • 2.5.1 一维数组 39
    • 2.5.2 冒泡排序 41
    • 2.5.3 二维数组 43
    • 2.5.4 memset——对数组中每一个元素赋相同的值 46
    • 2.5.5 字符数组 47
    • 2.5.6 string.h头文件 50
    • 2.5.7 sscanf与sprintf 53
    • 2.6 函数 55
    • 2.6.1 函数的定义 55
    • 2.6.2 再谈main函数 58
    • 2.6.3 以数组作为函数参数 58
    • 2.6.4 函数的嵌套调用 59
    • 2.6.5 函数的递归调用 60
    • 2.7 指针 61
    • 2.7.1 什么是指针 61
    • 2.7.2 指针变量 62
    • 2.7.3 指针与数组 63
    • 2.7.4 使用指针变量作为函数参数 65
    • 2.7.5 引用 68
    • 2.8 结构体(struct)的使用 70
    • 2.8.1 结构体的定义 70
    • 2.8.2 访问结构体内的元素 71
    • 2.8.3 结构体的初始化 72
    • 2.9 补充 74
    • 2.9.1 cin与cout 74
    • 2.9.2 浮点数的比较 75
    • 2.9.3 复杂度 78
    • 2.10 黑盒测试 80
    • 2.10.1 单点测试 80
    • 2.10.2 多点测试 80
    • 第3章 入门篇(1)——入门模拟 85
    • 3.1 简单模拟 85
    • 3.2 查找元素 87
    • 3.3 图形输出 89
    • 3.4 日期处理 91
    • 3.5 进制转换 93
    • 3.6 字符串处理 95
    • 第4章 入门篇(2)——算法初步 99
    • 4.1 排序 99
    • 4.1.1 选择排序 99
    • 4.1.2 插入排序 100
    • 4.1.3 排序题与sort函数的应用 101
    • 4.2 散列 106
    • 4.2.1 散列的定义与整数散列 106
    • 4.2.2 字符串hash初步 109
    • 4.3 递归 111
    • 4.3.1 分治 111
    • 4.3.2 递归 112
    • 4.4 贪心 118
    • 4.4.1 简单贪心 118
    • 4.4.2 区间贪心 122
    • 4.5 二分 124
    • 4.5.1 二分查找 124
    • 4.5.2 二分法拓展 131
    • 4.5.3 快速幂 134
    • 4.6 two pointers 137
    • 4.6.1 什么是two pointers 137
    • 4.6.2 归并排序 139
    • 4.6.3 快速排序 142
    • 4.7 其他高效技巧与算法 146
    • 4.7.1 打表 146
    • 4.7.2 活用递推 147
    • 4.7.3 随机选择算法 149
    • 第5章 入门篇(3)——数学问题 152
    • 5.1 简单数学 152
    • 5.2 最大公约数与最小公倍数 154
    • 5.2.1 最大公约数 154
    • 5.2.2 最小公倍数 156
    • 5.3 分数的四则运算 156
    • 5.3.1 分数的表示和化简 157
    • 5.3.2 分数的四则运算 157
    • 5.3.3 分数的输出 159
    • 5.4 素数 159
    • 5.4.1 素数的判断 160
    • 5.4.2 素数表的获取 160
    • 5.5 质因子分解 165
    • 5.6 大整数运算 170
    • 5.6.1 大整数的存储 170
    • 5.6.2 大整数的四则运算 171
    • 5.7 扩展欧几里得算法 176
    • 5.8 组合数 181
    • 5.8.1 关于n!的一个问题 181
    • 5.8.2 组合数的计算 183
    • 第6章 C++标准模板库(STL)介绍 191
    • 6.1 vector的常见用法详解 191
    • 6.2 set的常见用法详解 197
    • 6.3 string的常见用法详解 202
    • 6.4 map的常用用法详解 213
    • 6.5 queue的常见用法详解 218
    • 6.6 priority_queue的常见用法详解 221
    • 6.7 stack的常见用法详解 227
    • 6.8 pair的常见用法详解 230
    • 6.9 algorithm头文件下的常用函数 232
    • 6.9.1 max()、min()和abs() 232
    • 6.9.2 swap() 233
    • 6.9.3 reverse() 233
    • 6.9.4 next_permutation() 234
    • 6.9.5 fill() 235
    • 6.9.6 sort() 235
    • 6.9.7 lower_bound()和upper_bound() 242
    • 第7章 提高篇(1)——数据结构专题(1) 245
    • 7.1 栈的应用 245
    • 7.2 队列的应用 251
    • 7.3 链表处理 253
    • 7.3.1 链表的概念 253
    • 7.3.2 使用malloc函数或new运算符为链表结点分配内存空间 254
    • 7.3.3 链表的基本操作 256
    • 7.3.4 静态链表 260
    • 第8章 提高篇(2)——搜索专题 269
    • 8.1 深度优先搜索(DFS) 269
    • 8.2 广度优先搜索(BFS) 274
    • 第9章 提高篇(3)——数据结构专题(2) 283
    • 9.1 树与二叉树 283
    • 9.1.1 树的定义与性质 283
    • 9.1.2 二叉树的递归定义 284
    • 9.1.3 二叉树的存储结构与基本操作 285
    • 9.2 二叉树的遍历 289
    • 9.2.1 先序遍历 289
    • 9.2.2 中序遍历 290
    • 9.2.3 后序遍历 291
    • 9.2.4 层序遍历 292
    • 9.2.5 二叉树的静态实现 298
    • 9.3 树的遍历 302
    • 9.3.1 树的静态写法 302
    • 9.3.2 树的先根遍历 303
    • 9.3.3 树的层序遍历 303
    • 9.3.4 从树的遍历看DFS与BFS 304
    • 9.4 二叉查找树(BST) 310
    • 9.4.1 二叉查找树的定义 310
    • 9.4.2 二叉查找树的基本操作 310
    • 9.4.3 二叉查找树的性质 314
    • 9.5 平衡二叉树(AVL树) 319
    • 9.5.1 平衡二叉树的定义 319
    • 9.5.2 平衡二叉树的基本操作 320
    • 9.6 并查集 328
    • 9.6.1 并查集的定义 328
    • 9.6.2 并查集的基本操作 328
    • 9.6.3 路径压缩 330
    • 9.7 堆 335
    • 9.7.1 堆的定义与基本操作 335
    • 9.7.2 堆排序 339
    • 9.8 哈夫曼树 342
    • 9.8.1 哈夫曼树 342
    • 9.8.2 哈弗曼编码 345
    • 第10章 提高篇(4)——图算法专题 347
    • 10.1 图的定义和相关术语 347
    • 10.2 图的存储 348
    • 10.2.1 邻接矩阵 348
    • 10.2.2 邻接表 348
    • 10.3 图的遍历 350
    • 10.3.1 采用深度优先搜索(DFS)法遍历图 350
    • 10.3.2 采用广度优先搜索(BFS)法遍历图 359
    • 10.4 最短路径 367
    • 10.4.1 Dijkstra算法 367
    • 10.4.2 Bellman-Ford算法和SPFA算法 391
    • 10.4.3 Floyd算法 398
    • 10.5 最小生成树 400
    • 10.5.1 最小生成树及其性质 400
    • 10.5.2 prim算法 401
    • 10.5.3 kruskal算法 409
    • 10.6 拓扑排序 414
    • 10.6.1 有向无环图 414
    • 10.6.2 拓扑排序 415
    • 10.7 关键路径 417
    • 10.7.1 AOV网和AOE网 417
    • 10.7.2 最长路径 419
    • 10.7.3 关键路径 419
    • 第11章 提高篇(5)——动态规划专题 425
    • 11.1 动态规划的递归写法和递推写法 425
    • 11.1.1 什么是动态规划 425
    • 11.1.2 动态规划的递归写法 425
    • 11.1.3 动态规划的递推写法 426
    • 11.2 最大连续子序列和 429
    • 11.3 最长不下降子序列(LIS) 432
    • 11.4 最长公共子序列(LCS) 434
    • 11.5 最长回文子串 436
    • 11.6 DAG最长路 439
    • 11.7 背包问题 442
    • 11.7.1 多阶段动态规划问题 442
    • 11.7.2 01背包问题 443
    • 11.7.3 完全背包问题 446
    • 11.8 总结 447
    • 第12章 提高篇(6)——字符串专题 449
    • 12.1 字符串hash进阶 449
    • 12.2 KMP算法 455
    • 12.2.1 next数组 456
    • 12.2.2 KMP算法 458
    • 12.2.3 从有限状态自动机的角度看待KMP算法 463
    • 第13章 专题扩展 465
    • 13.1 分块思想 465
    • 13.2 树状数组(BIT) 470
    • 13.2.1 lowbit运算 470
    • 13.2.2 树状数组及其应用 470
    • 参考文献 481

    上一篇:PHP&MySQL跨设备网站开发实例精粹  下一篇:Redis 4.x Cookbook

    展开 +

    收起 -

    算法 相关电子书
    关于算法的学习笔记
    网友NO.44427
    网友NO.44427

    树的遍历
    树既然具有二维性,一个重要的课题就是将二维转换为一维,也就是树的遍历。树的遍历总共分为三种,前序遍历,中序遍历和后序遍历。这里的前,中和后都是说的根,也就是根遍历的顺序。实际上在树的遍历中,永远是先左节点,后右节点的。但是关键是根节点。如果先是根节点,然后左节点,最后右节点,就是前序遍历,也就是根在前面遍历。如果先是左节点,然后根节点,最后右节点,就是中序遍历,也就是根在中间遍历。如果先是左节点,然后右节点,最后根节点,就是后序遍历,也就是根在最后遍历。
    树的三种遍历方式,可以将二维的树,转换为一维的数组。前序,中序和后序是树的一维形态。二维可以转换为一维,那么一维是否可以转换为二维呢?这实际上就是一个面试题,我们将在下面详细分析。

    网友NO.42284
    网友NO.42284

    树的特点
    树和链表相对比,会更加复杂一些。实际上链表中节点有一个指针指向下一个节点,而在树中,有两个指针,分别指向左,右两个孩子节点。这种对应关系,就不是链表中的一对一了,在树中,对应关系就是一对多了。如果说链表可以理解为一维的世界,则树就是二维的世界了。特别的,树这个二维世界有一个非常重要的节点就是根节点,这个节点可以认为是树的特征节点。因此解决树的问题,找准根节点是非常重要。
    在23种设计模式中,组合模式就是运用了树这种数据结构。组合模式的意思就是操作树根这一个元素,好像同时操作整个树一样。在实际的应用中,树可以理解为一种层级结构,比如界面,windows可能是树根,树根会有视图,视图又可分为用户自定义的各种视图控件,整个的ui界面,可以理解为一棵完整的树,而操作树根,比如windows接收到了点击事件,就可以将这个事件分发给这课树的所有节点。这就是组合模式。
    树的一个重要的特点,就是有一定的递归性,因此,在解决树相关的问题时,递归的方法,显然是首选。另外,结合树中最重要的要点,就是找到树的特征也就是树根。把握好这两个方面,很多树相关的问题就可以解决了。

    网友NO.41892
    网友NO.41892

    莫队算法
    首先,orz hzwer
    莫队算法是离线处理不带修改的区间询问的算法,效率nsqrt(n)
    其实说到底也就是先对询问按一种顺序排个序,然后直接模拟处理的算法。但是因为是按照一定顺序做询问,所以有办法证明算法复杂度是nlogn
    首先,把n个元素分为sqrt(n)块,每块有sqrt(n)个元素。然后我们以询问的左端点所在的块的编号为第一关键字,以右端点为第二关键字排序。
    一开始我们用两个指针l=1,r=0来表示当前我们已经记录的区间。然后按照排完的顺序依次处理询问。
    以bzoj3781为例:
    题意是给定一个序列a,每次对于询问[l,r],输出Σc[i]^2,其中c[i]表示在区间[l,r]中i出现的次数
    那么先考虑模拟的做法:
    当前我们做到了[x,y],现在已知在区间[x,y]中的c[i],以及ans=Σc[i]^2。那么如何可以从c[i]以及x,y,ans继续转移呢?
    我们现在要求[x,y+1]的ans了。那么[x,y+1]的答案比[x,y]多的就是a[y+1]对整个区间的贡献。只要加上a[y+1]带来的贡献就可以了。
    只需要y++ --> ans-=c[y]^2 --> c[y]++ --> ans+=c[y]^2
    就可以做到从区间[x,y]转移到[x,y+1]了。
    那么如果我们现在要求[x,y-1]的ans,只需在原来的ans中扣掉a[y]带来的贡献。
    只需要ans-=c[y]^2 --> c[y--] --> ans+=c[y]^2 --> y--
    就可以从[x,y]转移到[x,y-1]
    那么[x+1,y]和[x-1,y]就是同理了
    这样我们就可以从[x,y]转移到任意的[x',y']了
    但是为什么按着这样的顺序模拟就不会T呢?
    在此引用黄巨大的话:
    考虑第i个询问和第i+1个询问之间的关系:
    一、i与i+1在同一块内,r单调递增,所以r是O(n)的。由于有n^0.5块,所以这一部分时间复杂度是n^1.5。
    二、i与i+1跨越一块,r最多变化n,由于有n^0.5块,所以这一部分时间复杂度是n^1.5
    三、i与i+1在同一块内时变化不超过n^0.5,跨越一块也不会超过2*n^0.5,不妨看作是n^0.5。由于有n个数,所以时间复杂度是n^1.5
    于是就变成了O(n^1.5)了

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明