0
看着关于https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx的文档,我看不到一种方法。理想情况下,我希望能够在O(log(n))
时间内找到SortedSet<int>
的中位数(中间元素或两个中间的总和)(显然,我知道我可以通过转换为列表或数组来执行此操作)。简单的查询:SortedSet <T>是否有一种简单的方法来查找中间元素?
看着关于https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx的文档,我看不到一种方法。理想情况下,我希望能够在O(log(n))
时间内找到SortedSet<int>
的中位数(中间元素或两个中间的总和)(显然,我知道我可以通过转换为列表或数组来执行此操作)。简单的查询:SortedSet <T>是否有一种简单的方法来查找中间元素?
很不幸,你是对的。 SortedSet
不提供获取中位数的内置方式。这是因为SortedSet
的底层数据结构是红黑树。 (例如,参见维基百科上的Red-black tree)
您是否可以使用其他类型的集合或它是否必须是SortedSet?否则,我建议将其转换为列表或数组,并通过访问索引length+1/2
处的奇数值length
或元素length/2
和length/2 - 1
的平均值来获得O(1)时间的中位数。
很好的答案。另外,我相信可以修改红黑树来跟踪每个节点的总项目数,并且如果已知该计数,那么通过O(log(n))中的索引访问元素的信息就足够了, ) 时间。 'SortedSet'不这样做,但是一个自定义的实现可能非常适合OP。 – hvd