麻省理工公开课《算法导论》学习笔记_第一讲
《算法导论》读书笔记

哨兵(sentinel) 哨兵是一个哑对象,其作用是简化边界条件的处理。 类似于以前学习时讲到的头节点。加入哨兵将原来的双向链表转变成一个有哨兵的双向循环两表。L.nil代表哨兵。一图胜千言,如下:
如果有很多个很短的链表,慎用哨兵,因为哨兵所占用的额外存储空间会造成严重的存储浪费。哨兵并没有优化太多的渐进时间界,只是可 以使代码更紧凑简洁。 指针和对象的实现 对象的多数组表示: next和prev中的数字指的是对应数字的下标,有趣!
关于几个时间复杂度
通常情况下,当数据量足够大时,一般满足 θ(1)>θ(N)>θ(NlogN)>θ(N^2) (>代表优于)
1.算 法 基 础
1.1 插 入 排 序
时间复杂度:O(N^2) 思想:每次从右至左跟已排序数列进行对比,放入合适位置。两次遍历,一次相当于摸牌,另一次相当于具体的查找算法。
1.2 分 治 法
解决冲突的方法
链接法(chaining)
关于链接法采用双链的一些解释: 简单讲,删除就是从x对应的链表里删除x,双链表的删除加入哨兵只需两行,但是单链表的话只能指定x.next=null,但是在这之前需 要先将x.prev.next指向x.next,由于是单链,所以没有prev,只能一直next找下去,相比双链多了查找的时间耗费。
将问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 (分解-解决-合并) 归并排序 时间复杂度O(NlogN)(O还是θ——theta,都差不多)
归并排序算法如下:
函数的增长
O渐进上界Ω渐进下界,o和ω 具体看数学定义最清楚。
分治策略
1. 维护堆的性质 通俗的讲,就是保持数组的最大堆性质。思路比较简单,比较parent节点和孩子节点,找到最大值,如果最大值是某个孩子节点,交 换,递归运行。对于树高为h的节点来说,该程序时间复杂度为O(h)
算法导论笔记

第一章算法在计算中的应用第九章中位数和顺序统计学9.1-11.将数组中的元素分组,每组两个元素,然后比较每组中的两个元素得到最小值,重新得到包含原来一半元素的数组,继续重复上述过程,那么最后一个元素必然为最小值。
如图所示,数组为{2, 1, 4, 3, 5}2.上述过程形成的是一个二叉树,其中叶子节点都为数组元素,非叶子节点刚好4个,这是二叉树的性质。
3.然后我们来找第二小元素,第二小元素必然跟着1,首先赋值为5,然后再赋值为3,然后赋值为2,即为所求。
【运行结果】:1.我们先将N个数配对,每两个数一对,每对之间进行互相比较得出小值。
2.对得出的N/2个元素重复第一步,直至得出最小值。
到这儿我们得出了最小值,实际上比较的次数为n-1次。
不难发现上面的过程实际上可以演示为一个二叉树。
例如在5,8,11,18四个数找出最小值,二叉树演示如下(每个节点相当于一次比较):观察二叉树,可以得出这样一个结论,所有与最小值比较过的数中的最小值纪即为第二小的的值。
二叉树的高度为lgn,因此与最小值比较的数的数目为lgn,在lgn个数中找出最小值要进行lgn-1次比较。
9.1-29.3节的方法可以在最坏情况下的线性复杂度的算法来求顺序统计量.其核心思想在于获得一个更好的中枢值来更好地划分数组.然而题中给了我们一个"黑盒子"来以线性复杂度获取一个真正好的中枢值,那么再好不过了。
在同时找到最大值和最小值时,每个元素都参与了与最大值和最小值的比较,比较了两次。
将数组成对处理。
两两互相比较,将大的与最大值比较,小的与最小值比较。
每两个元素需要的比较次数是,两两比较一次,大者与最大值比较一次,小者与最小值比较一次,共三次。
9.2-1长度为0的数组,RANDOMIZED-SELECT直接返回,当然不会递归调用。
9.2-29.2-3 写出RANDOMIZED-SELECT的一个迭代版本【算法思想】:递归:在函数中调用自身的程序过程。
认识算法听课笔记

认识算法听课笔记全文共四篇示例,供读者参考第一篇示例:认识算法听课笔记算法作为计算机科学的核心领域,是指解决问题的一系列步骤或规则。
在计算机科学中,算法的设计与分析是最重要的课程之一。
学生在大学期间都会学习算法课程,以提升自己的计算机科学能力。
我在大学期间有幸上了一门名为“算法设计与分析”的课程,这门课程由一位资深的计算机科学教授授课。
教授讲解清晰,深入浅出,让我对算法有了更深刻的理解。
在这门课程中,我认识了许多经典的算法,并学会了如何设计和分析算法。
在这里,我将分享一些我在听课过程中做的笔记,希望能够帮助到正在学习算法的同学们。
1. 算法的定义和分类算法是一种解决问题的有限步骤的有序序列。
算法可以用来解决各种问题,例如排序、查找、最短路径等。
根据算法解决问题的方式不同,算法可以分为以下几类:- 穷举法:穷举法是一种基本的解决问题方式,通过枚举所有可能的情况来解决问题。
但是穷举法通常会消耗大量的时间和空间。
- 分治法:分治法是一种将问题分解为更小的子问题来解决的算法。
分治法常用于解决递归性质的问题,例如归并排序、快速排序等。
- 动态规划:动态规划是一种通过将问题分解为更小的子问题来解决的算法。
动态规划通常用于解决最优化问题,例如最长公共子序列、背包问题等。
2. 算法设计的基本原则在设计算法时,我们需要遵循一些基本原则,以保证算法的正确性、效率和可读性。
以下是一些常用的算法设计原则:- 简单性:设计的算法应该尽可能简单易懂,避免过度复杂的实现。
- 效率:设计的算法应该具有较高的效率,能够在合理的时间内解决问题。
- 可读性:设计的算法应该具有较高的可读性,便于他人理解和修改。
- 鲁棒性:设计的算法应该具有较高的鲁棒性,能够处理各种异常情况。
3. 算法分析的方法在设计完算法之后,我们需要对算法进行分析,以评估算法的性能。
算法的性能通常通过时间复杂度和空间复杂度来衡量。
时间复杂度是指算法执行所需的时间量,而空间复杂度是指算法执行所需的空间量。
算法导论文档

第一课课程细节;绪论:算法分析,插入排序法(Insertion Sort),归并排序(Merge Sort) 阅读:1-2章发测验02 演示课1 算法的正确性发《作业1》3 第二课渐进记号(Asymptotic Notation)。
递归公式(Recurrences):置换法,迭代法,主方法阅读:3-4 章,除了§4.44 第三课分治法:Strassen 算法,费氏数列,多项式乘法。
阅读:28 章第2 节,30章第1节5 演示课2 递归公式,松散性阅读:Akra-Bazzi 的讲义6 第四课快速排序法,随机化算法阅读:5 章1 到 3 节,7 章收《作业1》发《作业2》7 演示课3 排序法:堆排序,动态集合,优先队列阅读:6 章8 第五课线性时间的排序法:时间下界,计数排序法,基数排序法阅读:8 章第1 到3 节收《作业2》发《作业3》9 第六课顺序统计学,中位数阅读:9 章10 演示课4 中位数的应用,桶排序阅读:8 章第 4 节11 第七课散列,全域散列阅读:11 章1 到3 节收《作业3》发《作业4》12 第八课散列函数,完美散列阅读:11 章第5 节13 演示课5 测验1 复习收《作业4》14 评分后的作业4可以在中午拿到15 测验116 演示课6 二叉搜索树,树的遍历阅读:12 章1 到 3 节17 第九课二叉搜索树和快速排序法之间的关系;随机二叉搜索树的分析阅读:12 章4 节发《作业5》18 第十课红黑树,旋转,插入,删除阅读:13 章19 演示课7 2-3树,B-树阅读:18 章1 到 2 节20 第十一课高级数据结构,动态顺序统计,线段树(区间树)阅读:14 章收《作业5》发《作业6》21 第十二课计算几何,区间查询阅读:33 章1 到 2 节22 演示课8 凸多边形阅读:33 章3 节23 第十三课van Emde Boas树,优先队列阅读:van Emde Boas 的讲义收《作业6》发《作业7》24 第十四课平摊分析,表的复制,可能法阅读:17 章25 演示课9 竞争分析,自我排序列26 第十五课动态规划,最长公共子序列,最优二叉搜索树阅读:15 章收《作业7》发《作业8》27 第十六课贪婪算法,最小生成树阅读:16 章1 到 3 节,23 章28 演示课10 贪婪算法和动态规划的范例29 第十七课最短路径1,Dijkstra算法,广度优先搜索阅读:22 章1, 2 节;第580 - 587 页,24章 3 节收《作业8》发《作业9》30 演示课11 深度优先搜索,拓扑排序阅读:22 章3 到 5 节31 第十八课最短路径2,Bellman-Ford算法,DAG最短路径,差分约束阅读:24 章1, 2, 4, 5 节32 第十九课所有点对最短路径,Floyd-Warshall,Johnson 的算法阅读:25 章收《作业9》33 第二十课不相交集合的数据结构阅读:21 章34 评分后的作业9可以在中午拿到35 第二十一课带回家发下测验2 ; 道德,解决问题(强制参加)发测验236 没有演示课- 解答测验2!37 没有课算法程序比赛开始(非强制参加)收测验238 第二十二课网络流,最大流最小割切定理阅读:26 章1 - 2 节发《作业10》(选答)39 演示课12 图的匹配算法(注:最大二分匹配)阅读:26 章3 节40 第二十三课网络流,Edmonds-Karp 算法参赛答案截止41 第二十四课随堂测验;比赛颁奖;后续课程的讨论《作业10》解答。
算法导论小笔记

算法导论小笔记算法导论(CLRS)笔记Note on CLRS(Outline & Draft, 2011)Jian Xiao1第2章Getting started1. Merge sort相关的扩展问题1)链表实现V.S.数组实现。
Divide阶段,如何快速找到链表的中点?另外,如何减少Divide/Combine的时间(相比数组实现)?2)In-place merge的方法。
3)归并树:把Merge sort的中间过程都记录下来,所形成的树。
(其实就是一棵线段树,每个节点存放该节点的区间内有序化后的数)4)逆序数的计算。
2. 两数和问题。
数的集合S,一个数x,判断S中是否存在两个数,二者的和为x。
这个问题扩展以后是一个subset problem,为NPC问题。
第3章Growth of Functions1. 全部5个渐进符号的确切含义第4章Recurrences1. Substitution方法,Recursion tree方法计算复杂度2. Master Theorem及其不能被三种case覆盖的其他情况Master Theorem的证明3. Chip testing problem4. Monge arrays,凸四边形不等式,最优二叉查找树DP算法的优化第5章Probabilistic Analysis and Randomized Algorithms1. 用Biased-Random产生Uniform-Random分布。
2. In-place、O(n)的uniform random permutationIn-place、O(n)的各个position等概的排列1iamxiaojian@/doc/d1*******.html,3. Coupon collector’s problem4. On-line hiring problem第6章Heapsort1. 两种建堆的方法:逐个插入的O(nlogn),以及自底向上调整的O(n)算法2. Heap sort可能存在效率的地方:每次删除堆顶,都是把某树叶放置于堆顶,然后调整;但是,树叶一般比较大,放于堆顶后,几乎总是要进行多次的比较才能恢复堆的结构。
MIT公开课-线性代数笔记

目录方程组的几何解释 (2)矩阵消元 (3)乘法和逆矩阵 (4)A的LU分解 (6)转置-置换-向量空间R (8)求解AX=0:主变量,特解 (9)求解AX=b:可解性和解的解构 (10)线性相关性、基、维数 (11)四个基本子空间 (12)矩阵空间、秩1矩阵和小世界图 (13)图和网络 (14)正交向量与子空间 (15)子空间投影 (18)投影矩阵与最小二乘 (20)正交矩阵和Gram-Schmidt正交化 (21)特征值与特征向量 (27)对角化和A的幂 (28)微分方程和exp(At)(待处理) (29)对称矩阵与正定性 (29)正定矩阵与最小值 (31)相似矩阵和若尔当型(未完成) (32)奇异值分解(SVD) (33)线性变换及对应矩阵 (34)基变换和图像压缩 (36)NOTATIONp:projection vectorP:projection matrixe:error vectorP:permutation matrixT:transport signC(A):column spaceN(A):null spaceU:upper triangularL:lower triangularE:elimination matrixQ:orthogonal matrix, which means the column vectors are orthogonalE:elementary/elimination matrix, which always appears in the elimination of matrix N:null space matrix, the “solution matrix” of AX=0R:reduced matrix, which always appears in the triangular matrix, “IF00”I:identity matrixS:eigenvector matrixΛ:eigenvalue matrixC:cofactor matrix关于LINER ALGEBA名垂青史的分析方法:由具象到抽象,由二维到高维。
算法导论读书笔记

算法导论读书笔记【篇一:《算法概论》读书笔记及读后感】《算法概论》读书笔记12计转1 12130907 李酉辰第0章本章较为简短,没有深入系统地涉及某些内容。
主要以fibonacci 数列的例子,让我体会了递归和递推思想的差别。
针对fibonacci数列例子直接递归解法中涉及的重复计算,优化出递推方式,展示了思考问题中自顶向下与自底向上的不同思考角度可能产生较大的算法效率差别,同时隐约体现记忆化搜索的思想。
另外本章较为详细介绍了大o复杂度度量标准。
第1章本章以rsa算法为例,细致深入讨论了rsa算法涉及的相关数论知识,诸如取模运算、模下的四则运算与逆元概念、取模幂运算、素性检测。
在素性检测部分有经典的欧几里德算法、扩展欧几里德算法,同时引入随机化算法概念,以极高的概率保证素性检测有效性。
通过本章的学习,我对过去不曾深入考虑或者说真正考虑的基础性运算有了更深的理解。
之前对乘除运算复杂度总是在以单元操作的概念下以o(1)带过,以后会更加细致地考虑乘除等基本运算的复杂度。
另外,本章以rsa为案例,系统地展示了针对某一问题,如何从基础性知识入手,一步一步学习案例所需基础知识,并将其整合从而解决案例。
素性检测与素因子分解,两个看似相去不远的问题,其复杂性天差地别的现实,从一般角度让人们想到的是类似问题的解决难度可能差别很大仅此而已,而rsa算法展示了如何深入的多想一步,利用这种情况设计出优雅的解决方案。
这思想很值得我借鉴与利用。
第2章本章介绍分治算法思想,提及分治,相信每一个学习算法的人都不会陌生,经典的《算法导论》中就已合并排序为例在开篇不久就引入分治概念。
本书介绍分治的角度与众不同,不似《导论》中总是介绍比较显而易见的可以分治的案例。
本书列举了矩阵相乘、快速傅立叶变换等数学领域分治的应用案例,在这些案例之中,分治的应用很多情况下隐藏的较为深,并非显而易见,加大了分析难度。
但是更能让我感受到分治应用之广泛,可能在学习本章之前,许多类型的题目我不会想到去向分治的角度思考,因为不易看出,但是本章给我的备忘录上加了一条:永远不要忽视分治,针对陌生题目,不要轻易就否决掉往分治角度思考的路线。
《算法导论》读书笔记 附录A习题解答

A.1-1求的简化公式。
利用等差级数求和公式和级数线性性质:
A.1-2利用调和级数性质证明。
利用调和级数性质:
A.1-3对,证明。
对无穷递减几何级数式两边求导,再乘以:
对该式再进行同上操作得到:
A.1-4 求。
A.1-5 求的值。
当时求得
当时:
计算得到:
A.1-6 利用求和公式的线性特征证明。
令,则下式显然成立:
再把函数代换回即可。
A.1-7 求的值。
A.1-8 求的值。
A.2-1 证明有常量上界。
A.2-2 求和的渐近上界。
故渐近上界是
A.2-3 通过分割求和证明第个调和数是。
故取得下界
A.2-4 通过积分求的近似值。
A.2-5 题略。
为了保证被积函数在积分域上都连续。
思考题
A-1 求和的界
求下列和式的渐近确界。
假设,都是常量。
a)
,得到确界为
b)
根据此式得到上界:
故得到下界:
故据此得到确界
c)
故得到上界:
故得到下界:
因此得到确界。