引论
满足以下性质的程序可以被称作算法:
- 输入:有零个或多个外部输入
- 输出:至少有一个输出数据
- 确定性:每条指令是清晰、无歧义的
- 有限性:指令的执行次数是有限的,执行指令的时间也是有限的
- 可行性:所有运算都是基本运算,能精确进行并能在有限次完成
有以下三种方式表达算法:
- 高级程序设计语言(也就是正常的代码形式)
- 自然语言
- 伪代码
- 程序流程图
算法复杂性记号
- O(大欧,渐进上界) 相当于 “<="
- Ω(大欧米伽,渐进下界) 相当于 “>=”
- θ(西塔,渐进紧确界) 相当于 “=”
- o(小欧,非渐进紧确上界) 相当于 “<”
- ω(小欧米伽,非渐进紧确下界) 相当于 “>”
能够根据数据范围,估算时间复杂度是否可行
请看以下表格
时间复复杂度 | 可接受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
常见的时间复杂度
- 一条简单语句的时间复杂度是O(1)
int count = 0;
- 一个循环的时间复杂度是O(n)
int n=8,count=0;
for(int i=1;i<=n;i++)
count++; //循环体执行n次
- 以下循环语句的时间复杂度是O(log2N)
for(int i=1;i<=n;i*=2) //i按2的幂(1,2,4,8)递增
count++; //循环体执行z次
- 以下二重循环语句的时间复杂度是O(n2)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
count++;
- 以下二重循环语句的时间复杂度是O(mn)
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
count++;
- 以下二重循环的时间复杂度是O(n)
for (int i=1; i<=n; i*=2) //循环z次
for (int j=1; j<=i; j++) //循环i次
以上z=log2N
例题
- 一般来讲,同样的算法,使用的语言级别越高,效率越低
A. 对
B. 错
正确答案:对 - Java中判断两个类的内容是否相等可以使用运算符==
A. 对
B. 错
正确答案:错 - Java的基本数据类型有:
boolean、byte、char、double、float、int、long、short
注意:String并不是基本数据类型之一 - 下列方法swap可以交换实际参数的值。
public static void swap(intx,int y) {
int temp=x;
x=y;
y=temp;
}
A. 对
B. 错
正确答案:错 - 如果一个算法在最坏情况下的复杂度很高,那它一定不是个好算法。
A. 对
B. 错
正确答案: 错 - Java中构造函数的返回类型为new出来的类型。
A. 对
B. 错
正确答案: 错