C++二分算法的应用:寻找峰值原理、源码及测试用例

简介: C++二分算法的应用:寻找峰值原理、源码及测试用例

说明

此文是课程https://edu.csdn.net/course/detail/38771 的讲义。

源码下载:https://download.csdn.net/download/he_zhidan/88458478

本文涉及的基础知识点

二分查找算法合集

题目

长度为n的数组nums,请返回任意一峰值的索引。符合以下条件之一i便是峰值的索引。

n等于1

i等于0

n>1

i等于0

nums[i] >nums[i+1]

n>1

i等于n-1

nums[i] > nums[i-1]

0<i<n-1

nums[i]>nums[i-1]

nums[i]>nums[i+1]

题目保证nums[i]不等于nums[i+1]。

2023年11月14整补

有读者反应看不懂,感谢他的建议,特增补如下。

定义

原始数组的连续区域称为子数组。如果一个子数组的首元素在原始数组的索引为i,尾元素在原始数组的索引为j,则用nums[i,j]表示此子数组,也可以用nums[i,j+1)表示。如果nums[i,j]同时符合以下两个条件,则是好子数组。

一,i为0或nums[i]>nums[i-1]。

二,j为n-1或nums[j]>nums[j+1]

推论

一,如果好子数组nums[i,j]的长度为1,则i就是峰值。

二,如果好子数组nums[i,j]的长度大于1,则从nums[i,j]找出一个比nums[i,j]短的好子数组nums[i1,j1]。

三,由于长度不断变短,长度一定会变为1。

举例

1 2

1 2 =>2 (1不是好子数组 2是,长度降为1结束)

2 1

2  1 =>2 (2是好子数组 ,1不是,长度降为1结束)

1 2 3

1 2 3 => 2 3(1不是好子数组,2 3是)=> 3(3是好数组长度降为1结束)

3 2 1

1 2 3 => 3

1 3 2

1 3 2 => 3 2 => 3

1到4

1 2 3 4 => 3 4 => 4

1 2 4 3 => 4 3 => 4

1 3 2 4=> 1 3 => 3

1 3 4 2 => 4 2 => 4

1 4 2 3=> 1 4=> 4

1 4 3 2=> 1 4=> 4

...

2 4 1 3 => 2 4 => 4

其它

1 2 3 4 5 6 7 8 => 5 6 7 8 => 7 8 => 8

9 8 7 6 5 4 3 2 1 => 9 8 7 6 => 9 8 = > 9

1 3 5 7 9 8 6 4 2 => 9 8 6 4 2 = > 9 8 => 9

总结

将好子数组nums[i,j] 分成左右两个子数组nums[i,mid)和nums[mid,j]

如果nums[mid]> nums[mid-1] 则nums[mid,j]是好子数组

否则 nums[i,mid)是好子数组

分析

假定

nums[left,r)符合nums[left]>nums[left-1],且nums[r-1]>nums[r]。显然初始情况nums[0,n)符合。

推论一:如果[left,r)的长度为1,则left就是返回的索引。

推论二:假定left < mid<r。如果mid[mid] > mid[mid-1],则nums[mid,r)也符合假定。如果mid[mid] < mid[mid-1],则nums[left,mid)也符合假定。

推论三:推论二也可以也可以理解成分别抛弃[left,mid)和[mid,r)。令mid = left+(r-left)/2,由于r-left>=2,所以left<mid<r。也就是抛弃的子数组不会为空。也就是数组不断变短。等长度为1结束。

时间复杂度

由于每次抛弃一半,所以需要抛弃logn次。故时间复杂度O(logn)

核心代码

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0, r = nums.size();
        while (r - left > 1)
        {
            const int mid = left + (r - left) / 2;
            if (nums[mid] > nums[mid - 1])
            {
                left = mid;
            }
            else
            {
                r = mid;
            }
        }
        return left;
    }
};

测试用例

int main()
{
    Solution slu;
    vector<int> nums = { 1,2,3,4 };
    int res = slu.findPeakElement(nums);
    assert(3 == res);
    nums = { 4,3,2,1 };
    res = slu.findPeakElement(nums);
    assert(0 == res);
    nums = { 2,5,3,1 };
     res = slu.findPeakElement(nums);
    assert(1 == res);
}

其它

学院课程

基础算法的C++实现课程,请点击下面的CSDN学院的链接。

2024年1月15之前完全免费,之后绝大部分免费

https://edu.csdn.net/course/detail/38771

C#入职培训

此课程的目的:让新同事更快完成从学生到C#程序员的转换,更快上手完成C#的开发工作。

https://edu.csdn.net/course/detail/38768

C++入职培训

让新同事更快完成从学生到C++程序员的转换,更快上手完成C++的开发工作。

https://edu.csdn.net/course/detail/32049

运行验证环境

Win10 VS2022 Ck++17 或win7 VS2019 C++17

每天都补充正能量

好好学习,天天向上。

事无终始,无务多业。

是故置本不安者,无务丰末。

相关下载

如果你时间宝贵,只想看精华,请到CSDN下载频道下载《闻缺陷则喜算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653


相关文章
|
4月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
99 2
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
2月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
64 0
|
4月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
131 17
|
3月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
79 0
|
5月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
110 4
|
24天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
25天前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真
本程序基于Matlab 2024b实现,结合粒子群优化(PSO)与XGBoost算法,用于时间序列预测。通过PSO优化XGBoost超参数,提升预测精度。程序包含完整注释与操作视频,运行后生成预测效果图及性能评估指标RMSE。
|
24天前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
105 3

热门文章

最新文章