算法导论学习笔记——第1部分
2015-05-07 22:43
190 查看
第1章
所谓算法,就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出。亦即,算法是一系列的计算过程,将输入值转换成输出值。
一些常见的算法运行时间量级比较:对数级<多项式级<指数级<阶乘级
第2章
插入排序
循环不变式
必须证明它的三个性质
初始化:循环不变式在循环的第一轮迭代开始之前,应该是正确的。
保持:如果在循环的某轮迭代之前它是正确的,那么在下一轮迭代之前,它也应该保持正确。
终止:当循环结束时,不变式给了我们一个有用的性质,有助于表明算法是正确的。
数学归纳法
证明某一性质是成立的,首先要证明基本情况是成立的,然后证明一个归纳步骤是成立的。
在数学归纳法中,归纳步骤是无穷的;在循环不变式中,当循环结束,归纳即终止。
伪代码的约定
1、使用缩进表示程序中的程序块结构。
2、循环计数器变量在循环退出时依然保持值。也就是循环计数器的值是第一个超出循环边界的值。
3、符号 ▷ 表示后面是注释。
4、多重赋值 i←j←e,是将e的值赋值给i和j
5、数组元素通过数组名[下标]的形式来访问,下标从1开始,而不是0
6、表示数组或对象的变量,被看做是一个指向数组或变量的指针,一个指针不指向任何一个对象,则它是NIL
7、参数采用按值传递的方式,一个被调用的过程接收到的参数是变量的一个副本;当对象被传递时,实际传递的是一个指针
8、布尔运算符and和or,具有“短路”能力,当表达式的值一旦可以被确定,就不再计算下去
等差数列
首项为1,公差为1,等差数列前n项和:n(n+1)/2
递归结构
为了解决一个给定的问题,算法要一次或多次的调用自身来解决子问题。
分治法
分解:将原问题分解成一系列的子问题
解决:递归解决各个子问题,需要子问题足够小,则直接解决
合并:将子问题的解合并成原问题的解
合并排序
第3章
一些数学问题
1、对任意两个函数f(n)和g(n),f(n)=Θ(g(n))当且仅当f(n)=O(g(n))和f(n)=Ω(g(n))
2、实数集有一个属性不能应用在渐进符号上
三分性:对于实数a和b,下列三种情况有且仅有一种情况成立,a>b,a=b,a<b
并不是所有的函数都可以进行渐进比较
3、近似的函数增长
对数<线性<多项式<指数<阶乘
第4章
解递归式
1、代换法substitution
1)猜测解的形式
2)用数学归纳法找出使解真正有效的常数
2、递归树
使用递归树时,可以忽略一些“小误差”,将递归产生的结果作为猜测,用代换法进行验证。
也可以严格计算每一层递归树的代价,加总成递归式的结果。
对于有两个子问题,子问题规模为1/2的递归树(二叉树),树的高度是lgn,叶级节点的数量是n
3、主方法master method
递归式形式T(n)=aT(n/b)+f(n),其中a>=1,保证有一个及以上子问题;b>1,保证问题的规模逐步变小,否则问题会趋向于无穷;f(n)渐进趋正。
从极限的角度比较aT(n/b)和f(n),更高阶的一项决定递归式的解
1)aT(n/b)比f(n)高阶,T(n)=Θ(nlogba)
2)aT(n/b)与f(n)同阶,T(n)=Θ(nlogbalgn)
3)aT(n/b)比f(n)低阶,T(n)=Θ(f(n))
并非所有的递归式都能应用这三种情况。
第5章
原地排列给定的数列,实现随机排列
所谓算法,就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出。亦即,算法是一系列的计算过程,将输入值转换成输出值。
一些常见的算法运行时间量级比较:对数级<多项式级<指数级<阶乘级
lgn < n1/2< n < nlgn < n2 < n3< 2n < n!
第2章
插入排序
1 INSERTION-SORT(A) 2 for j←2 to length(A) 3 do key←A[j] 4 ▷Insert A[j] into the sorted sequence A[1..j-1] 5 i←j-1 6 while i>0 and A[i]>key 7 do A[i+1]←A[i] 8 i←i-1 9 A[i+1]←key
循环不变式
必须证明它的三个性质
初始化:循环不变式在循环的第一轮迭代开始之前,应该是正确的。
保持:如果在循环的某轮迭代之前它是正确的,那么在下一轮迭代之前,它也应该保持正确。
终止:当循环结束时,不变式给了我们一个有用的性质,有助于表明算法是正确的。
数学归纳法
证明某一性质是成立的,首先要证明基本情况是成立的,然后证明一个归纳步骤是成立的。
在数学归纳法中,归纳步骤是无穷的;在循环不变式中,当循环结束,归纳即终止。
伪代码的约定
1、使用缩进表示程序中的程序块结构。
2、循环计数器变量在循环退出时依然保持值。也就是循环计数器的值是第一个超出循环边界的值。
3、符号 ▷ 表示后面是注释。
4、多重赋值 i←j←e,是将e的值赋值给i和j
5、数组元素通过数组名[下标]的形式来访问,下标从1开始,而不是0
6、表示数组或对象的变量,被看做是一个指向数组或变量的指针,一个指针不指向任何一个对象,则它是NIL
7、参数采用按值传递的方式,一个被调用的过程接收到的参数是变量的一个副本;当对象被传递时,实际传递的是一个指针
8、布尔运算符and和or,具有“短路”能力,当表达式的值一旦可以被确定,就不再计算下去
等差数列
首项为1,公差为1,等差数列前n项和:n(n+1)/2
递归结构
为了解决一个给定的问题,算法要一次或多次的调用自身来解决子问题。
分治法
分解:将原问题分解成一系列的子问题
解决:递归解决各个子问题,需要子问题足够小,则直接解决
合并:将子问题的解合并成原问题的解
合并排序
1 MERGE(A,p,q,r) 2 n1←q-p+1 3 n2←r-q 4 create arrays L[1..n1+1] and R[1..n2+1] 5 for i←1 to n1 6 do L[i]←A[p+i-1] 7 for j←1 to n2 8 do R[j]←A[q+j] 9 L[n1+1]←∞ 10 R[n2+1]←∞ 11 i←1 12 j←1 13 for k←p to r 14 do if L[i]<=R[j] 15 then A[k]←L[i] 16 i←i+1 17 else A[k]←R[j] 18 j←j+1 19 20 MERGE-SORT(A,p,r) 21 if p<r 22 then q←floor((p+r)/2) 23 MERGE-SORT(A,p,q) 24 MERGE-SORT(A,q+1,r) 25 MERGE(A,p,q,r)
第3章
一些数学问题
1、对任意两个函数f(n)和g(n),f(n)=Θ(g(n))当且仅当f(n)=O(g(n))和f(n)=Ω(g(n))
2、实数集有一个属性不能应用在渐进符号上
三分性:对于实数a和b,下列三种情况有且仅有一种情况成立,a>b,a=b,a<b
并不是所有的函数都可以进行渐进比较
3、近似的函数增长
对数<线性<多项式<指数<阶乘
第4章
解递归式
1、代换法substitution
1)猜测解的形式
2)用数学归纳法找出使解真正有效的常数
2、递归树
使用递归树时,可以忽略一些“小误差”,将递归产生的结果作为猜测,用代换法进行验证。
也可以严格计算每一层递归树的代价,加总成递归式的结果。
对于有两个子问题,子问题规模为1/2的递归树(二叉树),树的高度是lgn,叶级节点的数量是n
3、主方法master method
递归式形式T(n)=aT(n/b)+f(n),其中a>=1,保证有一个及以上子问题;b>1,保证问题的规模逐步变小,否则问题会趋向于无穷;f(n)渐进趋正。
从极限的角度比较aT(n/b)和f(n),更高阶的一项决定递归式的解
1)aT(n/b)比f(n)高阶,T(n)=Θ(nlogba)
2)aT(n/b)与f(n)同阶,T(n)=Θ(nlogbalgn)
3)aT(n/b)比f(n)低阶,T(n)=Θ(f(n))
并非所有的递归式都能应用这三种情况。
第5章
原地排列给定的数列,实现随机排列
1 RANDOMIZE-IN-PLACE(A) 2 n←length[A] 3 for i←1 to n 4 do swap A[i]↔A[RANDOM(i,n)]
相关文章推荐
- C++ Primer(第4版)-第1部分:基本语言——学习笔记
- ENC28J60学习笔记——第1部分
- C++ Primer(第4版)-学习笔记-第1部分:基本语言
- Linux学习内核移植相关笔记第1部分
- Linux学习笔记三:gvim中到跳转命令和部分正则表达式
- Foundation of Machine Learning 笔记第四部分 —— Generalities 以及对不一致假设集的PAC学习证明
- coco2dx-2.2.2 win32启动过程(opengl 和 窗口大小初始化部分) - 学习笔记 1
- 算法导论学习笔记(五):快速排序
- 《Cocos2d-x高级开发教程》学习笔记 OpenGL部分
- 算法导论--学习笔记017
- C++学习笔记【第三部分第十四章:重载运算与类型转换】
- IOS 学习笔记14 内存管理(3) 有效的内存管理 前半部分
- 算法导论-堆排序学习笔记
- C和指针 学习笔记—第1-2章
- Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)
- 学习jquery部分笔记
- Espresso学习笔记--google doc前四篇部分翻译和理解
- C++学习笔记(二)C++primer 部分习题和知识点
- Java学习笔记(基础部分)--环境变量的配置
- JavaScript 语言精粹学习笔记第1/2页