C++ 补充之常用查找算法

简介: C++ 补充之常用查找算法

C++ 常用查找算法有哪些

当涉及查找算法时,C++中常用的查找算法大致可以分为两类:顺序查找和二分查找。让我逐一为您详细解释:

  1. 线性查找(Linear Search)
  • 概念:线性查找是最简单的一种查找算法,也称为顺序查找。它是通过顺序比较数据元素,逐个地检查目标值是否与当前元素相等,直到找到目标值或搜索完整个数组。
  • 原理:从数组的第一个元素开始,逐个与目标值比较,直到找到目标值或搜索完整个数组。
  1. 二分查找(Binary Search)
  • 概念:二分查找是一种高效的查找算法,前提是数组已排序。通过不断将搜索区间对半分割,缩小搜索范围直至找到目标值。
  • 原理:首先确定数组的中点,然后将目标值与中点值进行比较。如果目标值等于中点值,则找到;如果小于中点值,则在左半边继续查找;如果大于中点值,则在右半边继续查找。重复以上步骤直到找到目标值或确定目标值不存在。
  1. 插值查找(Interpolation Search)
  • 概念:插值查找是一种改进的二分查找算法,根据目标值在已排序数组中的大致位置进行估计,以减少查找次数。
  • 原理:根据目标值与首尾元素的关系,估计目标值在数组中的大致位置,然后通过区间划分类似于二分查找来寻找目标值。
  1. 斐波那契查找(Fibonacci Search)
  • 概念:斐波那契查找利用黄金分割比例进行查找,相对于二分查找,避免每次将数组对半分。
  • 原理:根据斐波那契数列产生的黄金分割点,确定搜索位置,然后继续类似二分查找的操作。
  1. 二叉搜索树(Binary Search Tree)
  • 概念:二叉搜索树是一种基于二叉树结构的查找算法,左子树的所有节点值均小于根节点值,右子树的所有节点值均大于根节点值。
  • 原理:根据当前节点值与目标值的大小关系,在左子树或右子树中递归查找目标值。
  1. 平衡二叉树(Balanced Binary Tree)
  • 概念:平衡二叉搜索树是一种特殊的二叉搜索树,保持树的平衡,如AVL树、红黑树等。
  • 原理:通过旋转操作保持树的平衡,以确保查找、插入和删除的平均时间复杂度为O(log n)。
  1. 哈希表(Hash Table)
  • 概念:哈希表利用哈希函数将关键字映射到表中的位置,实现高效的查找操作。
  • 原理:通过哈希函数计算关键字的哈希值,然后将其存储在哈希表中对应的位置。在查找时,通过哈希函数计算出目标值的位置,并在该位置进行查找。

以上是C++中常见的查找算法的详细概念和原理,每种算法有其适用场景和优劣势,根据具体情况选择合适的查找算法可以提高算法的效率。

下面要讲的和上面算法有一定的关系,可以理解为就是上边算法在方法中的应用。

常用查找算法-find if

在C++标准库中,有一个常用的查找算法叫做find_if,该算法用于在指定范围内查找满足指定条件的第一个元素。下面我会详细介绍一下find_if算法的概念和用法:

find_if算法

  • 概念find_if算法用于在指定范围内查找第一个满足特定条件的元素,它接受两个迭代器作为参数表示查找范围,并接受一个谓词(函数对象或lambda表达式)作为判断条件。
  • 原理find_if算法从指定范围的起始位置开始逐个检查元素,直到找到第一个使得条件函数返回true的元素或者遍历完整个范围。
  • 用法find_if函数的使用方式如下所示:
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
  • first:指向要搜索的范围的起始位置的迭代器
  • last:指向要搜索的范围的末尾之后位置的迭代器
  • p:用于判断条件的函数对象或lambda表达式
  • 示例:假设有一个存储整数的容器vector<int> vec,我们想查找第一个大于10的元素,可以使用find_if算法:
auto it = std::find_if(vec.begin(), vec.end(), [](int x){ 
    return x > 10; 
});
if (it != vec.end()) {
    std::cout << "找到第一个大于10的元素:" << *it << std::endl;
} else {
    std::cout << "未找到满足条件的元素" << std::endl;
}

通过find_if算法,可以方便地在容器或数组等序列容器中查找满足特定条件的第一个元素,具有很好的灵活性和可扩展性。

常用查找算法-adjacent find

std::adjacent_find 是 C++ 标准库中的一个常用查找算法,用于在指定范围内查找相邻重复元素的第一个位置。下面我将详细介绍 std::adjacent_find 算法的概念和用法:

adjacent_find算法

  • 概念std::adjacent_find 用于在指定范围内查找第一对相邻重复的元素,即两个相邻且相等的元素。该算法接受两个迭代器表示查找范围。
  • 原理std::adjacent_find 会从指定范围的起始位置开始逐对检查元素,直到找到第一对相邻重复的元素或者遍历完整个范围。
  • 用法std::adjacent_find函数的使用方式如下所示:
template<class ForwardIt>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last);
  • first:指向要搜索的范围的起始位置的迭代器
  • last:指向要搜索的范围的末尾之后位置的迭代器
  • 示例:假设有一个存储整数的容器std::vector<int> vec,我们想查找第一对相邻重复的元素,可以使用std::adjacent_find算法:
auto it = std::adjacent_find(vec.begin(), vec.end());
if (it != vec.end()) {
    std::cout << "找到第一对相邻重复的元素:" << *it << std::endl;
} else {
    std::cout << "未找到相邻重复元素" << std::endl;
}

通过 std::adjacent_find 算法,可以快速找到指定范围内第一对相邻重复的元素,并进行相应的处理。这个算法在某些情况下非常实用,帮助我们高效地处理数据中的重复情况。

常用查找算法-binary search

std::binary_search 是 C++ 标准库中的一个常用的查找算法,用于在已经排序好的序列(如数组或容器)中进行二分查找。下面我将详细介绍 std::binary_search 算法的概念和用法:

binary_search算法

  • 概念std::binary_search 用于在已排序的序列中进行二分查找,判断某个值是否存在于序列中。该算法接受两个迭代器表示排序好的序列和要查找的值。
  • 注意:在应用 std::binary_search 前,需要确保序列是按照升序排列的,否则结果会不准确。
  • 用法std::binary_search函数的使用方式如下所示:
template< class ForwardIt, class T >
bool binary_search( ForwardIt first, ForwardIt last, const T& value );
  • first:指向排序好的序列的起始位置的迭代器
  • last:指向排序好的序列的末尾位置的下一个迭代器
  • value:要查找的值
  • 示例:假设有一个按升序排列的整数数组int arr[] = {1, 3, 5, 7, 9};,我们想要查找是否存在值为5的元素,可以使用std::binary_search算法:
int key = 5;
if (std::binary_search(arr, arr + 5, key)) {
    std::cout << "值为" << key << "的元素在数组中找到了" << std::endl;
} else {
    std::cout << "值为" << key << "的元素在数组中未找到" << std::endl;
}

通过 std::binary_search 算法,可以高效地在已排序的序列中进行查找操作,如果找到了指定的值,则返回true,否则返回false。这个算法利用二分查找的思想,具有较高的查找效率。

常用查找算法-count

std::count 是 C++ 标准库中的一个常用查找算法,用于计算指定范围内等于给定值的元素数量。下面我将详细介绍 std::count 算法的概念和用法:

count算法

  • 概念std::count 用于在指定范围内计算等于给定值的元素的数量。该算法接受两个迭代器表示搜索范围,并接受一个要计数的值。
  • 用法std::count函数的使用方式如下所示:
template< class InputIt, class T >
typename iterator_traits<InputIt>::difference_type count( InputIt first, InputIt last, const T& value );
  • first:指向要搜索的范围的起始位置的迭代器
  • last:指向要搜索的范围的末尾位置的下一个迭代器
  • value:要计数的值
  • 示例:假设有一个存储整数的容器std::vector<int> vec {1, 2, 3, 4, 5, 3, 3, 6};,我们想计算值为3的元素的数量,可以使用std::count算法:
int count = std::count(vec.begin(), vec.end(), 3);
std::cout << "值为3的元素数量为:" << count << std::endl;

通过 std::count 算法,可以方便地计算指定范围内等于给定值的元素的数量。

常用查找算法-count if

std::count_if 是 C++ 标准库中的一个常用的查找算法,用于计算满足指定条件的元素数量。下面是关于 std::count_if 算法的详细介绍:

count_if算法

  • 概念std::count_if 用于在指定范围内计算满足给定条件的元素数量。该算法接受两个迭代器表示搜索范围,并接受一个谓词(predicate)函数来判断元素是否满足条件。
  • 用法std::count_if函数的使用方式如下所示:
template< class InputIt, class UnaryPredicate >
typename iterator_traits<InputIt>::difference_type count_if( InputIt first, InputIt last, UnaryPredicate p );
  • first:指向要搜索的范围的起始位置的迭代器
  • last:指向要搜索的范围的末尾位置的下一个迭代器
  • p:谓词函数,用于定义判断条件的函数对象
  • 示例:假设有一个存储整数的容器std::vector<int> vec {1, 2, 3, 4, 5, 3, 3, 6};,我们想计算大于等于3的元素的数量,可以使用std::count_if算法:
int count = std::count_if(vec.begin(), vec.end(), [](int num){ return num >= 3; });
std::cout << "大于等于3的元素数量为:" << count << std::endl;

通过这段代码,我们利用 lambda 表达式作为谓词来判断元素是否大于等于 3,然后使用 std::count_if 算法来计算满足条件的元素数量。这就是 std::count_if 算法的基本用法,对于复杂的条件判断,可以编写相应的谓词函数来传递给 count_if 算法。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

感谢大家,我一直在努力…

相关文章
|
1天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
22 12
|
1天前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
27 15
|
1月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
52 19
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
51 2
|
1月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
65 4
|
4月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
90 0
|
4月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
4月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)