【发布时间】:2015-06-25 01:20:15
【问题描述】:
我有Hashtable<String, Integer> ht。
如何有效地在这个哈希表中找到值的(整数)中位数?
【问题讨论】:
-
你试过什么?问题是如何找到一堆数字的中位数,还是如何获取地图的值?
-
我能想到的就是迭代所有元素并记录下来,然后排序,最后计算出中位数。但我相信还有更好的方法。
我有Hashtable<String, Integer> ht。
如何有效地在这个哈希表中找到值的(整数)中位数?
【问题讨论】:
哈希表中没有有意义的排序:哈希表的全部意义在于根据它们的键将值均匀地分散在桶中。找到给出键的元素非常快,接近恒定时间(即 O(1)),但是基于不等式的算法,比如找到所有元素 e 使得 key(e)
您可以加载数组中的所有键(并且仅键),然后使用 (O(N)) 算法找到与中位数对应的键。获得中间键后,您可以使用它从哈希表中检索中间元素。
请注意,O(N) 显然是找到无序集合中位数的最佳方法。如果您需要经常找到集合的中位数,则可以使用有序表示,例如基于平衡树,是要走的路。红黑树通常用于实现这种有序映射。键查找将是 O(log(N)),它比 O(1) 慢,但仍然相当快,但是集合已经排序并且查找中位数很容易,并且通常作为内置操作提供。
我所知道的快速中值查找算法基于 Quicksort 中使用的相同旋转策略。这是我刚刚找到的另一个:
http://www.cs.cornell.edu/courses/cs2110/2009su/Lectures/examples/MedianFinding.pdf
【讨论】:
您可以使用The Apache Commons Mathematics Library
有一个完整的API 用于您可能需要的所有数学工具,例如median、mean、standard deviation 等...
希望有所帮助。
【讨论】: