算法导论第一章,第二章笔记

来源:互联网 发布:淘宝店设计装修多少钱 编辑:程序博客网 时间:2024/05/21 09:06
第一章,第二章


算法导论读书笔记
1、算法是什么
2、要知道几种数据结构的优势和局限
比如排序算法
NP问题是什么




循环不变性,算法正确性的证明
布尔运算符  会短路的 
传值,传参的不同
复杂度分析
输入规模
最坏情况和 平均情况




数据结构听课笔记
1、
makefile来编译c++程序
make是如何高效编译程序的:通过检测文件是否变化
具体如下:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
那么如何检测文件是否变化的呢?
存疑。


2、
c++程序的调试器、debugger
ddd,gdb等等
讨论课上会讲


3、
证明程序正确
right output
will halt
如何证明算法的准确性
test case? 但test case不是无穷的


4、
为什么要学习算法
比如中文,英文
都有语法,动词等
尽管表面上看起来不同,但是其中的语义逻辑是相同的,而算法就是程序中的逻辑
尽管c++和python程序不一样,但是他们的伪代码描述、程序实现的逻辑是一样的,所以 要学习算法,学习算法的时候多用伪代码描述


5、
程序的本质: Input-->output
对于 sort(排序算法), input为一组数,output为 sorted permutation 


6、
数据结构要学什么
store and organize datafor efficient access


7、
computability
什么是可计算问题,哪些问题计算机可以处理
turing machine:
enigma破译德军密码
证明了 哪些问题 是可计算的
比如 halting problem


8、
pseudocode 伪代码 示范
分析插入排序的 复杂度 并证明 该算法的正确性
即对loop invariant的证明
a[0,j-1] is sorted
借鉴了数归方法(第一数学归纳法):
1、Initialization
2、Maintenance
3、Termination
具体证明http://www.cnblogs.com/bamboo-talking/archive/2011/02/05/1950197.html


9、
时间复杂度与什么有关
1、n 问题的规模
2、step,程序的步数


插入排序的 最坏复杂度为 n^2,整体为 a*n^2+b*n+c
为什么不考虑那些常数  和 低阶项, 而只考虑growth rate
因为当n 小 时,该算法运行时间很小,有效率
当n很大时候,运行时间只取决n^2,该项为 高阶项


关注最坏时间复杂度,因为
1有最坏预期,not exceed limited time 比如飞控系统
2dont know the average input
关于平均时间,因为
对于 搜索引擎,常用的 是快排,尽管他的最坏复杂度比归并排序高,但是我们应该考虑的是 平均时间

另外对于不同cpu,不同指令的执行速度时不同的,这里认为对于同一台cpu那些指令都是常数级执行时间的 










0 0