【算法学习】——算法分析原理

来源:互联网 发布:徐州共享网络玩家 编辑:程序博客网 时间:2024/06/18 14:13

算法分析

先略~以后再填

函数增长

大体分为

  • logN
  • N
  • NlogN
  • N^2
  • N^3
  • 2^n
    略~以后再补

占位先补充math库中的两个函数:floor和ceil
floor(x) //小于或等于x的最大整数
ceil(x) //大于或等于x的最小整数
待会分析搜索时间和复杂度用的到。

O-notion 大O记号

使用目的

  1. 当忽略公式中的小项时,限制错误的发生
  2. 当忽略对总分析结果有微小贡献的程序部分时,限制错误的发生
  3. 允许根据总运行时间的上限将算法分类

    占位待填,重要~

基本递推式

~~~

算法分析实例

顺序搜索(sequential search)和二分搜索(binary search)

顺序搜索非常简单,所以不再贴代码了,对于M次搜索,数组大小为N时,顺序搜索的平均时间与MN成比例。当M = 10^9且N = 10^6时,完成所有事务的运行时间至少为16c年,这是不可接受的。所以我们来看一种更高效的搜索算法(只针对顺序列表而言)——二分搜索。

#include<stdio.h>#define N 10000//sequential search 顺序查找过于简单不贴代码了 //binary searchint 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 个,这样处理百万数量级的列表也不过只需要几十次的查找。

保证、预测和限制

空~

原创粉丝点击