[英]Java sorted data structure that allows for logarithmic time removal of values within a range
我想知道 Java 內置庫中是否有一個接口,該接口實現了一個有序的數據結構並支持在一定范圍內刪除。 例如,如果我們調用數據結構 S(假設是整數),我希望能夠搜索並刪除 S 的子集 Q 使得 Q 包含 S 中范圍 [start, end ] 在 O(|Q| log |S|) 時間內。
我知道在 C++ 中,Set 接口有一個擦除方法,但 Java 的 TreeSet 似乎沒有類似的東西。 任何人都可以幫忙嗎? 謝謝!
SortedSet.subSet
返回一個視圖,然后您可以clear()
。
例如:
TreeSet<String> set = new TreeSet<>(Arrays.asList("A", "B", "C", "D", "E"));
System.out.println(set); // [A, B, C, D, E]
set.subSet("B", "D").clear(); // Inclusive of B, exclusive of D.
System.out.println(set); // [A, D, E]
( SortedSet
的文檔描述了如何將subSet
的邊界分別修改為獨占和包含,至少對於String
而言)。
我不知道任何接口/庫,但您可以嘗試使用類似結構的直方圖...
例如,假設我們知道我們的結構將只包含min
和max
之間的整數。 那么我們可以簡單的在下面的庄園里做一個數組……
int[] hist = new int[max - min + 1];
如果我們想在直方圖中添加一個數字i
,我們可以簡單地做......
hist[i - min]++;
數組中的每個索引代表預定義范圍內的一個數字。 數組中的每個值都表示范圍內某個數字的出現次數。
這種結構非常強大,因為它允許恆定的時間添加、刪除和搜索。
假設我們要刪除包含范圍Q = [s, e]
中的所有元素。 我們可以運行以下線性循環...
for (int i = s; i <= e; i++) {
hist[i - min] = 0;
}
這在O(|Q|)
中運行。
最后,如果我們想讓上述結構成為有序集合而不是有序序列,我們可以將數組更改為保存布爾值而不是整數。
有關更多信息,請查看https://en.wikipedia.org/wiki/Counting_sort 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.