C-查找算法

时间复杂度由于计算机的性能不同,无法准确地确定一个算法的执行时间,因此使用执行算法的次数来代表算法的时间复杂度,一般用O(公式)来表示。

空间复杂度执行一个程序(算法)所需要的内存空间的大小,是对一个算法在运行过程中临时占用存储空间大小的衡量。通常来说,只要这个算法不涉及动态分配内存以及递归,通常空间复杂度为O(1)。

 

查找算法

一、顺序查找:

对待查找的数据没有特殊要求,从头到尾逐一查找比较,在小规模数据的查找中较为常见,平均效率较低。

时间复杂度:O(N)。

复制代码
//    顺序查找
int order_search(int* arr,int len,int key)
{
    for(int i=0; i<len; i++)
    {
        if(arr[i] == key) return i;
    }
    return -1;
}
复制代码

 

 

二、二分查找

对待查找的数据必须有序,从中间位置开始查找,如果中间值比key大,则从左边继续二分查找,否则从右边二分查找

时间复杂度:O(logN)。

复制代码
//    简单排序
void sort(int* arr,int len) 
{
    for(int i=0; i<len-1; i++)
    {
        for(int j=i+1; j<len; j++)
        {
            if(arr[i] > arr[j])
            {
                int num = arr[i];
                arr[i] = arr[j];
                arr[j] = num;
            }
        }
    }
}

//    二分查找
int bianry_search_for(int* arr,int len,int key)
{
    int l = 0, r = len-1;
    while(l <= r)
    {
        int m = (l+r)/2;
        if(arr[m] == key) return m;

        if(key < arr[m]) r = m-1;
        else l = m+1;
    }
    return -1;
}
复制代码

用递归的方法进行二分查找:

复制代码
int _bianry(int* arr,int l,int r,int key)
{
    if(l > r) return -1;
    int m = (l+r)/2;
    if(key == arr[m]) return m;
    if(key < arr[m])
        return _bianry(arr,l,m-1,key);
    else
        return _bianry(arr,m+1,r,key);
}

//    递归二分查找
int bianry_search_recusion(int* arr,int len,int key)
{
    return _bianry(arr,0,len-1,key);    
}
复制代码

 

三、块查找(权重查找)

是一种数据处理的思想,不是特定的算法实现,当待处理的数据量很巨大时,可以根据数据的特征进行分块处理,然后再对每块数据进行查找

例如:英文词典、通讯录

四、哈希查找

先把待查找的数据经过哈希函数,计算出该数据在哈希表中的位置,然后做标记,后续就可以很方便地查找数据,它的时间复杂度最高能到O(1)
缺点:该算法有很大的局限性,不适合查找浮点型数据需要额外的内存空间、空间复杂度高、是一种典型的以空间换时间的算法

哈希函数设计方法:
  1、直接定址法:直接把数据作为它在哈希表中的位置来做标记
  2、数据分析法:先分析出数据的最大值、最小值,然后通过 最大值-最小值+1 来确定哈希表的长度,根据哈希函数 数据-最小值 进行标记和查找哈希表
  3、平方取中法、折叠法、随机数法等
注意:无论哪种方法都可能会出现哈希冲突(有重复数据时无法确定具体数据),一般采用链表配合解决
Hash函数的应用:MD5加密算法、SHA-1都属于Hash算法

复制代码
//    哈希查找
int hash_search(int* arr,int len,int key)
{
    //    直接定址法
    //创建哈希表
    int hash[100000] = {};
    //根据数据做标记
    for(int i=0; i<len; i++)
    {
        hash[arr[i]]++;    
    }
    //    查找
    return hash[key];
}

int hash_search_data(int* arr,int len,int key)
{
    //    数据分析法
    int max = arr[0],min = arr[0];
    for(int i=1; i<len; i++)
    {
        if(arr[i] > max) max = arr[i];
        if(arr[i] < min) min = arr[i];
    }
    if(key<min || key>max) return -1;
    //    创建哈希表
    int hash[max-min+1];
    memset(hash,0,sizeof(int)*(max-min+1));

    //    经过哈希函数来标记
    for(int i=0; i<len; i++)
    {
        hash[arr[i]-min]++;    
    }
    return hash[key-min];
}
复制代码

 

 

 

posted @   冲他丫的  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示