标签: median

找到数组总和的中位数

给出了两个长度为n的排序数组,问题是在O(n)时间内找到它们的和数组的中值,它包含数组A的每个元素和数组B的每个元素之间的所有可能的成对和.

例如:令A [2,4,6]和B [1,3,5]为两个给定的数组.sum数组是[2+1,2+3,2+5,4+1,4+3,4+5,6+1,6+3,6+5].在O(n)中找到该数组的中位数.

在O(n ^ 2)中解决问题非常简单,但是对于这个问题有没有O(n)解?

注意:这是一个面试问题,问我的一个朋友,面试官很确定它可以在O(n)时间内解决.

arrays algorithm median

45
推荐指数
2
解决办法
2924
查看次数

在Ruby中计算中位数

如何使用Ruby计算数字数组的中位数?

我是初学者,在学习的过程中,我正努力坚持已经教过的东西.因此,我发现的其他问题超出了我的范围.

这是我的笔记和我的尝试:

  1. 按升序对数组进行排序.
  2. 弄清楚它是奇数还是长度.
  3. 如果是奇数,则将排序后的数组长度+1分成两半.这是中位数的指数.返回此值.
  4. 如果是偶数,找到排序数组的中间两个数字并将其除以1/2.返回此值.
  5. 找到中间的两个数字:
  6. 将排序后的数组长度分成两半.这是指数pt.第一个中间数字.
  7. 将排序的数组长度+ 2分成两半.这是指数pt.第二个中间数字.
  8. 取这两个中间数的平均值.

    def median(array)
      ascend = array.sort
      if ascend % 2 != 0
        (ascend.length + 1) / 2.0
      else
        ((ascend.length/2.0) + ((ascend.length + 2)/2.0) / 2.0)
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)

ruby median

44
推荐指数
2
解决办法
3万
查看次数

如何在不存储列表的情况下计算或近似列表的中位数

我正在尝试计算一组值的中位数,但我不想存储所有值,因为这可能会破坏内存需求.有没有一种计算或近似中位数的方法,而不存储和排序所有单个值?

理想情况下,我想编写我的代码,如下所示

var medianCalculator = new MedianCalculator();
foreach (var value in SourceData)
{
  medianCalculator.Add(value);
}
Console.WriteLine("The median is: {0}", medianCalculator.Median);
Run Code Online (Sandbox Code Playgroud)

我只需要实际的MedianCalculator代码!

更新:有些人问我正在尝试计算中位数的值是否具有已知属性.答案是肯定的.一个值从约-25到-0.5以0.5为增量.另一个也是从-120到-60的0.5增量.我想这意味着我可以为每个值使用某种形式的直方图.

谢谢

缺口

algorithm optimization median

43
推荐指数
5
解决办法
3万
查看次数

找到三重中间值的最快方法?

给定是一个包含三个数值的数组,我想知道这三个数值的中间值.

问题是,找到三者中间最快方法是什么?

我的方法是这种模式 - 因为有三个数字有六种排列:

if (array[randomIndexA] >= array[randomIndexB] &&
    array[randomIndexB] >= array[randomIndexC])
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我找到更优雅,更快捷的方法,那将是非常好的.

java algorithm logic conditional median

42
推荐指数
7
解决办法
7万
查看次数

O(n)算法查找数字集合的中位数

问题:输入是一个(不一定是排序的)序列S = k1,k2,...,n个任意数的kn.考虑形式为min {ki,kj}的n 2个数的集合C,对于1 <= i,j <= n.提出一个O(n)时间和O(n)空间算法来找到C的中位数.

到目前为止,通过检查C的不同集合S,我发现C中S中最小数字的实例数等于(2n-1),下一个最小数字:(2n-3),依此类推,直到你只有一个最大数字的实例.

有没有办法使用这些信息来找到C的中位数?

algorithm median

41
推荐指数
3
解决办法
5万
查看次数

使用STL容器进行中值计算时,正确的方法是什么?

假设我需要从1000000个随机数值序列中检索中值.

如果使用任何但是 STL ::名单,我没有(内置)的排序方式为中值计算序列.

如果使用STL :: list,我不能随机访问值来检索排序序列的中间(中位数).

是自己实现排序和使用例如STL :: vector更好,还是使用STL :: list并使用STL :: list :: iterator for-loop-walk到中值?后者似乎不那么开销,但也感觉更难看..

或者我有更多更好的选择吗?

c++ algorithm containers stl median

40
推荐指数
5
解决办法
3万
查看次数

计算存储在Vector - C++中的值的中值?

我是一名编程学生,对于我正在研究的项目,我必须做的事情是计算int值向量的中值.我这样做只使用排序功能从STL和矢量成员函数,如.begin(),.end().size().

我也应该确保我找到矢量具有奇数个值或偶数个值的中位数.

被困了,下面我已经把我的尝试包括在内了.那我哪里错了?如果您愿意给我一些指导或资源以便朝着正确的方向前进,我将不胜感激.

码:

int CalcMHWScore(const vector<int>& hWScores)
{
     const int DIVISOR = 2;
     double median;
     sort(hWScores.begin(), hWScores.end());
     if ((hWScores.size() % DIVISOR) == 0)
     {
         median = ((hWScores.begin() + hWScores.size()) + (hWScores.begin() + (hWScores.size() + 1))) / DIVISOR);
     }
     else 
     {
       median = ((hWScores.begin() + hWScores.size()) / DIVISOR)
     }

    return median;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

c++ vector median

34
推荐指数
4
解决办法
8万
查看次数

scala中位数实施

什么是scala中值的快速实现?

这是我在rosetta代码上找到的:

  def median(s: Seq[Double])  =
  {
    val (lower, upper) = s.sortWith(_<_).splitAt(s.size / 2)
    if (s.size % 2 == 0) (lower.last + upper.head) / 2.0 else upper.head
  }
Run Code Online (Sandbox Code Playgroud)

我不喜欢它因为它做了一种.我知道有一些方法可以计算线性时间的中位数.

编辑:

我想有一组中间函数,我可以在各种场景中使用:

  1. 快速,适当的中位数计算,可以在线性时间内完成
  2. 平均一个流上工作,你可以遍历多次,但你只能保持O(log n)在内存中值是这样
  3. 在流上工作的中位数,你可以O(log n)在内存中保存最多的值,你最多可以遍历一次流(这甚至可能吗?)

请仅发布编译正确计算中位数的代码.为简单起见,您可以假设所有输入都包含奇数个值.

algorithm scala median

33
推荐指数
1
解决办法
1万
查看次数

为什么中位数会绊倒data.table(整数与双数)?

我有一个名为enc.per.day的data.table,用于每天的遭遇.它有2403行,其中指定了服务日期和当天看到的患者数量.我希望看到在任何类型的工作日看到的患者中位数.

enc.per.day[,list(patient.encounters=median(n)),by=list(weekdays(DOS))]
Run Code Online (Sandbox Code Playgroud)

该行给出了错误

误差在[.data.table(enc.per.day,列表(patient.encounters =中间值(N)),:j的列不计算一致类型的每个组:导致对其组4具有第1分型"整数",但期待输入'double'

以下一切都很好

tapply(enc.per.day$n,weekdays(enc.per.day$DOS),median)
enc.per.day[,list(patient.encounters=round(median(n))),by=list(weekdays(DOS))]
enc.per.day[,list(patient.encounters=median(n)+0),by=list(weekdays(DOS))]
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?我花了很长时间才弄清楚为什么我的代码不起作用.

顺便说一句,底层向量enc.per.day $ n是一个整数

storage.mode(enc.per.day$n)
Run Code Online (Sandbox Code Playgroud)

返回"整数".此外,data.table中没有任何NA.

double integer r median data.table

30
推荐指数
1
解决办法
5514
查看次数

在C#中计算"中位数为5"的代码

注意:请不要将此解释为"作业问题".这只是我很想知道的事情:)

中值为5有时用作算法设计中的练习,并且已知仅使用6次比较可计算.

在C#实现"使用6次比较的五个中位数"的最佳方法是什么?我的所有尝试似乎都导致了尴尬的代码:(我需要漂亮可读的代码,同时仍然只使用6次比较.

public double medianOfFive(double a, double b, double c, double d, double e){
    //
    // return median
    //
    return c;
}
Run Code Online (Sandbox Code Playgroud)

注意:我想我也应该提供"算法":

我发现自己无法像Azereal在论坛帖子中那样清楚地解释算法.所以我会在这里引用他的帖子.来自http://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi?board=riddles_cs;action=display;num=1061827085

好吧,我在我的一个任务中提出了这个问题,我转向这个论坛寻求帮助,但没有帮助.我终于找到了如何做到这一点.

  1. 使用前4个元素启动mergesort并订购每对(2个比较)

  2. 比较每对中的两个较低的一个并从可能性中消除最低的一个(3个比较)

  3. 在没有配对的情况下添加第5个号码并比较两个(4个比较)

  4. 比较两个新对中的两个最低对并消除较低对(5个比较)

  5. 比较一个单独和最后一对中的较低者,较低的数字是中位数

    可能的中位数在肠胃外

(54321)

5:4 3:2 2比较

(4 <5 2 <3 1)

4:2 3比较

2(4 <5 3 1)

1:3 4比较

2(4 <5 1 <3)

4:1 5比较

1,2(4 <5 3)

4:3 6比较

1,2(3)4,5-

三是中位数

编辑:作为您的请求,并防止自己得到更多的downvotes,这是我写的C++代码,找到五个中位数.不要介意它的尴尬:

double StageGenerator::MedianOfFive(double n1, double n2, …
Run Code Online (Sandbox Code Playgroud)

c# algorithm readability median

28
推荐指数
5
解决办法
2万
查看次数