算法学习笔记

1 时间复杂度

一个算法对特定输入的时间复杂性是该算法对该输入产生结果需要的原子操作或“步”数。
时间复杂性是输入大小的函数(输入大小:输入数据所占据的存储单元,bit或者byte等)。

时间复杂度并不是表示一个程序解决问题需要花费的时间,而是,当所要解决的问题的规模扩大后,程序需要的时间增长的有多快。对于高速处理数据的计算机来说,处理某一个特定的数据的效率不能衡量一个程序的好坏,而是应该看当这个数据的规模变得很大之后,程序处理所花费的时间是否仍然一样,或者还是跟着一样变慢了数百倍或者更多。
不管数据有多大,花费的时间总是一样的,我们就说这个程序具有O(1)的复杂度(这个算法很好);程序的运行时间跟数据规模同等程度地变化,O(n)等等。
多项式级复杂度:O(logn)、O(n^2)、
O(n^100)等
指数级复杂度:O(2^n)、O(n!)等
T(k)=O(2^k)表示对于输入是k的数据
时间复杂度是2^k,所以这是一个指数级复杂度

欧几里得算法(算法1,下文用算法1来代替):

1.m<-a, n<-b, r<-min(a,b)
2.If m<n Then 交换m,n
3.while (r!=0) Do
4. r <-m%n    /* m = qn + r */
5. m <-n, n<-r
6. 输出m

例题1:欧几里德算法的输入大小为 log2a, log2b,分别将算法中进行的求余操作和赋值操作的次数表示成 log2a, log2b 的函数,并由此得出欧几里德算法的渐近复杂性。

插入排序(算法2):

Insertion-sort(A)
1. FOR j=2 To n Do
2. key<-A[j];
3. i<-j-1
4. WHILE i>0 AND A[i]>key Do
5. A[i+1]<-A[i];
6. i<-i-1;
7. A[i+1]<-key;

P和NP问题

P(Polynomial,多项式问题):一个问题能够找到一个多项式级复杂度的算法。
但是并不是所有的问题都可以找到复杂度为多项式级的算法,有的问题甚至没有解。如The Halting Problem就是一个著名的不可解问题。
Hamilton回路问题(给定一个图,找到一条路径,没有重复和遗漏地经过所有顶点)。

算法的正确性分析

定义:对每个输入都停止且产生正确输出
调试程序只能证明程序有错,不能证明程序无错误。

循环不变量(loop invariant)

在主要结构是循环结构的算法中,可以通过循环不变量来证明其正确性。
所谓循环不变量是指数据或数据结构在整个循环过程中保持不变的性质(依赖于具体的算法和算法特点)。
它必须在以下3种情况下均保持不变,且该性质在循环终止后能证明算法的正确性。
初始化(循环初始化后,循环条件测试前)
迭代(循环体每执行一次,循环不变量成立)
终止(算法结束后,循环不变量保证算法正确)

示例1 对于欧几里得算法(算法1):

循环不变量:(a,b)=(m,n)=m #a,b的最大公约数等于m,n的最大公约数

示例2 对于算法2:

循环不变量:循环变量为j但循环体未执行前,
A[1,2,…,j-1]来自输入且有序

初始 j=2: A[1]来自输入且有序
循环 : 设A[1,…,j-1]来自输入且有序
循环体执行一遍,A[1,…,j-1,j]来自输入且有序
终止j=n+1: A[1,2,…,n]来自输入且有序

不正确算法

在某个输入上不停止或者对所有输入都停止但是对某输入产生不正确的结果。

近似算法

对所有输入都停止
产生近似正确的解或者产生不多的正确解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值