传说中的谷歌招聘委员会成员之一,从幕后走出来,教你学系统设计!


一亩三分地论坛

 找回密码
 获取更多干活,快来注册
天天打游戏、照样领工资、还办H1B
这份工作你要不要?
把贵司招聘信息放这里
查看: 3345|回复: 14
收起左侧

Thumbtack OA 数据库实现

[复制链接] |试试Instant~ |关注本帖
luckyzzh1989 发表于 2016-9-17 00:58:30 | 显示全部楼层 |阅读模式

2016(7-9月) 码农类 硕士 全职@Thumbtack - 内推 - 在线笔试 |Failfresh grad应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
就是写一个简单内存数据库:. 1point3acres.com/bbs

                               
登录/注册后可看大图

                               
登录/注册后可看大图
.1point3acres缃
                               
登录/注册后可看大图

                               
登录/注册后可看大图



给两周时间做出来,我第二天就交了,主要觉得没什么可优化的了,就交了。但刚收到了拒信。
我是用两个unordered_map, 一个mainMap存key 和 value, 一个countValues用来存value 和 value 的数量。
对于transaction, 我是新生成新的map 给每一个begin, rollback 的时候就删掉最新的那个map 并对countValues进行修改, commit的时候就将所有的map同步回mainMap。给的test case 都过了。

感觉都符合了它的Performance Requirement了, 不清楚如何跪的
厉害的超人 发表于 2016-9-23 04:38:28 | 显示全部楼层
我当时是类似这样过的:. more info on 1point3acres.com
俩hashmap A和B,A存updated name-value pairs,B存specific value count;再加一个string存reverse commands in a pending transaction。
set: 添加到A,更新B,同时append reverse command到string
unset: 调用set(null)
get: 直接返回A里的值
NUMEQUALTO: 直接返回B里的值
begin: string里append "|"
COMMIT: 直接清空string,其他啥也不管,如果string是空就返回false (NO TRANSACTION)
rollback,把string里的命令拿出来执行一遍,直到遇到"|"(此时调用set时不再添加reverse command到string里),有多个"|"就代表可以rollback多次,如果string是空就返回false

最后string类似:"| UNSET a, SET b 8,| SET c 3,"

Time Complexity:
    SET/UNSET/GET/NUMEQUALTO/BEGIN/COMMIT O(1)
    ROLLBACK O(k), k is the number of commands in a transaction


评分

1

查看全部评分

回复 支持 2 反对 0

使用道具 举报

lluo0204 发表于 2016-9-22 23:46:37 | 显示全部楼层
请问楼主这个OA可以用Java么?还是必须用C++ ? rollback 的时候为什么要对countValues进行修改?没有commit的话不需要啊 ?
回复 支持 反对

使用道具 举报

pupuchan1116 发表于 2016-9-23 03:14:18 | 显示全部楼层
它这个OA有很多tricky的点,他给的test case不够的。我记得当初花了不少时间,把所有能想到的test case和边界条件都包含进去。在它后来已经不招人的情况下我都过了OA拿到面试,所以这道题我印象很深刻
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-9-23 03:34:35 | 显示全部楼层
pupuchan1116 发表于 2016-9-23 03:14
-google 1point3acres它这个OA有很多tricky的点,他给的test case不够的。我记得当初花了不少时间,把所有能想到的test case和边 ...

请问能讲一讲思路么?如果每个transition都maintain整个数据库,似乎内存消耗太大了,如果所有transition maintain一个temp db的话,rollback的时候就要go through all uncommit transitions, 又似乎与要求runtime与transition无关不符,所以还没想好
回复 支持 反对

使用道具 举报

 楼主| luckyzzh1989 发表于 2016-9-23 03:37:47 | 显示全部楼层
lluo0204 发表于 2016-9-22 23:46
请问楼主这个OA可以用Java么?还是必须用C++ ? rollback 的时候为什么要对countValues进行修改?没有commi ...
. 鍥磋鎴戜滑@1point 3 acres
比如:
input:. Waral 鍗氬鏈夋洿澶氭枃绔,
SET A 10
begin-google 1point3acres
SET B 10
NUMEQUALTO 10. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴

output
2

如果这样我rollback 的话,NUMEQUALTO 10就变回1了, 所以在rollback 的时候也得对conutValues进行修改的
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-9-23 03:45:28 | 显示全部楼层
luckyzzh1989 发表于 2016-9-23 03:37. 1point 3acres 璁哄潧
比如:. visit 1point3acres.com for more.
input:
SET A 10

I see. 我觉得可能的原因是你每个transition都maintain整个db, 会不会内存消耗太大啊?
回复 支持 反对

使用道具 举报

wearless 发表于 2016-9-23 03:56:10 | 显示全部楼层
pupuchan1116 发表于 2016-9-23 03:14
它这个OA有很多tricky的点,他给的test case不够的。我记得当初花了不少时间,把所有能想到的test case和边 ...

能举几个corner case么?
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-9-23 07:04:35 | 显示全部楼层
厉害的超人 发表于 2016-9-23 04:38. Waral 鍗氬鏈夋洿澶氭枃绔,
我当时是类似这样过的:. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
俩hashmap A和B,A存updated name-value pairs,B存specific value count;再加一 ...

这个好,我刚才还在想把set前的值记录下来,记这个reverse command更方便了
回复 支持 反对

使用道具 举报

pupuchan1116 发表于 2016-9-24 01:59:22 | 显示全部楼层
wearless 发表于 2016-9-23 03:56
能举几个corner case么?

我有点忘了,我记得主要是在rolling back的地方,然后剩下的就是各种输入输出的有效性
回复 支持 反对

使用道具 举报

gabrielzhuyun 发表于 2016-10-8 07:17:15 | 显示全部楼层
请问commit之前依次执行set() 和 get(), get()到的是原值还是新值?仅从给的例子好像看不出来。。。
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-10-9 04:49:15 | 显示全部楼层
gabrielzhuyun 发表于 2016-10-8 07:17. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
请问commit之前依次执行set() 和 get(), get()到的是原值还是新值?仅从给的例子好像看不出来。。。

应该是新值,uncommit的value只是允许callback但是已经apply to db了
回复 支持 反对

使用道具 举报

rcholic 发表于 2016-11-22 00:33:16 | 显示全部楼层
lluo0204 发表于 2016-10-9 04:49
应该是新值,uncommit的value只是允许callback但是已经apply to db了
. 1point 3acres 璁哄潧
有个疑问:

在transaction commit之前 的SET a 10, GET a这样的命令是否需要立刻返回结果呢?

我觉得在执行commit之前不应该输出任何结果的,不知道这样做是否正确。谢谢
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-11-22 11:26:41 | 显示全部楼层
rcholic 发表于 2016-11-22 00:33
有个疑问:

在transaction commit之前 的SET a 10, GET a这样的命令是否需要立刻返回结果呢?

. from: 1point3acres.com/bbs
需要返回结果。uncommit只是说明要temporary记一下,但是应该已经apply到数据库了
回复 支持 反对

使用道具 举报

wsteg 发表于 前天 14:55 | 显示全部楼层
厉害的超人 发表于 2016-9-23 04:38.鐣欏璁哄潧-涓浜-涓夊垎鍦
我当时是类似这样过的:. from: 1point3acres.com/bbs
俩hashmap A和B,A存updated name-value pairs,B存specific value count;再加一 ...

请问是否应该还有一个 isBegin 的boolean 变量,如果begin了,置为true,然后在set 和 unset 操作里记录其逆指令。否则不记录。
谢谢
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-9-22 16:27

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表