Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单查询:SortedSet<;T>;有一个简单的方法来找到中间元素吗?_C#_.net_Algorithm_Data Structures - Fatal编程技术网

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。