O(big o) 是上限,是我们关注的算法的时间复杂度。数据量大,数据量涨一千倍,lgn的算法就是 耗费的时间就是10倍,o(n)就是一千倍,o(n2)就是一百万倍的差距
例一:Sequential search 算法复杂度o(n)。找到了o(n/2) ,没找到 o(n)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5000000 #define STEP 3 int a[N]; int g_nMax=0; int main (void) { time_t t=0; //以秒为单位 int i=0,n=0; clock_t begin=0,end=0; //build an array (increasing),randomly time(&t); srand(t); for(i=0;i<N;i++){ a[i] = g_nMax + 1 + (rand() % STEP); g_nMax=a[i]; } n=(rand() % g_nMax) +1; begin=clock(); for(i=0;i<N;i++){ if(a[i]==n){ printf("%d 找到了 ",n); break; } } if (i==N) printf("%d 找不到",n); end = clock(); printf("sequetial search 花费时间:%d ",end-begin); }
例二:Binary search【先决条件,排序好了的数据】 o(lgn)
1024之类的数据,最多也就找11次,40亿的数据,最多也就找33次。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 50000000 #define STEP 3 #define LOOP 1000 int a[N]; int g_nMax=0; void binary_search(int min,int max,int n) { int mid=0; if(min>max){ // printf("%d找不到 ",n); return; } mid =min+(max-min)/2; if(n==a[mid]){ // printf("%d 找到了 ",n); return; } if(n<a[mid]) binary_search(min,mid-1,n); else binary_search(mid+1,max,n); } int main (void) { time_t t=0; //以秒为单位 int i=0,n=0; clock_t begin=0,end=0; //build an array (increasing),randomly time(&t); srand(t); for(i=0;i<N;i++){ a[i] = g_nMax + 1 + (rand() % STEP); g_nMax=a[i]; } n=(rand() % g_nMax) +1; begin=clock(); for(i=0;i<N;i++){ if(a[i]==n){ printf("%d 找到了 ",n); break; } } if (i==N) printf("%d 找不到",n); end = clock(); printf("sequetial search 花费时间:%d ",end-begin); begin=clock(); for(i=0;i<LOOP;i++) { binary_search(0,N-1,n); } end=clock(); printf("binary search 花费时间:%f ",(float)(end-begin)/LOOP); }
例三:hashtable 复杂度o(1).大数据量,杂乱无序。
hash table size n 最好不是2或10的倍数,最好是质数,如2的n次方-1也很好
应用MD5
database :结构化数据 最好到1百万级别
search engin:极大数据量,几千万,几亿