我正在使用已排序的字典来维护项目列表,其中我经常需要监视顶级x项目的状态。每次我更新一个项目时,我想快速找出我所指的项目正在使用的索引。我知道我可以枚举整个列表并计算出我的位置,但是我在查找具有O(log n)或更好时间的东西,毕竟所有已排序的字典都位于RedBlack树上。每个节点应该能够跟踪它的孩子,这应该是一个快速计算。查找SortedDictionary中项目索引的最有效方法
回答
您可以简单地改变你的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"));
内部使用Array.BinarySearch<TKey>()
,所以这将是为O(log ñ),这是为O快(ñ)(如果你通过遍历它从前到后搜索)。
如果你需要一个O(1)插入和除了O(log(n)search? – 2012-03-29 13:09:46
@eranotzer:那么你将需要使用一个'字典
可以构建树结构以通过索引访问项目或以lgN时间报告现有项目的索引,只需要非常少的额外时间来插入和删除。一种方法是跟踪每个节点的左右分支中有多少项(插入或删除时,更改子节点的计数时更改父节点的节点数)。但是,如果一个以树为基础的结构不提供这样的设施,我知道没有简单的方法来改造它。
这是我正在寻找的角度 - 但是我正在寻找一个已经拥有它的结构,或者一个简单的改造方法。 – Superman 2010-09-08 02:10:05
- 1. 查找行索引的有效方法?
- 2. 查找通用列表中项目索引的简单方法
- 3. 在redis中查询二级索引的最有效方法
- 4. 查找特定项目的BindingSource索引
- 5. 查找列表项目的索引
- 6. 索引检索SortedDictionary <>
- 7. 索引文档中单词的最有效方法?
- 8. 在Python中查找索引和更改值的最佳方法
- 9. 使用流API查找列表中项目的所有索引
- 10. 是否有更高效的Java 8 Stream方法来查找int []中的索引?
- 11. 从SortedDictionary中查找带有最大值的键?
- 12. 按索引查找列表项目
- 13. c#查找contextSubMenu项目索引点击
- 14. 从数组中删除项目的最有效方法?
- 15. 在C/C++中列出项目的最有效方法
- 16. 从哈希数组中提取项目的最有效方法
- 17. 在xml文件中查找值的最有效方法?
- 18. 在对象列表中查找objetcs的最有效方法
- 19. 更有效的在WMP媒体库中查找媒体项目的方法?
- 20. 查看项目是否在列表框控件中的最有效方法
- 21. 寻找最近点的有效方法?
- 22. 索引返回数组的最有效方法?
- 23. 将索引添加到大型mysql表的最有效方法
- 24. 寻找有效的方法来索引文件
- 25. 查询Mongo索引中是否存在序列id索引值的最有效方法?
- 26. 查找列表中索引的起始和大于X的项目的索引
- 27. 查找与谓词匹配的索引序列中的最后一个项目
- 28. 有效的方法来找到最高JIRA问题ID在一个项目
- 29. 最有效的方法来选择数组的结尾项目?
- 30. 最有效的方法来查找jQuery的
你有没有考虑切换到'SortedList'?它可以通过索引进行'O(1)'检索。尽管如此,它在插入和删除方面确实有着不俗的表现。 –
Ani
2010-09-07 23:49:24
由于这是一个树结构,因此没有索引的概念。只有具有左侧和右侧子链接的节点。 – 2010-09-07 23:51:09
我不明白这个问题 - 树中的项目没有索引。 – Lee 2010-09-07 23:53:02