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]; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」