Cracking the coding interview--Q20.9
2014-04-26 10:02
363 查看
题目
原文:
Numbers are randomly generated and passed to a method. Write a program to find and maintain the median value as new values are generated.
译文:
随机产生一些数据,并传递给一个方法,写一个程序找出并维护这些数的中位数。
解答
ctci解法:
一个解决的方法是使用两个优先堆:一个最大堆存储比中位数小一点的值,最小堆存储比中位数大的值,这样中位数就是最大堆的最大值;当一个新的的值到达时,如果它小于或等于中位值则放在堆的下面,否则放在堆的上面。这堆的大小是等于小于堆的额外大小。这样容易通过从一个堆到另一个堆上移元素来被存储。这样中位值是可以达到的更新时间为O(lgn)
代码如下:
private Comparator<Integer> maxHeapComparator, minHeapComparator;
private PriorityQueue<Integer> maxHeap, minHeap;
public void addNewNumber(int randomNumber) {
if (maxHeap.size() == minHeap.size()) {
if ((minHeap.peek() != null) &&randomNumber > minHeap.peek()) {
maxHeap.offer(minHeap.poll());
minHeap.offer(randomNumber);
} else {
maxHeap.offer(randomNumber);
}
}else {
if(randomNumber < maxHeap.peek()){
minHeap.offer(maxHeap.poll());
maxHeap.offer(randomNumber);
}else {
minHeap.offer(randomNumber);
}
}
}
public static double getMedian() {
if (maxHeap.isEmpty()) return minHeap.peek();
else if (minHeap.isEmpty()) return maxHeap.peek();
if (maxHeap.size() == minHeap.size()) {
return (minHeap.peek() + maxHeap.peek()) / 2;
} else if (maxHeap.size() > minHeap.size()) {
return maxHeap.peek();
} else {
return minHeap.peek();
}
}
---EOF---
原文:
Numbers are randomly generated and passed to a method. Write a program to find and maintain the median value as new values are generated.
译文:
随机产生一些数据,并传递给一个方法,写一个程序找出并维护这些数的中位数。
解答
ctci解法:
一个解决的方法是使用两个优先堆:一个最大堆存储比中位数小一点的值,最小堆存储比中位数大的值,这样中位数就是最大堆的最大值;当一个新的的值到达时,如果它小于或等于中位值则放在堆的下面,否则放在堆的上面。这堆的大小是等于小于堆的额外大小。这样容易通过从一个堆到另一个堆上移元素来被存储。这样中位值是可以达到的更新时间为O(lgn)
代码如下:
private Comparator<Integer> maxHeapComparator, minHeapComparator;
private PriorityQueue<Integer> maxHeap, minHeap;
public void addNewNumber(int randomNumber) {
if (maxHeap.size() == minHeap.size()) {
if ((minHeap.peek() != null) &&randomNumber > minHeap.peek()) {
maxHeap.offer(minHeap.poll());
minHeap.offer(randomNumber);
} else {
maxHeap.offer(randomNumber);
}
}else {
if(randomNumber < maxHeap.peek()){
minHeap.offer(maxHeap.poll());
maxHeap.offer(randomNumber);
}else {
minHeap.offer(randomNumber);
}
}
}
public static double getMedian() {
if (maxHeap.isEmpty()) return minHeap.peek();
else if (minHeap.isEmpty()) return maxHeap.peek();
if (maxHeap.size() == minHeap.size()) {
return (minHeap.peek() + maxHeap.peek()) / 2;
} else if (maxHeap.size() > minHeap.size()) {
return maxHeap.peek();
} else {
return minHeap.peek();
}
}
---EOF---
相关文章推荐
- 面向VB开发人员的ASP.NET 2.0简介
- grails一对多双向关联
- Android中设置TextView的颜色setTextColor
- 常用的linux命--ln
- 农大oj之1003解题报告
- FZoj 2166 inversion
- RPL协议介绍
- hdu 2838 Cow Sorting (树状数组)
- .net内存回收与Dispose﹐Close﹐Finalize方法
- 最近看到的比较好的ViewHolder写法
- <vim><win>win下安装wim
- 杨家海 清华大学 研究员,博导
- 2014华为实习生招聘机试题
- 网址URL中特殊字符转义编码
- openflow 和 sdn (软件定义网络) 原理和教程
- 背包九讲
- 阅读原文 ASP.NET中防止用户多次登录的方法
- HashMap内部存储实现及HashTable比较
- 背包九讲
- 使用RadControls的RadMenu控件开发系统菜单