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

  • 相关阅读:
    【Linux】防火墙命令
    【MySQL】mysql分组后重命名
    【SpringBoot】全局配置Long转String,解决前端接收时精度丢失的问题
    【VSCode】vscode运行命令时提示“因为在此系统上禁止运行脚本”
    【Mybatis】mybatisplus代码生成器【逆向工程】搭配Lombok和swagger2
    【Linux】赋予root权限
    【MySQL】mysql模糊匹配多个字段
    idea为新创建的类增加个人注释模板
    【Linux】学习笔记:(一)常用命令大全
    Navicat查看数据库的密码
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/4320755.html
Copyright © 2011-2022 走看看