avatar
Uber onsite的设计题# JobHunting - 待字闺中
j*n
1
one ATT 32G 3g,black,
one ATT 64G 3g, black
想local出了或者拼单
avatar
m*i
2
挂在了设计题, 设计Uber app的两个service。
driver/车
update (carId,log,lat), 1 update per sec.
rider
getCarsAndETA(log,lat), 1 request per sec.
某个城市,假设是SF,有1000辆车,1000个active users.
Q:
单机可以吗?
如何存储数据,用数据库吗?
如何update车移动的数据(设计数据结构)。
如何设计getCarsAndETA求得ETA最小的10辆车 (可以简单的假设距离近就ETA小)。
如果update的响应速度比getCarsAndETA快得多(getCarsAndETA计算量很大),怎么
scale这两个service,即怎么使getCarsAndETA跟得上update的响应速度。
如何scale到其他城市
1)周边小城市
2)距离很远的大城市
看过一个talk讲到Uber用的是google的一个library,将地图分成一个个block,根据某
个点画个圈,只计算圈所覆盖的blocks。
我就是按这个思路答的,不过被指出这样有个问题是如果block size不小,那同一个
block里面车,即使是在两个对角的也算同一个block,以block为单位计算距离的话不
够准确。
各位有什么想法/解法,请不吝赐教。谢谢。
avatar
i*8
3
我还有个16g 拼个单呗,现在好像对加州来说没意思了
avatar
A*d
4
赞楼主的分享精神!这个版太缺了,总有人把我和swjtuer那个傻逼相提并论,最大的
区别就是姐当年把所有面试面筋都奉献出来了,swjtuer就只发挑拨离间贴和阴阳怪气
的留言。
avatar
l*i
5
Use a hash map to store locations of cars.
Cars location is updated every second, but reconstruct a KD tree only every
minute.
cache the result of getCarsAndETA() so it is only update every minute.
avatar
l*i
6
To be more accurate. You can compute the velocity of cars and estimate their
locations between minutes.
avatar
s*n
7
一共就1000辆车 单机存内存应该可以吧 (反正数据每秒上报,后面车的数据覆盖前
面的,不存在持久化问题)
然后将地图分为六边形小块,每个车更新位置时以hexgon id做一个index。 这样找车
的时候查当前六边形附近几个的candidates
找车api算的慢,估计时间都耗在计算距离上了,可以单独提出来做一个前端,部署多
台机器,从后端内存数据库里提取candidate list 然后逐一计算距离。
大家感觉这么的靠谱不

【在 m***i 的大作中提到】
: 挂在了设计题, 设计Uber app的两个service。
: driver/车
: update (carId,log,lat), 1 update per sec.
: rider
: getCarsAndETA(log,lat), 1 request per sec.
: 某个城市,假设是SF,有1000辆车,1000个active users.
: Q:
: 单机可以吗?
: 如何存储数据,用数据库吗?
: 如何update车移动的数据(设计数据结构)。

avatar
G*A
8
lat是latitude的意思?

【在 m***i 的大作中提到】
: 挂在了设计题, 设计Uber app的两个service。
: driver/车
: update (carId,log,lat), 1 update per sec.
: rider
: getCarsAndETA(log,lat), 1 request per sec.
: 某个城市,假设是SF,有1000辆车,1000个active users.
: Q:
: 单机可以吗?
: 如何存储数据,用数据库吗?
: 如何update车移动的数据(设计数据结构)。

avatar
z*8
9
瓶颈应该不在内存而在cpu上面吧, 2000qps的计算量估计单机扛不住

【在 s*********n 的大作中提到】
: 一共就1000辆车 单机存内存应该可以吧 (反正数据每秒上报,后面车的数据覆盖前
: 面的,不存在持久化问题)
: 然后将地图分为六边形小块,每个车更新位置时以hexgon id做一个index。 这样找车
: 的时候查当前六边形附近几个的candidates
: 找车api算的慢,估计时间都耗在计算距离上了,可以单独提出来做一个前端,部署多
: 台机器,从后端内存数据库里提取candidate list 然后逐一计算距离。
: 大家感觉这么的靠谱不

avatar
G*A
10
lat是latitude的意思?

【在 m***i 的大作中提到】
: 挂在了设计题, 设计Uber app的两个service。
: driver/车
: update (carId,log,lat), 1 update per sec.
: rider
: getCarsAndETA(log,lat), 1 request per sec.
: 某个城市,假设是SF,有1000辆车,1000个active users.
: Q:
: 单机可以吗?
: 如何存储数据,用数据库吗?
: 如何update车移动的数据(设计数据结构)。

avatar
z*n
11
我帮lz回答下最后一问,block的那个问题,看过网上的文章,正解(事实人家就是这
么做的)就是把周围的一圈block也考虑进来,然后以实际距离决出一个最近的。。。
lz看到这个会不会很无语
。。
avatar
s*x
12
Block 有好多缺点阿,这是最普通的办法。估计最好是 kd tree , quad tree 或
Geohash, 其实就是 hierarchical block.
每秒update 一次,连数据库都用不着.
1000 辆车,一台机器应该足够了,但要容错,就要加备份。


: 我帮lz回答下最后一问,block的那个问题,看过网上的文章,正解(事实人家
就是这

: 么做的)就是把周围的一圈block也考虑进来,然后以实际距离决出一个最近的
。。。

: lz看到这个会不会很无语

: 。。



【在 z*********n 的大作中提到】
: 我帮lz回答下最后一问,block的那个问题,看过网上的文章,正解(事实人家就是这
: 么做的)就是把周围的一圈block也考虑进来,然后以实际距离决出一个最近的。。。
: lz看到这个会不会很无语
: 。。

avatar
z*8
13
kdtree quadtree不还是把地图分块的思想吗。。。实际上uber就是用的google s2
library把地图分成若干cell

【在 s**x 的大作中提到】
: Block 有好多缺点阿,这是最普通的办法。估计最好是 kd tree , quad tree 或
: Geohash, 其实就是 hierarchical block.
: 每秒update 一次,连数据库都用不着.
: 1000 辆车,一台机器应该足够了,但要容错,就要加备份。
:
:
: 我帮lz回答下最后一问,block的那个问题,看过网上的文章,正解(事实人家
: 就是这
:
: 么做的)就是把周围的一圈block也考虑进来,然后以实际距离决出一个最近的
: 。。。
:
: lz看到这个会不会很无语

avatar
j*3
14
uber设计题感觉向来都是乱问的
avatar
k*a
15
看看geohashing的文档

【在 m***i 的大作中提到】
: 挂在了设计题, 设计Uber app的两个service。
: driver/车
: update (carId,log,lat), 1 update per sec.
: rider
: getCarsAndETA(log,lat), 1 request per sec.
: 某个城市,假设是SF,有1000辆车,1000个active users.
: Q:
: 单机可以吗?
: 如何存储数据,用数据库吗?
: 如何update车移动的数据(设计数据结构)。

avatar
s*7
16
难得的正能量帖,先顶再看,感谢分享

【在 m***i 的大作中提到】
: 挂在了设计题, 设计Uber app的两个service。
: driver/车
: update (carId,log,lat), 1 update per sec.
: rider
: getCarsAndETA(log,lat), 1 request per sec.
: 某个城市,假设是SF,有1000辆车,1000个active users.
: Q:
: 单机可以吗?
: 如何存储数据,用数据库吗?
: 如何update车移动的数据(设计数据结构)。

avatar
z*n
17

我怎么记得Google S2的精度要高于Geohash呢。。Geohash主要优点是速度快,对数据
库比较友好吧

【在 s**x 的大作中提到】
: Block 有好多缺点阿,这是最普通的办法。估计最好是 kd tree , quad tree 或
: Geohash, 其实就是 hierarchical block.
: 每秒update 一次,连数据库都用不着.
: 1000 辆车,一台机器应该足够了,但要容错,就要加备份。
:
:
: 我帮lz回答下最后一问,block的那个问题,看过网上的文章,正解(事实人家
: 就是这
:
: 么做的)就是把周围的一圈block也考虑进来,然后以实际距离决出一个最近的
: 。。。
:
: lz看到这个会不会很无语

avatar
w*g
18
学习了
avatar
w*m
19
大牛们赶快详细写个code吧
avatar
s*x
20
那个cell不是简单的分块,是用Hilbert curve 弄的。俺也不憧。


: kdtree quadtree不还是把地图分块的思想吗。。。实际上uber就是用的google
s2

: library把地图分成若干cell



【在 z*********8 的大作中提到】
: kdtree quadtree不还是把地图分块的思想吗。。。实际上uber就是用的google s2
: library把地图分成若干cell

avatar
w*m
21
大牛们赶快详细写个code吧
avatar
z*n
22

google
用Hilbert curve弄就是简单的把2维映射到1维,方便数据库检索而已,有一定的错误


【在 s**x 的大作中提到】
: 那个cell不是简单的分块,是用Hilbert curve 弄的。俺也不憧。
:
:
: kdtree quadtree不还是把地图分块的思想吗。。。实际上uber就是用的google
: s2
:
: library把地图分成若干cell
:

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