一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1278|回复: 13
收起左侧

Thumbtack OA 数据库实现

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

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

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
就是写一个简单内存数据库:

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图



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

感觉都符合了它的Performance Requirement了, 不清楚如何跪的. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
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
它这个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 ...
.鏈枃鍘熷垱鑷1point3acres璁哄潧
比如:
input:
SET A 10
begin
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
比如:. from: 1point3acres.com/bbs
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么?
回复 支持 反对

使用道具 举报

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

最后string类似:"| UNSET a, SET b 8,| SET c 3,". Waral 鍗氬鏈夋洿澶氭枃绔,

Time Complexity:
    SET/UNSET/GET/NUMEQUALTO/BEGIN/COMMIT O(1). From 1point 3acres bbs
    ROLLBACK O(k), k is the number of commands in a transaction.1point3acres缃
鏉ユ簮涓浜.涓夊垎鍦拌鍧.

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-9-23 07:04:35 | 显示全部楼层
厉害的超人 发表于 2016-9-23 04:38
我当时是类似这样过的:
俩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. 1point3acres.com/bbs
能举几个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()到的是原值还是新值?仅从给的例子好像看不出来。。。
. more info on 1point3acres.com
应该是新值,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这样的命令是否需要立刻返回结果呢?


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

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

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

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-4 22:35

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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