[英]Sorted java data structure with efficient add and indexed get method
是否有用Java實現的數據結構可提供以下保證:
基本上,我希望能夠執行以下操作:
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));
其中add
和get
方法都至少在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.