C# 简单查询:SortedSet<;T>;有一个简单的方法来找到中间元素吗?
查看上的文档,我看不出有什么办法。理想情况下,我希望能够在C# 简单查询:SortedSet<;T>;有一个简单的方法来找到中间元素吗?,c#,.net,algorithm,data-structures,C#,.net,Algorithm,Data Structures,查看上的文档,我看不出有什么办法。理想情况下,我希望能够在O(log(n))时间中找到SortedSet的中位数(中间元素或两者的总和)。很遗憾,你是对的分拣数据集不提供获取中间值的内置方法。这是因为SortedSet的底层数据结构是一棵红黑树。(例如,参见维基百科) 您是否可以使用其他类型的集合,或者它必须是SortedSet?否则,我建议将其转换为一个列表或数组,并通过访问索引length+1/2处的元素(对于length的奇数值),在O(1)时间内获得中值,或者,如果数组中存在重复项,则元
O(log(n))
时间中找到SortedSet
的中位数(中间元素或两者的总和)。很遗憾,你是对的<代码>分拣数据集不提供获取中间值的内置方法。这是因为SortedSet
的底层数据结构是一棵红黑树。(例如,参见维基百科)
您是否可以使用其他类型的集合,或者它必须是SortedSet?否则,我建议将其转换为一个列表或数组,并通过访问索引
length+1/2
处的元素(对于length
的奇数值),在O(1)时间内获得中值,或者,如果数组中存在重复项,则元素length/2
和length/2-1
排序集的平均值不是找到中值的好方法
例如
[5,2,2,7,3,7,9,0,2,3]
例如,9个元素的中位数应该是2,但你只会得到6个元素和错误的中位数
我认为最好的方法是创建自己的二叉搜索树好答案。不过,还有一个补充:我相信可以修改一个红黑树来跟踪每个节点的总项目计数,如果计数已知,那么这就足够在O(log(n))时间内通过索引访问元素了
SortedSet
不执行此操作,但执行此操作的自定义实现可能非常适合OP。