当前位置: 首页 > news >正文

双指针扫描使用简述

概述

业务中有时会遇到一些稍复杂的校验;
比如比较2个对象数组之间对象的时间属性是否有重叠;
简单操作的话直接嵌套冒泡(O(n^2))就完事了;
但其实可以更优,使用双指针扫描比较,这样时间复杂度仅为O(n)

嵌套冒泡就不上demo了,两个for的事情

上demo

这里的场景是比较2个对象数组之间对象的时间属性的时间区间是否有重叠;

附上手写分析

在这里插入图片描述

   Map<String, List<AsBusinessSuspension>> dataMap = dataList.stream().collect(Collectors.groupingBy(AsBusinessSuspension::getBusinessType));Set<String> businessTypeSet = dataMap.keySet();if(//同时存在库存停用和库存更新!businessTypeSet.contains(AsBusinessSuspensionConstant.INV_UPDATE_STOP)|| !businessTypeSet.contains(AsBusinessSuspensionConstant.INV_UPDATE_ZERO)) return;List<AsBusinessSuspension> updateStopList = dataMap.get(AsBusinessSuspensionConstant.INV_UPDATE_STOP);List<AsBusinessSuspension> updateZeroList = dataMap.get(AsBusinessSuspensionConstant.INV_UPDATE_ZERO);//先按开始时间排序CollectionUtil.sort(updateStopList, Comparator.comparing(AsBusinessSuspension::getBusinessStartTime));CollectionUtil.sort(updateZeroList, Comparator.comparing(AsBusinessSuspension::getBusinessStartTime));int updateStopSize = updateStopList.size();int updateZeroSize = updateZeroList.size();int updateStopIndex = 0;int updateZeroIndex = 0;//双向扫描while (updateStopIndex < updateStopSize && updateZeroIndex < updateZeroSize) {AsBusinessSuspension updateStop = updateStopList.get(updateStopIndex);AsBusinessSuspension updateZero = updateZeroList.get(updateZeroIndex);// stop在zero之前,无交叉,则updateStopIndex指针右移,扫描下一个updateStop元素if (DateUtil.compare(updateStop.getBusinessEndTime(), updateZero.getBusinessStartTime()) <= 0) {updateStopIndex ++;continue;}// zero在stop之前,无交叉,则updateZeroIndex指针右移,扫描下一个updateZero元素if (DateUtil.compare(updateZero.getBusinessEndTime(), updateStop.getBusinessStartTime()) <= 0) {updateZeroIndex ++;continue;}throw new ServiceException(MessageFormat.format("【{0}时间区间{1}】与【{2}时间区间{3}】有重叠",AsBusinessSuspensionConstant.getBusinessTypeDes(updateStop.getBusinessType()),String.join(StrPool.DASHED,DateUtil.format(updateStop.getBusinessStartTime(), DatePattern.NORM_DATETIME_PATTERN),DateUtil.format(updateStop.getBusinessEndTime(), DatePattern.NORM_DATETIME_PATTERN)),AsBusinessSuspensionConstant.getBusinessTypeDes(updateZero.getBusinessType()),String.join(StrPool.DASHED,DateUtil.format(updateZero.getBusinessStartTime(), DatePattern.NORM_DATETIME_PATTERN),DateUtil.format(updateZero.getBusinessEndTime(), DatePattern.NORM_DATETIME_PATTERN))));}
http://www.xdnf.cn/news/1455283.html

相关文章:

  • 【AI论文】面向大语言模型(LLMs)的具身强化学习全景图:一项调研综述
  • 新闻稿的发布平台有哪些?选对渠道让发稿效果事半功倍!
  • 移远EC200A OpenCPU笔记
  • 一文吃透同态滤波算法!从原理到 MATLAB 实战,小白也能懂
  • 解析PE文件的导入表和导出表
  • 准确率可达99%!注意力机制+UNet,A会轻松收割!
  • 20250904的学习笔记
  • HTML + CSS 创建图片倒影的 5 种方法
  • 大数据毕业设计选题推荐-基于大数据的儿童出生体重和妊娠期数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 加密货币武器化:恶意npm包利用以太坊智能合约实现隐蔽通信
  • 性能堪比claude sonnet4,免费无限使用!claude code+魔搭GLM4.5在ubuntu上安装完整流程
  • Cadence OrCAD Capture绘制复用管脚封装的方法图文教程
  • 蔚来8月狂卖3.1万辆,反超理想引热议!
  • C++ opencv+gstreamer编译,C++ opencv4.5.5+gstreamer1.0 -1.24.12 编译 ,cmake 4.0.0
  • OpenCV: Mat存储方式全解析-单通道、多通道内存布局详解
  • 0904网络设备配置与管理第二次授课讲义
  • 如何用仓库路线完成一个音视频实战项目:FFmpeg + SDL 简易播放器
  • 把开发环境丢云上,我的电脑风扇再也没转过!
  • 【EasyExcel】Excel工具类2.0
  • C++ STL 中 `std::list` 双向链表容器的几个关键成员函数:`empty()`、`front()` 和 `pop_front()`
  • 【机器学习】HanLP+Weka+Java算法模型
  • 指针高级(3)
  • Redlock:为什么你的 Redis 分布式锁需要不止一个节点?
  • ​浏览器存储
  • 设计模式:中介者模式(Mediator Pattern)
  • 力扣190:颠倒二进制位
  • MySQL主从复制进阶(GTID复制,半同步复制)
  • SpringMVC —— 响应和请求处理
  • 手写 Tomcat
  • STM32启动模式配置