在日常编程和面试中,查找算法和排序算法需要非常熟练。本文用C++语言的语法来写常用的查找算法:顺序查找,二分查找,

一、顺序查找

1.1基本思想(有序无序皆可以)

1 从表中的第一个元素开始,依次与关键字比较。
2 若某个元素匹配关键字,则查找成功。
3 若查找到最后一个元素还未匹配关键字,则查找失败。

1.2 时空复杂度

1.查找成功时的平均查找长度为:(假设每个数据元素的概率相等)
ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;
2.当查找不成功时,需要n+1次比较,时间复杂度为O(n);所以,顺序查找的时间复杂度为O(n)。
3. 查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;当查找不成功时,需要n+1次比较,时间复杂度为O(n);
4. 所以,顺序查找的时间复杂度为O(n)。

1.3 算法优缺点

优点:对于待查的结构无任何要求,算法简单;当待查表中的记录个数较少时,采用顺序查找较好,顺序查找既可用于顺序结构存储,又使用于链接结构存储。
缺点:时间复杂度较大,数据规模较大时效率较低。

1.4 C++实现

template <typename T>
//在长度为n的数组a中查找目标常量值x
int sequentialSearch(T a[],int n const T& x)
{int i;for(i=0;i<n;i++){if(a[i]==x){return i;}}return -1;
}

二、二分查找(折半查找)

2.1基本思想(针对有序)

1.查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2. 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3. 如果在某一步骤数组为空,则代表找不到。 这种搜索算法每一次比较都使搜索范围缩小一半。

2.2时空复杂度

最坏情况下,目标值比较次数为log2(n+1),且期望(平均)时间复杂度为O(log2n);

2.3算法优缺点

优点:查找迅速,每次可以使得搜索范围减少一半;
缺点:必须先排序,为有序数组才行。

2.4C++实现

template <typename T>
//在起点为start,终点为end的有序数组arr中搜索目标值hkey
int binarySearch(T arr[],int start,int end,int hkey)
{if(start>end)return -1;int mid=start+(end-start)/2;if(arr[mid]>hkey){return binarySearch(arr,start,mid-1,hkey);}else if(arr[mid]<hkey){return binarySearch(arr,mid+1,end,hkey);}else{return mid;}
}

三、分块查找

3.1算法思想

将n个数据元素”按块有序”划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须”按块有序”;即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素
步骤如下:
1.首先将查找表分成若干块,在每一块中数据元素的存放是任意的,但块与块之间必须是有序的;
2.建立一个索引表,把每块中最大的关键字值按块的顺序存放在一个辅助数组中,这个索引表也按升序排列;
3.查找时先用给定的关键字值在索引表中查找,确定满足条件的数据元素存放在哪个块中,查找方法既可以是折半方法,也可以是顺序查找。
4.再到相应的块中顺序查找,便可以得到查找的结果。

3.2C++实现

//在序列数组st中,用分块方法查找target的记录,在arr[]中二分查找,确定属于m个块的那哪一个块中
int blockSearch(int arr[],int st[],int target,int m)
{int start=0;int end=arr.size()-1;int index=binarySearch(arr,start,end,target);if(index>=0){int j=index>0?m*index:index;int length=(index+1)*m;//在确定的快中用顺序查找方法查找keyfor(int k=j;k<length;k++){if(target==st[k]){//查找成功return k;}}}
}

四、二叉树查找

4.1基本思想

二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。

二叉查找树:也叫二叉搜索树,或称二叉排序树,或者是一棵空树,或者是具有下列性质的二叉树:
1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2.若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。
二叉查找树性质:对二叉查找树进行中序遍历,即可得到有序的数列。

4.2 时空复杂度

它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。因此追求的目标是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷。
基于二叉查找树进行优化,进而可以得到其他的树表查找算法,如平衡树、红黑树等高效算法。

4.3 C++实现

//定义二叉树数据结构
class TreeNode
{pubic:TreeNode(int value){this.value = value;}
private:int value;TreeNode left;TreeNode right;
}class TreeSearch
{//从根节点为root的树中查找节点的值为value的节点TreeNode search(TreeNode root,int value){   //空树if (root == nullptr){return nullptr;}//定义当前节点TreeNode current = root;while(current != nullptr){if (current.val < value){//如果当前节点的值比value小,则从其右子树中开始找current = current.right;}else if (current.val > value){//如果当前节点的值比value大,则从其左子树中开始找current = current.left;}else if (current.val == value){//找到则返回这个节点return current;}}return nullptr;}
}

五、哈希表查找

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

5.1基本思想

1.用给定的哈希函数构造哈希表;
2.根据选择的冲突处理方法解决地址冲突;
常见的解决冲突的方法:拉链法和线性探测法。
3.在哈希表的基础上执行哈希查找。

5.2 时空复杂度

单纯论查找复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)

5.3C++实现

//实则unordered_map数据结构就是这么实现的
int searchHash(int[] hash, int hashLength, int key)
{// 哈希函数int hashAddress = key % hashLength;// 指定hashAdrress对应值存在但不是关键值,则用开放寻址法解决while (hash[hashAddress] != 0 && hash[hashAddress] != key){hashAddress = (++hashAddress) % hashLength;}// 查找到了开放单元,表示查找失败if (hash[hashAddress] == 0)return -1;return hashAddress;
}

C++实现常用查找算法相关推荐

  1. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  2. C++STL常用查找算法

    C++STL常用查找算法 学习目标 算法简介 find 功能描述 函数原型 示例 总结 find_if 功能描述 函数原型 示例 总结 adjacent_find 功能描述 函数原型 示例 总结 bi ...

  3. STL算法——常用查找算法(find、find_if、adjacent_find、binary_search、count、count_if)

    5.2 常用查找算法 学习目标: 掌握常用的查找算法 算法简介: find //查找元素 find_if //按条件查找元素 adjacent_find //查找相邻重复元素 binary_searc ...

  4. C++常用查找算法总结(一)

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找,字段的查找,等等. 1.查找算法总结 (1). 最容易理解的查找算法,顺序查找法 说明:顺 ...

  5. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  6. c语言中的常用查找算法

    1.顺序查找: 概念:按照顺序,从第一个元素遍历到最后一个元素,找到就返回元素下标:下面的代码可以帮助你更好的理解: int main {int arr[]={1,2,3,4,5,6,7};int k ...

  7. C++ 常用查找算法

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> using namespace ...

  8. 常用查找算法之B/B+树

    文章目录 前言 B- 树 查找 插入 删除 B+ 树 查找 范围查找 总结 参考资料 前言 从算法逻辑上讲二叉查找树的查找和插入操作效率都已经很高,但是在实际应用中由于我们不能将整个索引表加载到内存, ...

  9. 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍

    一.顺序查找  条件:无序或有序队列. 原理:按顺序比较每个元素,直到找到关键字为止. 时间复杂度:O(n) 二.二分查找(折半查找)  条件:有序数组 原理:查找过程从数组的中间元素开始,如果中间元 ...

最新文章

  1. 为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow?
  2. 浅谈数据库优化方案--表和SQL
  3. CSDN markdown中实现首行缩进(空格)的两种方法(“  ”)
  4. 落纱机器人_「聚焦」青岛艾菲特智能落纱机器人—智能制造,为您省工
  5. 某银行大型管理系统端到端持续集成和交付实践
  6. Linux网络-数据包的接收流程(基于RTL8139网卡驱动程序)
  7. matlab randi 函数,MATLAB中的randi函数
  8. 高学历就一定代表着高收入么?数据分析来为你揭晓
  9. 【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记(1)
  10. tomcat在conf/Catalina/localhost目录下配置项目路径
  11. GEE学习笔记3-导出table数据
  12. Linux学习笔记2 - 字符界面
  13. DOS命令与批处理学习历程
  14. Linux下手机驱动安装
  15. 安全加密 - DEP, ASLR
  16. CXK, 出来打球!
  17. 树莓派CM4封装AD底座使用分享
  18. 基于Android的期刊投稿网站的设计与开发
  19. aix服务器如何查看cpu信息,aix服务器查看cpu内存
  20. 【grammarly word插件安装】

热门文章

  1. 潇洒郎:Python 使用pyexejs运行js代码
  2. WebRTC 学习资源 电子书 WebRTC权威指南 Learning WebRTC
  3. 论如何在Windows上深度还原MacOS的体验,再推荐几个第三方软件
  4. DIv2 770 B. Fortune Telling
  5. 如何前端实现微信卡片分享
  6. Echarts设置背景的网格线为虚线
  7. EETI_eGTouch驱动移植及校准
  8. 微波技术基础实验二 功分器与定向耦合器设计
  9. 循环定时器HMI(宏指令)实现(附源代码)
  10. FMS/AMS5安装后的简单应用和配置注意事项