算法分析
先略~以后再填
函数增长
大体分为
- logN
- N
- NlogN
- N^2
- N^3
- 2^n
略~以后再补
占位先补充math库中的两个函数:floor和ceil
floor(x) //小于或等于x的最大整数
ceil(x) //大于或等于x的最小整数
待会分析搜索时间和复杂度用的到。
O-notion 大O记号
使用目的
- 当忽略公式中的小项时,限制错误的发生
- 当忽略对总分析结果有微小贡献的程序部分时,限制错误的发生
允许根据总运行时间的上限将算法分类
占位待填,重要~
基本递推式
~~~
算法分析实例
顺序搜索(sequential search)和二分搜索(binary search)
顺序搜索非常简单,所以不再贴代码了,对于M次搜索,数组大小为N时,顺序搜索的平均时间与MN成比例。当M = 10^9且N = 10^6时,完成所有事务的运行时间至少为16c年,这是不可接受的。所以我们来看一种更高效的搜索算法(只针对顺序列表而言)——二分搜索。
#include<stdio.h>
#define N 10000
//sequential search 顺序查找过于简单不贴代码了
//binary search
int main() {
int a[N];
int i,l,r,v;
for(i = 0;i < N;i ++) {
a[i] = i;
}
scanf("%d",&v);
r = N-1; //指向数组最后一个数
l = 0; //指向数组第一个数
while(r >= l) {
int m = (l+r)/2; //把当前数组二分
if(v == a[m]) { //相等即为查找到
printf("%d",m);
}
if(v < a[m]) { //在节点m前继续二分查找
r = m - 1; //r指向新数组的最后一个数
}
else { //在节点m后继续二分查找
l = m + 1; //l指向新数组的第一个数
}
}
}
二分搜索每次对数组进行二分,每次均可排除一半的数,因此二分查找的搜索个数永远不会超过floor(log2(N))+1 个,这样处理百万数量级的列表也不过只需要几十次的查找。
保证、预测和限制
空~