我有Hashtable<String, Integer> ht
。
如何有效地在此哈希表中找到值'(整数)中位数?
答案 0 :(得分:2)
哈希表中没有有意义的排序:哈希表的重点是根据密钥在桶中统一分散值。找到给出密钥的元素非常快,接近恒定时间(即O(1))但是基于不等式的算法,例如找到所有元素e使得密钥(e)<1。对于给定的键值K,K通常需要表扫描,即O(N)。
您可以在数组中加载所有键(以及仅键),然后使用(O(N))算法查找与中值对应的键。获得中值键后,可以使用它从哈希表中检索中值元素。
请注意,O(N)显然是找到无序集合中位数的最佳方法。如果你需要经常找到集合的中位数,那么有序表示,例如基于平衡的树木,是要走的路。红黑树通常用于实现这种有序地图。密钥查找将是O(log(N)),它比O(1)慢,但仍然非常快,但该集已经被排序并且找到中位数很容易,并且通常作为内置操作提供。
我所知道的快速中位数发现算法基于Quicksort中使用的相同旋转策略。这是我刚发现的另一个:
http://www.cs.cornell.edu/courses/cs2110/2009su/Lectures/examples/MedianFinding.pdf
答案 1 :(得分:0)
您可以使用The Apache Commons Mathematics Library
您可能需要的所有数学工具都有完整的API,例如median,mean,standard deviation等等。
希望有所帮助。