三分搜索峰值

问题

现在有一个数组,显示递增,后是递减,如何找到它的峰值?

思路

可以利用分治的思想,向二分查找一样,每次将要查询的区域分成若干个区域,根据区域的特殊点的值淘汰一些区域,缩小搜索范围,当搜索范围很小时,进行几次比较即可。

那么这个区域怎么分,还有就是怎么淘汰呢?

我们可以考虑将区间[l,r]三等分分为三个区域,[l,mid1]、[mid1,mid2]、[mid2,r]三个区域(暂时不考虑区域重合的问题)。那么mid1,mid2的分布只有四种情况。

1、mid1,mid2都在极值的左边。

2、mid1,mid2都在极值的右边。

3、mid1在左,mid2在右,mid1处的值 > mid2处的值。

4、mid1在左,mid2在右,mid1处的值 <= mid2处的值。

可以用下面这张图概括。

这样我们不断的缩小区间,当区间只有三个或两个点时,比较一下这几个点的值即可。 

查找函数

int three_search(int l, int r,int* a)
{
    int result = -1;
    int maxn = -1;
    //不方便分成三个部分的特殊情况
    if (l + 2 >= r) {
        for(int i=l;i<=r;i++)
            if (a[i] > maxn) {
                maxn = a[i];
                result = i;
            }
        return result;
    }

    while (l + 2 < r) {
        int dis = (r - l) / 3;
        int mid1=l+dis,mid2=r-dis;
        if (a[mid1] > a[mid2]) {
            r = mid2;
        }
        else {
            l = mid1;
        }
    }
    result=a[l]>a[r]?l:r;
    result=a[result]>a[(l+r)>>1]?result:(l+r)>>1;
    return result;
}

代码

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=100005;
int a[N];
int n,m;
//随机生成一个递增后又递减的数组
void init_array()
{
    srand(time(0));
    n = rand() % 10000 + 5;
    a[0] = rand() % 10;
    int pos = rand() % (n - 1);
    cout << "n==" << n << ",pos==" << pos << endl;
    for (int i = 1; i <= pos; i++) {
        a[i] = a[i - 1] + rand() % 10;
    }
    for (int i = pos + 1; i < n; i++) {
        a[i] = a[i - 1] - rand() % 10;
    }
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
        if (i % 10 == 9) cout << endl;
    }
    cout << endl;
}
//手动输入一个递增后又递减的数组
void init()
{
    cout << "输入一个递增后又递减的数组。\n";
    cout << "数组长度:";
    cin >> n;
    cout << "各项值:";
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
}
//三分搜索
int three_search(int l, int r,int* a)
{
    int result = -1;
    int maxn = -1;
    //不方便分成三个部分的特殊情况
    if (l + 2 >= r) {
        for(int i=l;i<=r;i++)
            if (a[i] > maxn) {
                maxn = a[i];
                result = i;
            }
        return result;
    }

    while (l + 2 < r) {
        int dis = (r - l) / 3;
        int mid1=l+dis,mid2=r-dis;
        if (a[mid1] > a[mid2]) {
            r = mid2;
        }
        else {
            l = mid1;
        }
    }
    result=a[l]>a[r]?l:r;
    result=a[result]>a[(l+r)>>1]?result:(l+r)>>1;
    return result;
}
int main()
{
    init_array();
    int index = three_search(0, n - 1, a);
    cout << "最大值索引:" << index << endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的Selenium详细教程

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…

硬件产品经理

边端协调管理平台 主页一&#xff1a;模型管理1.1 边侧模型管理 二&#xff1a;配置管理2.1 终端软件配置管理 三&#xff1a;设备管理3.1 区域位置管理3.2 工控机管理&#xff08;其实就是围绕授权&#xff09;3.3 生产设备管理3.4 设备运行管理 四&#xff1a;数据服务4.1 实…

ISP:企业数字化发展的关键推动力

在当今信息化时代&#xff0c;互联网已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于很多人来说&#xff0c;ISP这一概念仍显得有些陌生。ISP&#xff0c;即互联网服务提供商&#xff08;Internet Service Provider&#xff09;&#xff0c;是为用户提供互联网接…

【课程总结】Day6(上):机器学习项目实战--外卖点评情感分析预测

机器学习项目实战&#xff1a;外卖点评情感分析预测 项目目的 基于中文外卖评论数据集&#xff0c;通过机器学习算法&#xff0c;对评论内容进行情感预测。 数据集 地址&#xff1a;http://idatascience.cn/dataset-detail?table_id429数据集字段 字段名称字段类型字段说…

package.json中resolutions的使用场景

文章目录 用途配置示例使用方法注意事项和peerDependencies有什么不同peerDependenciesresolutions 总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的…

谈AI 时代网站的未来趋势

以大语言模型为代表的AI 技术迅速发展&#xff0c;将会影响原有信息网络的方式。其中一个明显的趋势是通过chatGPT 对话代替搜索引擎和浏览器来获取信息。 互联网时代&#xff0c;主要是通过网站&#xff08;website&#xff09;提供信息。网站主要为人类阅读的方式构建的。主要…

阿里 Qwen2 模型开源,教你如何将 Qwen2 扩展到百万级上下文

本次开源的 Qwen2 模型包括 5 个尺寸&#xff0c;分别是 0.5B、1.5B、7B、72B、57B&#xff0c;其中 57B 的属于 MoE 模型&#xff08;激活参数 14B&#xff09;&#xff0c;其余为 Dense 模型&#xff0c;本篇文章会快速介绍下各个尺寸模型的情况&#xff0c;然后重点介绍下如…

西门子PLC学习之数据块的单个实例,多重实例与参数实例间的区别

首先介绍下函数&#xff0c;函数块与数据块这三个概念。 数据块 数据块里可以存储各种类型的参数。有人可能会问&#xff0c;m寄存器不是可以存储布尔值&#xff0c;8位&#xff0c;16位&#xff0c;32位变量吗&#xff0c;为什么要多此一举&#xff1f;因为虽然m寄存器能存储以…

LAMPSECURITY: CTF4 靶机实战

信息收集&#xff1a; 存活扫描&#xff1a; 端口扫描&#xff1a; 服务扫描&#xff1a; web页面&#xff1a; blog页面发现注入点&#xff1a; sql注入&#xff1a; sqlmap一把梭&#xff1a; 多个参数记得打&#xff1a; 哦 ssh登录&#xff1a; 老版本的ssh&#xff0c;…

重回1990短视频全集:成都鼎茂宏升文化传媒公司

重回1990短视频全集&#xff1a;时光之旅的温情回顾 在数字技术的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为我们记录生活、分享故事的新方式。而当我们回望过去&#xff0c;那些充满怀旧情怀的年份总是让人心生感慨。今天&#xff0c;就让我们一起踏上…

Oracle EBS AP发票创建会计科目提示:APP-SQLAP-10710:无法联机创建会计分录

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 提交“创建会计科目”请求提示错误信息如下: APP-SQLAP-10710:无法联机创建会计分录。 请提交应付款管理系统会计流程,而不要为此事务处理创建会计分录解决方法 数据修复SQL脚本: UPDATE ap_invoi…

Linux 36.3 + JetPack v6.0@jetson-inference之图像分类

Linux 36.3 JetPack v6.0jetson-inference之图像分类 1. 源由2. imagenet2.1 命令选项2.2 下载模型2.3 操作示例2.3.1 单张照片2.3.2 视频 3. 代码3.1 Python3.2 C 4. 参考资料5. 补充5.1 第一次运行模型本地适应初始化5.2 samba软连接 1. 源由 从应用角度来说&#xff0c;图…

使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

windows任意窗口置顶/前台显示/不被最小化或遮挡

问题&#xff1a;在办公时&#xff0c;当同时需要打开好几个重要的窗口&#xff0c;比如需要对若干个文件夹里的文件进行操作&#xff0c;几个窗口都需要一直在桌面前台显示&#xff0c;但这样的话容易在打开其他页面或是切其他窗口的时候被遮挡&#xff0c;因此考虑如何让几个…

Java学习笔记(六):Array List、学生管理系统、学生管理系统升级版

目录 一、ArrayList 1.1集合和数组的优势对比&#xff1a; 1.2 ArrayList类概述 1.3 ArrayList类常用方法 1.3.1 构造方法 1.3.2 成员方法 1.4 ArrayList存储字符串并遍历 1.5 ArrayList存储学生对象并遍历 1.6 查找用户的索引 1.7 添加手机对象并返回要求的数据 二…

想要提升地推效果吗?试试Xinstall数据查看功能,让您事半功倍!

在如今竞争激烈的移动互联网时代&#xff0c;地推作为一种直接有效的推广方式&#xff0c;受到了越来越多企业和品牌的青睐。然而&#xff0c;地推过程中产生的数据如何高效地收集、整理和分析&#xff0c;成为了摆在推广者面前的一大难题。Xinstall作为一款专业的App推广工具&…

开发人员必备的常用工具合集-lombok

Project Lombok 是一个 java 库&#xff0c;它会自动插入您的编辑器和构建工具&#xff0c;为您的 Java 增添趣味。 再也不用编写另一个 getter 或 equals 方法了&#xff0c;只需一个注释&#xff0c;您的类就拥有了一个功能齐全的构建器&#xff0c;自动化了您的日志记录变量…

CSS基础知识汇总

目录 CSS 基础知识1. CSS 的基本结构2. 选择器3. 常用 CSS 属性4. CSS 单位5. CSS 盒模型 总结 学习 CSS&#xff08;Cascading Style Sheets&#xff09;是前端开发的重要部分&#xff0c;它用于控制网页的样式和布局。以下是学习 CSS 过程中需要掌握的基本概念、符号和对应的…

Alsa UCM

Alsa Use Case Manager&#xff08;用例管理器&#xff09;描述如何为某些用例&#xff08;如 “播放音频”、“通话”&#xff09;设置 mixer 混频器。它还描述如何修改 mixer 混频器状态以将音频路由到某些输出和输入&#xff0c;以及如何控制这些设备。 这基本上涵盖了 Pul…

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST&#xff0c;所以在安装chatglm2之前&#xff0c;先安装RUST。 此系列文章列表&#xff1a; 【AI基础】第一步&#xff1a;安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步&#xff1a;安装python开发环境-conda篇_mini…