【C++】数据结构与算法:常用查找算法

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍常用查找算法。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 算法介绍
    • :blush:2. C++实现

😏1. 算法介绍

查找算法的作用是在给定的数据集合中搜索目标元素或确定目标元素是否存在。它可以帮助我们快速地找到所需的数据,提供有效的数据访问和处理方式。

常用的查找算法有以下几种:

  1. 线性查找:也称为顺序查找,是最简单直接的查找算法。它从数据结构的起始位置开始,逐个比较元素,直到找到目标元素或遍历完整个数据结构。时间复杂度为O(n),其中n是数据结构中元素的个数。

  2. 二分查找:适用于已排序的数据结构(如有序数组)。它将目标元素与中间元素进行比较,根据比较结果确定目标元素在左半部分还是右半部分,并继续在该部分进行查找。通过每次排除一半的元素,二分查找能够快速定位目标元素。时间复杂度为O(log n)。

  3. 哈希表查找:利用哈希表数据结构实现的查找算法。哈希表根据关键字的哈希值存储元素,并提供快速的查找操作。通过将关键字映射到哈希表的索引位置,可以在常数时间内(平均情况下)找到目标元素。哈希表查找的平均时间复杂度是O(1),但在最坏情况下可能达到O(n)。

  4. 二叉搜索树查找:利用二叉搜索树数据结构实现的查找算法。二叉搜索树是一颗有序二叉树,对于树中的每个节点,左子树中的所有节点的值小于当前节点的值,右子树中的所有节点的值大于当前节点的值。通过比较目标值与当前节点的值,可以决定继续在左子树还是右子树中进行查找。二叉搜索树查找的平均时间复杂度为O(log n),但在最坏情况下可能达到O(n)。

  5. 平衡二叉搜索树查找:为了解决二叉搜索树在某些情况下退化成链表的问题,引入了平衡二叉搜索树(如AVL树、红黑树)。这些树通过自平衡机制保持树的平衡性,从而保证查找操作的平均时间复杂度为O(log n)。

  6. 插值查找:是二分查找的变体,用于在有序数组中进行查找。它不像二分查找每次都将查找范围一分为二,而是根据目标值与数组元素的分布情况,在靠近目标值的位置更有可能找到目标元素。最好情况下的时间复杂度为O(1),最坏情况下为O(n),平均情况下为O(log log n)。

😊2. C++实现

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>// 线性查找
int linearSearch(const std::vector<int>& arr, int target) {for (int i = 0; i < arr.size(); i++) {if (arr[i] == target) {return i;}}return -1;  // 没有找到目标元素
}// 二分查找(针对已排序数组)
int binarySearch(const std::vector<int>& arr, int target) {int left = 0;int right = arr.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;  // 没有找到目标元素
}// 哈希表查找
int hashTableSearch(const std::unordered_map<int, int>& table, int target) {auto it = table.find(target);if (it != table.end()) {return it->second;}return -1;  // 没有找到目标元素
}int main() {std::vector<int> arr = {10, 25, 4, 15, 8, 36};// 线性查找int target1 = 15;int index1 = linearSearch(arr, target1);if (index1 != -1) {std::cout << "线性查找:" << target1 << " 的索引为 " << index1 << std::endl;} else {std::cout << "线性查找:没有找到 " << target1 << std::endl;}// 二分查找前需要将数组排序std::sort(arr.begin(), arr.end());// 二分查找int target2 = 25;int index2 = binarySearch(arr, target2);if (index2 != -1) {std::cout << "二分查找:" << target2 << " 的索引为 " << index2 << std::endl;} else {std::cout << "二分查找:没有找到 " << target2 << std::endl;}// 哈希表查找std::unordered_map<int, int> table;for (int i = 0; i < arr.size(); i++) {table[arr[i]] = i;}int target3 = 8;int index3 = hashTableSearch(table, target3);if (index3 != -1) {std::cout << "哈希表查找:" << target3 << " 的索引为 " << index3 << std::endl;} else {std::cout << "哈希表查找:没有找到 " << target3 << std::endl;}return 0;
}

编译运行:

g++ -o main main.cpp && ./main
线性查找:15 的索引为 3
二分查找:25 的索引为 4
哈希表查找:8 的索引为 1

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/54080.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】DNS、ICMP、NAT

目录 一、DNS(Domain Name System) 1、DNS背景 2、域名简介 二、ICMP协议 1、ICMP功能 2、ICMP的报文格式 3、ping命令 4、traceroute命令 三、NAT技术 1、NAT技术背景 2、NAT IP转换过程 3、NAPT 4、NAT技术的缺陷 5、NAT和代理服务器 一、DNS(Domain Name Syste…

Visual Studio在Debug模式下,MFC工程中包含Eigen库时的定义冲突的问题

Visual Studio在Debug模式下&#xff0c;MFC工程中包含Eigen库时的定义冲突的问题 报错信息 Eigen\src\Core\PlainObjectBase.h(143,5): error C2061: 语法错误: 标识符“THIS_FILE” Eigen\src\Core\PlainObjectBase.h(143,1): error C2333: “Eigen::PlainObjectBase::opera…

python+django+mysql项目实践二(前端及数据库)

python项目实践 环境说明&#xff1a; Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 前端模板 添加模板 在templates下创建 views文件中添加 创建数据库 连接数据库 在setting文件中进行配置 创建表

MyBatis查询数据库(4)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 终于到了MyBatis最后一篇&#xff0c;这篇讲的是动态SQL的使用。 复杂情…

无涯教程-Perl - 环境配置

在开始编写Perl程序之前&#xff0c;让我们了解如何设置我们的Perl环境。 您的系统更有可能安装了perl。只需尝试在$提示符下给出以下命令- $perl -v 如果您的计算机上安装了perl&#xff0c;那么您将收到以下消息: This is perl 5, version 16, subversion 2 (v5.16.2) b…

ES6 数组的用法

1. forEach() 用来循环遍历的 for 数组名.forEach(function (item,index,arr) {})item:数组每一项 , index : 数组索引 , arr:原数组作用: 用来遍历数组 let arr [1, 2, 3, 4]; console.log(arr); let arr1 arr.forEach((item, index, arr) > {console.log(item, index…

推荐几款主流的Css Reset

CSS Reset CSS Reset&#xff08;CSS重置&#xff09;是一种技术&#xff0c;用于消除不同浏览器之间默认样式的差异&#xff0c;以确保网页在各个浏览器中的显示一致性。由于不同浏览器对元素的默认样式有所不同&#xff0c;使用CSS Reset可以将这些默认样式归零或统一&#x…

阿里云安全组设置

简介​ 云主机安全组必须打开如下端口&#xff1a; ssh&#xff1a;22http&#xff1a;80https&#xff1a;443ftp&#xff1a;21、20000&#xff5e;30000 阿里云安全组端口开放教程​ 腾讯云安全组端口开放教程​ 华为云安全组端口开放教程​

第四次作业

1. 简述静态网页和动态网页的区别。 静态页面&#xff1a;请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面。在网站设计中&#xff0c;纯粹HTML格式的网页&#xff08;可以包含图片、视频JS (前端功能实现&#xff09;、CSS (…

认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)

前言 本篇介绍了什么是MyBatis&#xff0c;MyBatis的前期配置&#xff0c;MyBatis操作数据库的两种方式&#xff1a;.xml文件 / 注释&#xff0c;使用MyBatis的一些注意&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#x…

idea 2023 新版ui中git的相关操作

前两个月换了新电脑&#xff0c;下了最新版的idea发现可以切换一套新的ui了 切换新ui肯定不太习惯&#xff0c;很多操作都得重新摸索一下 在这里记录几个git相关的操作 忽略我下面截图中当前项目是js的后端项目…… 切换ui 首先说一下怎么切换新旧版ui&#xff0c;我这里就…

求解n阶勒让德多项式的值

描述 用递归方法求n阶勒让德多项式的值&#xff0c;递归公式为&#xff1a; 在主函数中输入一个整数n和一个实数x&#xff0c;调用函数 legendre(n,x)&#xff0c;并输出其返回值。 输入 第一行输入一个整数n&#xff0c;表示阶数&#xff1b;第二行输入一个实数x。 输出 …