首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 有序集合查找:TreeSet/NavigableSet 實現 O(logN) 最近大於給定值的元素查詢

     編輯:程式設計疑難解答

問題

有序整數集合 `Set`,輸入一個值,找**集合中大於等於該值的最小元素**(ceiling),不存在返回 null。

錯誤做法:HashSet + 遍歷

Set set = new HashSet<>(Arrays.asList(8,3,4,7,6,5));
// 遍歷 O(N),無序,效率低

正解:TreeSet / NavigableSet

NavigableSet set = new TreeSet<>(Arrays.asList(8,3,4,7,6,5));
// 或 TreeSet set = new TreeSet<>(...);

Integer ceiling = set.ceiling(2); // 3
Integer higher  = set.higher(8);  // null (嚴格大於)
Integer floor   = set.floor(6);   // 6
Integer lower   = set.lower(3);   // null

API 對照表

方法語義示例 (集合 3,4,5,6,7,8)
`ceiling(e)`≥ e 的最小元素`ceiling(2)=3`, `ceiling(5)=5`
`higher(e)`> e 的最小元素`higher(5)=6`, `higher(8)=null`
`floor(e)`≤ e 的最大元素`floor(6)=6`, `floor(9)=8`
`lower(e)`< e 的最大元素`lower(3)=null`, `lower(5)=4`

性能與原理

  • `TreeSet` 底層是**紅黑樹**,上述操作均為 **O(log N)**。
  • 對比:`ArrayList` 排序後 `Collections.binarySearch` 也可 O(log N),但插入刪除 O(N);`TreeSet` 增刪查均 O(log N)。

完整示例

import java.util.*;

public class CeilingDemo {
    public static void main(String[] args) {
        NavigableSet set = new TreeSet<>(Arrays.asList(8,3,4,7,6,5));
        int[] queries = {2, 5, 8, 9};
        for (int q : queries) {
            Integer c = set.ceiling(q);
            System.out.printf("輸入 %d → ceiling: %s%n", q, c);
        }
    }
}
// 輸出:
// 輸入 2 → ceiling: 3
// 輸入 5 → ceiling: 5
// 輸入 8 → ceiling: 8
// 輸入 9 → ceiling: null

**結論:有序集合查找「最近大於/等於」請直接用 `TreeSet.ceiling()` / `higher()`,拒絕手寫遍歷/二分。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved