查找SortedDictionary中项目索引的最有效方法

时间:2010-09-07 23:43:48

标签: c# sorteddictionary

我使用排序字典来维护项目列表,我经常需要监视前x项的状态。每次我更新一个项目时,我都想快速找出我所指的项目使用的索引。我知道我可以枚举整个列表并计算我的位置,但是我正在寻找O(log n)时间或更好的东西,所有排序的字典都在RedBlack树上。每个节点都应该能够跟踪其子节点,这应该是一个快速计算。

2 个答案:

答案 0 :(得分:5)

您只需将SortedDictionary<TKey, TValue>更改为SortedList<TKey, TValue>,然后使用IndexOfKey(key)

var s = new SortedList<string, string>
    { { "a", "Ay" }, { "b", "Bee" }, { "c", "Cee" } };

// Outputs 1
Console.WriteLine(s.IndexOfKey("b"));

IndexOfKey内部使用Array.BinarySearch<TKey>(),因此它将是O(log n ),它比O( n )更快(其中如果你通过迭代搜索从前到后搜索它。)

答案 1 :(得分:0)

可以构造树结构以按索引访问项目或以lgN时间报告现有项目的索引,这需要非常少的额外时间进行插入和删除。一种方法是跟踪每个节点的左右分支中有多少项(在插入或删除时,在更改子节点数时更改父节点的节点数)。但是,如果基于树的结构不提供这样的设施,我知道没有简单的方法来改造它。