Mel*_*art 9 java algorithm data-structures
这是一个常见的面试问题.你有一串数字进来(让我们说超过一百万).数字介于[0-999]之间.
Implement a class which supports three methods in O(1)
* insert(int i);
* getMean();
* getMedian();
Run Code Online (Sandbox Code Playgroud)
这是我的代码.
public class FindAverage {
private int[] store;
private long size;
private long total;
private int highestIndex;
private int lowestIndex;
public FindAverage() {
store = new int[1000];
size = 0;
total = 0;
highestIndex = Integer.MIN_VALUE;
lowestIndex = Integer.MAX_VALUE;
}
public void insert(int item) throws OutOfRangeException {
if(item < 0 || item > 999){
throw new OutOfRangeException();
}
store[item] ++;
size ++;
total += item;
highestIndex = Integer.max(highestIndex, item);
lowestIndex = Integer.min(lowestIndex, item);
}
public float getMean(){
return (float)total/size;
}
public float getMedian(){
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法想到一种在O(1)时间内获得中位数的方法.任何帮助赞赏.
And*_*eas 10
你已经通过建造store柜台完成了所有繁重的工作.加上size价值,这很容易.
你只需要开始迭代store,总结计数直到达到一半size.那是你的中值,如果size是奇数.对于偶数size,您将获取两个周围的值并获得它们的平均值.
性能平均为O(1000/2),这意味着O(1),因为它不依赖n,即即使n达到数十亿,性能也不会改变.
记住,O(1)并不意味着即时,甚至快.正如维基百科所说:
如果T(n)的值受不依赖于输入大小的值限制,则称算法是恒定时间(也写为O(1)时间).
在您的情况下,该范围是1000.