给出了两个长度为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)时间内解决.
如何使用Ruby计算数字数组的中位数?
我是初学者,在学习的过程中,我正努力坚持已经教过的东西.因此,我发现的其他问题超出了我的范围.
这是我的笔记和我的尝试:
取这两个中间数的平均值.
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)我正在尝试计算一组值的中位数,但我不想存储所有值,因为这可能会破坏内存需求.有没有一种计算或近似中位数的方法,而不存储和排序所有单个值?
理想情况下,我想编写我的代码,如下所示
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增量.我想这意味着我可以为每个值使用某种形式的直方图.
谢谢
缺口
给定是一个包含三个数值的数组,我想知道这三个数值的中间值.
问题是,找到三者中间的最快方法是什么?
我的方法是这种模式 - 因为有三个数字有六种排列:
if (array[randomIndexA] >= array[randomIndexB] &&
array[randomIndexB] >= array[randomIndexC])
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我找到更优雅,更快捷的方法,那将是非常好的.
问题:输入是一个(不一定是排序的)序列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的中位数?
假设我需要从1000000个随机数值序列中检索中值.
如果使用任何但是 STL ::名单,我没有(内置)的排序方式为中值计算序列.
如果使用STL :: list,我不能随机访问值来检索排序序列的中间(中位数).
是自己实现排序和使用例如STL :: vector更好,还是使用STL :: list并使用STL :: list :: iterator for-loop-walk到中值?后者似乎不那么开销,但也感觉更难看..
或者我有更多更好的选择吗?
我是一名编程学生,对于我正在研究的项目,我必须做的事情是计算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)
谢谢!!
什么是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)
我不喜欢它因为它做了一种.我知道有一些方法可以计算线性时间的中位数.
编辑:
我想有一组中间函数,我可以在各种场景中使用:
O(log n)
在内存中值是这样O(log n)
在内存中保存最多的值,你最多可以遍历一次流(这甚至可能吗?)请仅发布编译并正确计算中位数的代码.为简单起见,您可以假设所有输入都包含奇数个值.
我有一个名为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.
注意:请不要将此解释为"作业问题".这只是我很想知道的事情:)
中值为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
好吧,我在我的一个任务中提出了这个问题,我转向这个论坛寻求帮助,但没有帮助.我终于找到了如何做到这一点.
使用前4个元素启动mergesort并订购每对(2个比较)
比较每对中的两个较低的一个并从可能性中消除最低的一个(3个比较)
在没有配对的情况下添加第5个号码并比较两个(4个比较)
比较两个新对中的两个最低对并消除较低对(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) median ×10
algorithm ×7
c++ ×2
arrays ×1
c# ×1
conditional ×1
containers ×1
data.table ×1
double ×1
integer ×1
java ×1
logic ×1
optimization ×1
r ×1
readability ×1
ruby ×1
scala ×1
stl ×1
vector ×1