局部最小值和对数器

简介: 局部最小值和对数器

承接上文 插入排序和二分法


局部最小值问题


在数组中 无序 任何2个相邻的数不相等
局部最小定义
如果0位置上的数小于1位置上的数 那么0位置就是局部最小的位置
如果N-1位置上的数 小于 N-2位置上的数
那么N-1就是局部最小位置
如果中间位置i即比左边i-1位置小同时也比i+1位置小
那么i位置就是局部最小
i位置必须同时小于左边和右边的数 才叫局部最小
在这样一个数组中 找出一个局部最小即可
能不能求的过程 时间复杂度好于O(N)
最好二分 ?

解题

先看0位置是不是局部最小
如果0位置是局部最小 就直接返回了
如果0位置不是局部最小
那就是比1位置大
那么在0~1之间是向下的趋势

image.png

在看下N-1位置
如果N-1位置是局部最小
如果N-1位置是局部最小 就直接返回了
如果不是 则在N-2 ~ N-1 这个范围上是向下的趋势

image.png

0位置到N-1位置必存在局部最小
因为相邻两个数不相等就一定存在整个数组上值的变化波动曲线
直接取中点位置M

image.png

如果M位置上的数比M-1位置上的数要小
比M+1位置上的数还要小
这个M就是局部最小值
如果M比M-1位置上的数要大

image.png

那么在M-1 ~ M之间是向下的趋势
那么0-M范围必存在局部最小

image.png

什么时候适合二分

日常定出一个流程
优化方向就2个方向
1)数据状况
2)问题标准(这个题是局部最小标准)
这个题是2个结合起来
这种数据状况下求解这个问题就存在二分策略
当构建一个排他性的问题
比如左边有 右边没有 就可以使用二分了


对数器


有一个想要测的方法a
同一个问题可能有很多中策略来实现
如果不管时间复杂度好坏的话
可以写出一个暴力尝试的写法(一个题把所有的排列组合都弄一遍)
但做题的时候有时间限制可能一些方法不过
把这样的不追求时间复杂度优劣
但很好想 很好写的方法叫方法b
比如刚才那个二分的问题 
可以用二分的方法找局部最小
也可以用遍历的方式找局部最小
通过线上oj(测试平台)方法进行测试
可能存在没有oj或者测试用例不全(可能存在 没有代码跑出错 也测试通过的情况)
即想测的方法a即使通过了线上oj也不能保证一定正确
这就有了对数器的方法 这是万无一失的方法
生成一个随机样本发生器
可以产生随机样本
在方法a跑一遍 得到结果a
在方法b跑一遍 得到结果b
比如测试几千万次
当发现两个结果不一样 
要么方法a错了
要么方法b错了
要么两个方法都错
给一个小样本 比如长度为5的数组
通过人看的方式看看方法a结果和方法b的结果
就可以知道方法a、方法b是否对错
用人工干预的方式把方法a和方法b都修改对
然后把随机样本产生数的长度设置大些,值也更随机些
跑个几千万次 就可以确定方法a对了
这个就比线上oj平台更加可靠了

准备一个方法b

image.png

测试50万次
每一次都会生成一个随机数组(长度也随机、值也随机)

image.png

Math.random() 表示在[0,1)所有小数 等概率返回一个
这个在数学上是做不到的
在计算机是可以的 因为0-1范围的所有小数在计算机是有穷尽的
精度更好的小数认为不存在了
Math.random() * N  返回[0,N)上的所有小数 等概率返回一个
(int)(Math.random() * N) 转换成整数 就会在[0,N-1]所有整数
等概率返回一个
利用这个机制实现数组长度的随机 对应上图中的第一行代码
for循环里面是2个随机数相减得到的结果也是随机的

继续分析主方法

每一次都会生成一个随机数组
范围是0~100
值范围是-100~100
得到arr1
然后把arr1拷贝出来一份arr2
让想测的方法a去排序arr1
再用对数器方法(方法b)去排序arr2
isEqual方法表示是否每个位置上的值都一样
一样 true,不一样false
如果有不一样的
则随机范围调小一点
人工干预的方式看看2个排序方法哪个排错了
然后去调试
再跑对数器 直接每一次结果都一样
这种方法需要写2个方法(两套独立思路写出来的东西) 但非常稳 不依赖线上测试平台
相关文章
Echarts实战案例代码(26):折线图组件连接空数据connectNulls的用法
Echarts实战案例代码(26):折线图组件连接空数据connectNulls的用法
1372 0
|
12月前
|
消息中间件 人工智能 分布式计算
多智能体系统设计:协作、竞争与涌现行为
作为一名长期专注于分布式系统和人工智能领域的技术博主,我深深被多智能体系统(Multi-Agent Systems, MAS)的复杂性和优雅性所吸引。在过去几年的研究和实践中,我见证了多智能体系统从理论概念逐步走向实际应用的转变过程。多智能体系统不仅仅是简单的分布式计算模型,它更像是一个微观社会,其中每个智能体都具有自主性、反应性和社会性。这些智能体通过复杂的交互模式,展现出了令人惊叹的集体智能现象。从最初的简单协作模式,到复杂的竞争博弈,再到最终涌现出的群体智慧,多智能体系统为我们提供了一个全新的视角来理解和设计复杂系统。在本文中,我将从架构设计原则出发,深入探讨通信协议的设计要点,分析冲突
1306 0
多智能体系统设计:协作、竞争与涌现行为
|
人工智能 运维 分布式计算
35+姐姐的大数据专业逆袭指南:7张证书助你弯道超车
善用经验杠杆: 面试时强调证书代表的新技能 + 多年积累的行业洞察、业务理解、沟通协调能力,这是新人无法比拟的复合优势。 链接人脉: 加入考证学习群、参加线下沙龙,结识同行伙伴,信息互通,机会共享。
|
安全 网络协议 数据建模
免费SSL证书最新申请全攻略
SSL证书分为三种类型:DV(域名验证型)适用于个人博客等,验证简单;OV(组织验证型)适用于电商、金融网站,需验证企业信息;EV(扩展验证型)提供更高信任级别。申请渠道有JoySSL(免费一年单域名证书)、Let's Encrypt(公共免费项目)和阿里云(免费DV证书,但有限制)。以JoySSL为例,申请流程包括注册账号、选择证书、填写信息、验证域名所有权、下载与安装。注意事项包括留意有效期、确保兼容性和使用最新版本证书,以保障网站安全。
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
1063 5
|
XML 数据可视化 Java
文本对比工具,绕不开这个6款!
文本对比工具,绕不开这个6款!
2684 0
办公软件学习笔记---ppt的制作
办公软件学习笔记---ppt的制作
532 1
办公软件学习笔记---ppt的制作
|
人工智能 搜索推荐 开发者
社区供稿 | 大模型恋爱神器!16种MBTI自由定制,北大ChatLaw团队出品
北大团队新作,让大模型拥有个性!而且还是自定义那种,16种MBTI都能选。
|
测试技术 数据安全/隐私保护 Windows
Windows使用cmd命令创建用户
Windows使用cmd命令创建用户
|
设计模式 JSON 数据建模
知识图谱模式设计模式与原则
知识图谱是一种非常强大的表示工具,它可以通过一张图表达复杂的概念,这就是为什么常说“一图胜千言”。但是,如果我们在没有明确定义的模式下创建知识图谱,就会存在一些问题。这就是为什么需要一种模式来限制链接的类型,充当文档,提供和机器可读的语义,并确保软件按照预期的方式来组织信息。 对于知识图谱而言,良好的模式设计比关系数据库更为重要和核心。不幸的是,对于如何完成相对简单的任务而言,目前缺乏详细的指导。根据我的经验,我想至少提供一些帮助。
582 0