【问题标题】:How to find the median of values in a Hashtable in Java? [closed]如何在 Java 的 Hashtable 中找到值的中位数? [关闭]
【发布时间】:2015-06-25 01:20:15
【问题描述】:

我有Hashtable<String, Integer> ht

如何有效地在这个哈希表中找到值的(整数)中位数?

【问题讨论】:

  • 你试过什么?问题是如何找到一堆数字的中位数,还是如何获取地图的值?
  • 我能想到的就是迭代所有元素并记录下来,然后排序,最后计算出中位数。但我相信还有更好的方法。
  • 这真的是关于finding the median of an unsorted list吗?

标签: java hashtable


【解决方案1】:

哈希表中没有有意义的排序:哈希表的全部意义在于根据它们的键将值均匀地分散在桶中。找到给出键的元素非常快,接近恒定时间(即 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

【讨论】:

  • 当然,对键进行排序是另一种找到中值键的方法,但它的时间为 O(N log(N)),比 O(N) 慢。在计算机科学中众所周知的结果是,您可以在 O(N) 步中找到未排序数组中的中值。起初这并不明显。
【解决方案2】:

您可以使用The Apache Commons Mathematics Library

有一个完整的API 用于您可能需要的所有数学工具,例如medianmeanstandard deviation 等...

希望有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2012-10-03
    • 2013-01-03
    • 1970-01-01
    • 2023-03-25
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多