算法设计与分析——考试前复习:第一章

引论

满足以下性质的程序可以被称作算法:

  1. 输入:有零个或多个外部输入
  2. 输出:至少有一个输出数据
  3. 确定性:每条指令是清晰、无歧义的
  4. 有限性:指令的执行次数是有限的,执行指令的时间也是有限的
  5. 可行性:所有运算都是基本运算,能精确进行并能在有限次完成

有以下三种方式表达算法:

  1. 高级程序设计语言(也就是正常的代码形式)
  2. 自然语言
  3. 伪代码
  4. 程序流程图

算法复杂性记号

  1. O(大欧,渐进上界) 相当于 “<="
  2. Ω(大欧米伽,渐进下界) 相当于 “>=”
  3. θ(西塔,渐进紧确界) 相当于 “=”
  4. o(小欧,非渐进紧确上界) 相当于 “<”
  5. ω(小欧米伽,非渐进紧确下界) 相当于 “>”

能够根据数据范围,估算时间复杂度是否可行

请看以下表格

时间复复杂度可接受N的最大范围
O(1)、O(logN)只要不是天文数字都可接受
O(N)107
O(NlogN)105~106
O(N2)1000~2500
O(2N)不超过30
O(N!)不超过11

例题:
已知一道应用题的数据范围为n=100000,可以推断以下哪个时间复杂度的算法是不能满足题目要求的?( )。
A、 O(n) B、 O(nlogn) C、 O(n!) D、B和C都不可以
答案:C

问题规模和基本语句判断的例题

for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		x++;

问题规模:n
基本语句:x++

int find(int A[],int n){
	for(int i=0;i<n;i++)
		if(A[i]==k) break;
	return i;

基本语句:A[i]==k

常见的时间复杂度

  1. 一条简单语句的时间复杂度是O(1)
int count = 0;
  1. 一个循环的时间复杂度是O(n)
int n=8,count=0;
for(int i=1;i<=n;i++)
	count++;    //循环体执行n次
  1. 以下循环语句的时间复杂度是O(log2N)
for(int i=1;i<=n;i*=2)         //i按2的幂(1,2,4,8)递增
	count++;                 //循环体执行z次
  1. 以下二重循环语句的时间复杂度是O(n2)
for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
		count++;
  1. 以下二重循环语句的时间复杂度是O(mn)
for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
		count++;
  1. 以下二重循环的时间复杂度是O(n)
for (int i=1; i<=n; i*=2)         //循环z次
    for (int j=1; j<=i; j++)      //循环i次

以上z=log2N

例题

  1. 一般来讲,同样的算法,使用的语言级别越高,效率越低
    A. 对
    B. 错
    正确答案:对
  2. Java中判断两个类的内容是否相等可以使用运算符==
    A. 对
    B. 错
    正确答案:错
  3. Java的基本数据类型有:
    boolean、byte、char、double、float、int、long、short
    注意:String并不是基本数据类型之一
  4. 下列方法swap可以交换实际参数的值。
    public static void swap(intx,int y) {
    int temp=x;
    x=y;
    y=temp;
    }
    A. 对
    B. 错
    正确答案:错
  5. 如果一个算法在最坏情况下的复杂度很高,那它一定不是个好算法。
    A. 对
    B. 错
    正确答案: 错
  6. Java中构造函数的返回类型为new出来的类型。
    A. 对
    B. 错
    正确答案: 错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值