簡體   English   中英

Java 排序數據結構,允許對一個范圍內的值進行對數時間刪除

[英]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而言)。

我不知道任何接口/庫,但您可以嘗試使用類似結構的直方圖...

例如,假設我們知道我們的結構將只包含minmax之間的整數。 那么我們可以簡單的在下面的庄園里做一個數組……

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM