2012-04-21 97 views
5

我已經閱讀了大量關於爲特定實施選擇正確收藏的文章, ,並且我明白最終它會歸結爲對實際數據進行基準測試,但是我忙於這樣做:收藏修改項目

  • 什麼排序在C#中的集合允許修改項目 包含?我似乎無法找到任何?

  • 這是因爲修改可能會實施爲刪除 然後重新插入,從而使明確的「修改」功能 毫無意義?

我需要一個集合(自定義或標準庫), 與它進行下列操作。

  • 插入 - 通常
  • 刪除 - 經常
  • 修改 - 經常
  • 選擇前X元素 - 每一個上述任何情況發生時,更多的,同時。

目前我使用的是SortedSet的,因爲它提供了O(LOGN)插入,但我對 去除性能以及如何最好地修改項目不清楚。

+0

集合是否需要隨時排序?如果您可以應用多個修改,然後再進行一次排序,您將獲得巨大的性能優勢。 – 2012-04-21 17:36:14

+0

@Evenhuis不幸的是,因爲多個'客戶'將要求這個列表,並且他們需要按排序順序每次對列表進行更改。或者至少是最上面的元素。 – Vort3x 2012-04-21 17:37:43

+0

我們在數據結構課程中使用了均衡的BST。它非常快,但我們用C++實現它。你可能會考慮它。這是一個很好的信息源:http://www.codeproject。com/Articles/68500 /平衡二分搜索樹BST-Search-Delete-Prin – 2012-04-21 17:40:11

回答

1

首先,我們需要闡明修改集合的含義。

通常,操作集合是指從列表中插入/刪除項目。 要修改單個項目,它基本上訪問該項目並修改其屬性。訪問項目的成本取決於收集實施,但項目資產的修改不依賴於收集。 另請注意,如果集合項目不可變,則無法修改它。

如果你只是想找到最好的內置集合,你基本上選擇SortedList和SortedSet(SortedDictionary與SortedSet相同)。 SortedList將數據內部存儲爲數組,因此它可以通過索引進行高效訪問(用於獲取頂部X項); SortedSet具有更快的插入和移除(通過常數因子),但索引訪問需要通過樹搜索下一個項目,最壞的情況是O(log n)和最佳的O(1)。

除此之外,兩者之間的差異非常小,因爲它們都實現了紅黑樹,只是在實現細節上有所不同。

您的用戶案例的實際表現必須進行衡量。但你已經知道了。