zoukankan      html  css  js  c++  java
  • 算法-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:极大数据量,几千万,几亿

  • 相关阅读:
    [UE4]roll pitch yaw
    [UE4]用向量表示方向
    [UE4]关闭自动曝光
    Mysql数据库常用分库和分表方式
    mycat分库分表 mod-long
    windows安装mycat(转)
    Mycat读写分离、主从切换学习(转)
    Windows版Mycat结合mysql安装配置+水平切分(转载)
    数据库高性能读写分离集群操作说明
    spring MVC、mybatis配置读写分离,ReplicationDriver(转载)
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/4320755.html
Copyright © 2011-2022 走看看