Java中的中值算法
我正试图在Java中为这样一种方法实现中间值:
Select(Comparable[] list, int pos, int colSize, int colMed)
list
是一个要找到指定位置的值列表pos
是指定的位置colSize
是我在第一阶段创建的列的大小colMed
是我在这些列中用作medX的位置
我不确定哪种排序算法最适合使用,也不确定如何准确实现这一点
你可以在下面搜索框中键入要查询的问题!
我正试图在Java中为这样一种方法实现中间值:
Select(Comparable[] list, int pos, int colSize, int colMed)
list
是一个要找到指定位置的值列表pos
是指定的位置colSize
是我在第一阶段创建的列的大小colMed
是我在这些列中用作medX的位置我不确定哪种排序算法最适合使用,也不确定如何准确实现这一点
# 1 楼答案
我知道这是一篇很老的帖子,你可能已经不记得了。但我想知道,在实现时,您是否测量了实现的运行时间
我尝试了这个算法,并将其与使用java排序方法(Arrays.sort())的简单方法进行比较,然后从排序后的数组中选择第k个元素。我得到的结果是,当数组的大小约为十万个或更多元素时,该算法仅优于java排序算法。它只快了2到3倍,这显然不是对数(n)时间快
你对此有何评论
# 2 楼答案
这个问题是关于Java的,所以就在这里
这里有一个单元测试来检查它的工作情况
然而,上面的代码对于实际使用来说太慢了
这里有一种更简单的方法来获取k'th元素,它不保证性能,但在实践中要快得多:
# 3 楼答案
我同意Chip Uni的答案/解决方案。我将仅对排序部分进行评论,并提供一些进一步的解释:
您不需要任何排序算法。该算法类似于快速排序,不同之处在于只求解一个分区(左或右)。我们只需要找到一个最佳的支点,使左右部分尽可能相等,这意味着N/2+N/4+N/8…=2N次迭代,因此O(N)的时间复杂度。上述算法称为中值中值算法,它计算中值为5的中值,从而得出算法的线性时间复杂度
然而,在搜索第n个最小/最大元素的范围时(我想你是用这个算法实现的),会使用排序算法来加速算法。在多达7到10个元素的小型阵列上,插入排序特别快
实施说明:
实际上意味着取五元素组所有中间值的中值。您可以通过创建另一个大小为
(n - 1)/5 + 1
的数组并递归调用相同的算法来找到第n/10个元素(这是新创建的数组的中值)# 4 楼答案
@android开发者:
真的
具有适合您的数据的上限函数(例如在java 2 Double中) 这也会影响中位数wrt,仅取n/10,但我们发现最接近数组中出现的平均值,而不是真正的平均值。 另一个值得注意的是,S[i]的元素可能少于3个,所以我们想要找到关于长度的中位数;用k=3将其传递到select并不总是有效的。(例如n=11,我们有3个子群2W5,1W1元素)
# 5 楼答案
我不知道你是否还需要解决这个问题,但是http://www.ics.uci.edu/~eppstein/161/960130.html有一个算法:
祝你好运