簡體   English   中英

使用高效的添加和索引獲取方法對Java數據結構進行排序

[英]Sorted java data structure with efficient add and indexed get method

是否有用Java實現的數據結構可提供以下保證:

  • 元素總是排序
  • 添加元素至少在O(lg n)處執行
  • 在特定索引處獲取元素至少要執行O(lg n)

基本上,我希望能夠執行以下操作:

SomeDataStructure elements = new SomeDataStructure();
elements.add(5);
elements.add(1);
elements.add(10);
assertEquals(1, elements.get(0));
assertEquals(5, elements.get(1));
assertEquals(10, elements.get(2));

其中addget方法都至少在O(lg n)處執行。

這似乎應該可以用樹結構完成,但是我找不到任何提供索引get方法的實現。 我還研究了為此使用/擴展java.util.TreeMap,但是所有旋轉邏輯都是私有的,因此我無法跟蹤樹的更改方式。

看來您可以使用TreeMap ,然后添加遍歷樹的get方法以獲取該索引?

您也許可以使用keySet迭代器按順序進行操作,但是沒有關於其性能的文檔。

如果您不需要交錯讀寫,即您想一次構建所有數據結構,然后在其中查找內容,而無需在構建后進行修改,那么我將簡單地構建列表,對其進行排序,然后在列表中使用索引。 在這種情況下,樹是過大的殺傷力,因為在構建時無需保持結構排序。

List<Integer> elements = new ArrayList<Integer>(3);
elements.add(5);
elements.add(1);
elements.add(10);

Collections.sort(elements);

assertEquals(1, elements.get(0));
assertEquals(5, elements.get(1));
assertEquals(10, elements.get(2));

加法運算每次發生在O(1)次中(因此O(n)用於加法n個項),排序發生在O(n * log(n))次中,使您的總體復雜度為O(n + n * log (n))= O(n * log(n))用於構建結構。 這與在每個O(log(n))時間中添加n個元素相同。 但是,查找將在恆定的(O(1))時間中進行,與基於樹的解決方案相比,它具有更高的效率。

如果您想保證結構永遠不會被修改(即永遠不會丟失其排序),則可以將上面的第5行替換為:

elements = Collections.unmodifiableList(Collections.sort(elements));

如果有人嘗試修改列表,這將引發異常,這可以為您提供提示,說明出了什么問題。

從針對TreeMap的JavaSE文檔中:

此實現為containsKey,get,put和remove操作提供了保證的log(n)時間成本。

您可以通過查找有關所使用的任何實現的信息來找到相同的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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