匹配算法:向下就近原则,向下没有就向上

匹配算法:向下就近原则,向下没有就向上

  • 实现方式一
  • 实现方式二
  • 总结

实现方式一

private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList = sourceList.stream().filter(Objects::nonNull).sorted().collect(Collectors.toList());Set<Integer> foundValues = new HashSet<>();for (Integer searchValue : searchValues) {Integer nearestValue = findNearestBelowOrAbove(sortedList, searchValue);if (nearestValue != null) {foundValues.add(nearestValue);}}return sourceList.stream().filter(foundValues::contains).collect(Collectors.toList());}/*** @param sortedList* @param searchValue* @return 匹配结果(匹配规则:向下就近原则,向下没有就向上)*/private static Integer findNearestBelowOrAbove(List<Integer> sortedList, Integer searchValue) {if (sortedList.isEmpty()) {return null;}int index = Collections.binarySearch(sortedList, searchValue);if (index >= 0) {return sortedList.get(index);} else {int insertionPoint = -(index + 1);if (insertionPoint < sortedList.size()) {return sortedList.get(insertionPoint);} else {return sortedList.get(sortedList.size() - 1);}}}

实现方式二

public static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {// 过滤 null 值并排序TreeSet<Integer> sortedSet = sourceList.stream().filter(Objects::nonNull).collect(Collectors.toCollection(TreeSet::new));Set<Integer> foundValues = new HashSet<>();for (Integer searchValue : searchValues) {Integer nearestValue = findNearestBelowOrAbove(sortedSet, searchValue);if (nearestValue != null) {foundValues.add(nearestValue);}}// 保持原始顺序return sourceList.stream().filter(foundValues::contains).collect(Collectors.toList());}private static Integer findNearestBelowOrAbove(TreeSet<Integer> sortedSet, Integer searchValue) {// 查找大于等于 searchValue 的最小值Integer ceiling = sortedSet.ceiling(searchValue);if (ceiling != null) {return ceiling;}// 查找小于等于 searchValue 的最大值Integer floor = sortedSet.floor(searchValue);if (floor != null) {return floor;}return null;}

测试代码:

public class TestMatcher {public static void main(String[] args) {List<Integer> sourceList = Arrays.asList(5, 7, 11, 31, 77);List<Integer> searchValues = Arrays.asList(1, 2, 8, 12, 13, 14, 15, 82, 91);List<Integer> matches = findMatches(sourceList, searchValues);System.out.println(matches);}
}

测试结果:
[5, 11, 31, 77]

总结

在这里插入图片描述

两种实现的时间复杂度相同,都是 O(n log n)。
如果数据是静态的,使用 基于排序列表的实现。
如果数据需要频繁更新,使用 基于 TreeSet 的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

IP地址 vs 域名:分布式系统中的服务寻址之争

在分布式系统中&#xff0c;服务之间的通信是核心问题之一。如何高效、稳定地找到目标服务&#xff0c;是每个开发者都需要面对的挑战。常见的服务寻址方式有两种&#xff1a;IP地址 和 域名。这两种方式各有优劣&#xff0c;适用于不同的场景。本文将从性能、稳定性、动态性、…

【技术笔记】Cadence 创建元器件 Pin 引脚的创建与设置

【技术笔记】Cadence 创建元器件 Pin 引脚设置 一、管脚 Pin 放置方式1. 直接放置&#xff08;快捷键【Shift】【G】&#xff09;2. 按照Pin阵列放置引脚&#xff08;快捷键【Shift】【J】&#xff09;3. 通过Excel表格创建元器件 二、引脚属性设置1. 创建Pin设置&#xff0c;E…

java面试场景问题

还在补充&#xff0c;这几天工作忙&#xff0c;闲了会把答案附上去&#xff0c;也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1&#xff1a;基于唯一请求 ID&#xff08;幂等 Token&#xff09; 思路&#xff1a;前端生成 一个唯一的 requestId&#xff08;…

Windows11安装GPU版本Pytorch2.6教程

1: 准备工作 针对已经安装好的Windows11系统&#xff0c;先检查Nvidia驱动和使用的CUDA版本情况。先打开Windows PowerShell&#xff0c;通过nvidia-smi命令查看GPU的情况&#xff0c;结果如下图1所示&#xff0c;从结果中可知使用的CUDA版本为12.8。 图1&#xff1a;检测安装…

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL开源项目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言 1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代&#xff0c;将自然语言查询转化为结构化查询语言&#xff08;SQL&#xff09;的能力变得日益重要。无论是小型…

go 环境准备

配置路径&#xff1a; GOROOT&#xff1a;D:\GoGOPATH&#xff1a;go的工作目录 D:\workspacego 验证版本&#xff1a;go version 配置第三方仓库&#xff1a; GO111MODULE&#xff1a;开启mod模式GOPROXY&#xff1a;go语言三方库地址GOSUMDB&#xff1a;go语言软件包的M…

Qt/C++项目积累:3.日志管理系统 - 3.1 项目介绍

在实际工程项目中&#xff0c;日志系统无疑是比较重要地分析问题的手段&#xff0c;常用的一般是将其写入到日志文件中&#xff0c;或者写入数据库文件&#xff0c;进行分析&#xff0c;而工程人员或者开发人员需要实时查看日志&#xff0c;可能不太方便&#xff0c;于是就需要…

netty十八罗汉之——挖耳罗汉(Decoder)

佛教中除不听各种淫邪声音之外&#xff0c;更不可听别人的秘密。因他论耳根最到家&#xff0c;故取挖耳之形&#xff0c;以示耳根清净。 来看看netty的核心组件解码器Decoder Decoder的作用半包&#xff0c;粘包问题从模板和装饰器模式看Decoder解码原理 1.Decoder作用 最根本…

51单片机学习之旅——定时器

打开软件 1与其它等于其它&#xff0c;0与其它等于0 1或其它等于1&#xff0c;0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作&#xff0c;高四位保持&#xff0c;低四位清零&#xff0c;高四位定时器1&#xff0c;低四位定时器0 TMODTMOD|0x01;//0x010000 0…

内容中台重构智能服务:人工智能技术驱动精准决策

内容概要 现代企业数字化转型进程中&#xff0c;内容中台与人工智能技术的深度融合正在重构智能服务的基础架构。通过整合自然语言处理、知识图谱构建与深度学习算法三大技术模块&#xff0c;该架构实现了从数据采集到决策输出的全链路智能化。在数据层&#xff0c;系统可对接…

【redis】redis内存管理,过期策略与淘汰策略

一&#xff1a;Redis 的过期删除策略及处理流程如下&#xff1a; 1. 过期删除策略 Redis 通过以下两种策略删除过期键&#xff1a; 1.1 惰性删除 触发时机&#xff1a;当客户端访问某个键时&#xff0c;Redis 会检查该键是否过期。执行流程&#xff1a; 客户端请求访问键。…

tp6上传文件大小超过了最大值+验证文件上传大小和格式函数

问题&#xff1a; 最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示&#xff1a; $file $this->request->file(file);{"code": 1,"msg": "上传文件大小超过了最大值&#xff01;","data": {"code": 1,&q…

Kreuzberg:本地OCR+多格式解析!Kreuzberg如何用Python暴力提取30+文档格式?程序员看完直呼内行!

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 我们经常需要从各种不同类型的文档中提取文本内容&#xff0c;无论是办公文档、图像还是PDF文件。而Kreuzberg这个Python库的出现&#xff0c;为我们提…

Windows程序设计29:对话框之间的数据传递

文章目录 前言一、父子对话框之间的数据传递1.父窗口获取子窗口数据2.子窗口获取父窗口数据 二、类外函数调用窗口的操作1.全局变量方式2.参数传递方式 总结 前言 Windows程序设计29&#xff1a;对话框之间的数据传递。 在Windows程序设计28&#xff1a;MFC模态与非模态对话框…

【C语言】第八期——指针

目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算&#xff08;了解&#xff09; 6.2.1 指针加减具体数字…

为 Power Automate 注册 Adobe PDF Services

前言 最近&#xff0c;再测试如何将HTML转换成PDF&#xff0c;然后发现Adobe有一个免费的操作可以用&#xff0c;好开心&#xff0c;赶紧注册一下。 正文 1.先注册一个账号&#xff0c;然后登录到Adobe Developer 注册链接&#xff1a;https://www.adobe.com/go/getstarted_pow…

BY组态:工业自动化的未来,触手可及

1. BY组态软件的核心优势 简单易用&#xff1a;图形化界面&#xff0c;降低学习成本&#xff0c;快速上手。 高效灵活&#xff1a;支持多种设备协议&#xff0c;兼容性强&#xff0c;适用于多种行业。 实时监控&#xff1a;提供实时数据采集与可视化&#xff0c;助力高效决策…

有哪些开源大数据处理项目使用了大模型

以下是一些使用了大模型的开源大数据处理项目&#xff1a; 1. **RedPajama**&#xff1a;这是一个开源项目&#xff0c;使用了LLM大语言模型数据处理组件&#xff0c;对GitHub代码数据进行清洗和处理。具体流程包括数据清洗、过滤低质量样本、识别和删除重复样本等步骤。 2. …

网络安全之攻防笔记--通用安全漏洞SQL注入sqlmapOraclemongodbDB2

通用安全漏洞SQL注入&sqlmap&Oracle&mongodb&DB2 数据库类型 ACCESS 特性 没数据库用户 没数据库权限 没数据库查询参数 没有高权限注入说法 暴力猜解&#xff0c;借助字典得到数据 注入方式 联合注入 偏移注入 表名列名猜解不到 偏移注入 MySQL 低权限 常…