匹配算法:向下就近原則,向下沒有就向上

匹配算法:向下就近原則,向下沒有就向上

  • 實現方式一
  • 實現方式二
  • 總結

實現方式一

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.pswp.cn/diannao/70680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70680.shtml
英文地址,請注明出處:http://en.pswp.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 低權限 常…