我使用排序字典来维护项目列表,我经常需要监视前x项的状态。每次我更新一个项目时,我都想快速找出我所指的项目使用的索引。我知道我可以枚举整个列表并计算我的位置,但是我正在寻找O(log n)时间或更好的东西,所有排序的字典都在RedBlack树上。每个节点都应该能够跟踪其子节点,这应该是一个快速计算。
答案 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时间报告现有项目的索引,这需要非常少的额外时间进行插入和删除。一种方法是跟踪每个节点的左右分支中有多少项(在插入或删除时,在更改子节点数时更改父节点的节点数)。但是,如果基于树的结构不提供这样的设施,我知道没有简单的方法来改造它。