Redian新闻
>
CVS里面什么东西算grocery阿?
avatar
CVS里面什么东西算grocery阿?# PennySaver - 省钱一族
x*n
1
其实版上讨论过,我当时大概瞄过,光看了个用CIRCULAR BUFFER解,却不知道为啥。
面试官让写CODE就傻了,最后只好写了个用LINKEDLIST的。
题目就是有个msg class
class Msg
{
long key;
long value;
};
每个Msg都对应一个key。现在要设计一个class,实现如下功能
class Window
{
Window(int nMilliseconds);
addMsg(Msg m);
Msg getMsg(long key);
Double getAvg();
};
nMilliseconds给你了个time window,比如说如果是10分钟,你只保存当前为止10
分钟前的MSG。你需要能够添加信息,实现对于key的query(注意如果这个key对应的信
息是10分钟前的,就返回NULL), 和计算所有10分钟内msg的平均。
我本来想用circular array,但不知道该怎么存这些msg。还有就是每个key和msg应该
用map来存吧,但如果用CIRCULAR ARRAY对于过时的信息还是得在MAP里一条一条删除。
我觉得好象也没有怎么省时间。所以我干脆用一个linkedlist来存每个MSG的timestamp
和msg,每次调用其他函数前先得update ,同时在list和map里删除过时的节点。对于
计算AVG,只需要记录tot和msg的个数,并update就可以了.不知道这题要不要考多线程
,反正我跟面试官说我一点也不会。
class MsgWrapper{
Msg m;
long timeStamp;
MsgWrapper(long t, Msg msg){
m = msg;
timeStamp = t;
}
}
class Window{
private long getTimeStamp(){
return System.currentTimeMillis();
}
long windowSize;
List list;
long tot;
int numMsg;
Map map;
Window(int nMilliseconds){
list = new LinkedList();
windowSize = (long)nMilliseconds;
tot = 0;
numMsg = 0;
map = new HashMap();
}

private long update(){
long timeStamp = getTimeStamp();
long lastTimeStamp = timeStamp - windowSize;
int ptr = 0;
while (ptr < list.size()){
if (list.get(0).timeStamp < lastTimeStamp){
Msg currMsg = list.get(0).m;
map.remove(currMsg.key);
tot -= currMsg.value;
--numMsg;
list.remove(0);
}else
break;
}
return timeStamp;
}

addMsg(Msg m){
update();
list.add(new MsgWrapper(currTImeStamp, m));
map.put(m.key, m);
tot += m.value;
++numMsg;
}

Msg getMsg(long key){
update();
return map.get(key);
}

double getAvg(){
update();
return ((double)tot)/numMsg;
}
}
他最后也没说什么也没给提示。有没有朋友帮忙给出更efficient的解法呀?上次别人
贴这题的时候就有不少朋友说CIRCULAR BUFFER。到底该怎么用呢?非常感谢
avatar
t*u
2
今天刷出一个3off10 grocery
厕纸、笔、口香糖阿什么的算吗?
avatar
J*3
3
有对空间和时间的具体限制么
avatar
p*d
4


【在 t*********u 的大作中提到】
: 今天刷出一个3off10 grocery
: 厕纸、笔、口香糖阿什么的算吗?

avatar
x*n
5
现在的面试官都把题目弄的很神秘,我当时没仔细问-_-!但从他的描述中时间应该
很重要。

【在 J****3 的大作中提到】
: 有对空间和时间的具体限制么
avatar
s*6
6
sobe水算不算?
avatar
M*u
7
用一个BST来keep所有的message,让所有的message order by time,任何操作的时候
都去检查最老的message是不是需要purge了。insert的时候不仅insert到bst,而且
insert到一个hashtable里。
这样addMsg是O(lgN),getMsg是O(1), getAvg()是O(1) 假设你keep一个sum和cnt的话
。主要问题是有lock contention
avatar
d*l
8
昨天买了10元的水,coupon顺利通过。
avatar
s*x
9

这个很不错。可能就是最佳答案了。以前那个题有些不同, 是求最近5分钟,1个小时
的request count.
这个题你还要查询,单用circular buffer 好像不够,因为多个MSG 可能时间上重叠。

【在 M********u 的大作中提到】
: 用一个BST来keep所有的message,让所有的message order by time,任何操作的时候
: 都去检查最老的message是不是需要purge了。insert的时候不仅insert到bst,而且
: insert到一个hashtable里。
: 这样addMsg是O(lgN),getMsg是O(1), getAvg()是O(1) 假设你keep一个sum和cnt的话
: 。主要问题是有lock contention

avatar
w*1
10
饼干什么的算吗?
avatar
x*n
11
不是很明白为啥一定要用BST?MSG进来了以后就已经是ORDER的了啊(MSG只能按时间顺
序进来)。不知道能不能在链表最后加个POINTER,从头删除,从后面加新的。不过实
际上用个QUEUE好象就可以。插入和删除都是O(1)

【在 M********u 的大作中提到】
: 用一个BST来keep所有的message,让所有的message order by time,任何操作的时候
: 都去检查最老的message是不是需要purge了。insert的时候不仅insert到bst,而且
: insert到一个hashtable里。
: 这样addMsg是O(lgN),getMsg是O(1), getAvg()是O(1) 假设你keep一个sum和cnt的话
: 。主要问题是有lock contention

avatar
f*w
12
吃的应该都算,不知道刮胡刀算不算
avatar
n*e
13
我觉得你写的挺好。
学习了。

【在 x*********n 的大作中提到】
: 其实版上讨论过,我当时大概瞄过,光看了个用CIRCULAR BUFFER解,却不知道为啥。
: 面试官让写CODE就傻了,最后只好写了个用LINKEDLIST的。
: 题目就是有个msg class
: class Msg
: {
: long key;
: long value;
: };
: 每个Msg都对应一个key。现在要设计一个class,实现如下功能
: class Window

avatar
d*s
14
奶粉算么?
avatar
p*e
15
我也觉得BST不必要,因为肯定是从最左边的leaf删,然后加到最右边的leaf去。我觉
得一个queue就够了,然后如果assume key永远不会重复,那么add就仅仅是加进queue
和hashtable,getMsg()也只是query,只有getAvg()的时候做delete,worst case的
time complexity是O(n),因为有可能把所有的msg都删掉。这样做的坏处是memory可能
占用很多,然后synchronization的overhead比较高。
为了减少synchronization overhead,我觉得可以考虑不用shared system,每一个
thread搞一个thread local的queue和hashtable,这样add的时候需要load balancing
,query的时候需要gather,然后getAvg的时候需要gather和scatter,和distributed
system一样了,呵呵。
avatar
s*6
16
刚去用了,sobe水,cereal都算。
avatar
m*4
17
喜欢这个关于大数据的回复。说的不错!

queue
balancing
distributed

【在 p*****e 的大作中提到】
: 我也觉得BST不必要,因为肯定是从最左边的leaf删,然后加到最右边的leaf去。我觉
: 得一个queue就够了,然后如果assume key永远不会重复,那么add就仅仅是加进queue
: 和hashtable,getMsg()也只是query,只有getAvg()的时候做delete,worst case的
: time complexity是O(n),因为有可能把所有的msg都删掉。这样做的坏处是memory可能
: 占用很多,然后synchronization的overhead比较高。
: 为了减少synchronization overhead,我觉得可以考虑不用shared system,每一个
: thread搞一个thread local的queue和hashtable,这样add的时候需要load balancing
: ,query的时候需要gather,然后getAvg的时候需要gather和scatter,和distributed
: system一样了,呵呵。

avatar
h*o
18
use ring buffer:
假设 求 5minute 内信息:ring buffer size 设成 5 slots(还可以舍得更精细) 那么
第一分钟来的msg就扔到slot0,第二分钟来的msg就扔到slot1, 第5分钟来的msg就扔到
slot4,第6分钟来的msg就又扔到slot0,扔钱把slot0清空.。
每个slot放 map(key, msg).

【在 x*********n 的大作中提到】
: 其实版上讨论过,我当时大概瞄过,光看了个用CIRCULAR BUFFER解,却不知道为啥。
: 面试官让写CODE就傻了,最后只好写了个用LINKEDLIST的。
: 题目就是有个msg class
: class Msg
: {
: long key;
: long value;
: };
: 每个Msg都对应一个key。现在要设计一个class,实现如下功能
: class Window

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。