算法-search

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:极大数据量,几千万,几亿

原文地址:https://www.cnblogs.com/bluewelkin/p/4320755.html