《数据科学面试40+真题讲解》,K神本年度最后一次开课


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 3764|回复: 14
收起左侧

Thumbtack OA 数据库实现

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

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

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

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

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

                               
登录/注册后可看大图
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
. more info on 1point3acres.com


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

感觉都符合了它的Performance Requirement了, 不清楚如何跪的

评分

1

查看全部评分

厉害的超人 发表于 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。
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). visit 1point3acres.com for more.
    ROLLBACK O(k), k is the number of commands in a transaction
.鏈枃鍘熷垱鑷1point3acres璁哄潧

评分

1

查看全部评分

回复 支持 3 反对 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
它这个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 ...

比如:
input:
SET A 10
. Waral 鍗氬鏈夋洿澶氭枃绔,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
比如:
input:
SET A 10

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

使用道具 举报

wearless 发表于 2016-9-23 03:56:10 | 显示全部楼层
pupuchan1116 发表于 2016-9-23 03:14-google 1point3acres
它这个OA有很多tricky的点,他给的test case不够的。我记得当初花了不少时间,把所有能想到的test case和边 ...
. 1point 3acres 璁哄潧
能举几个corner case么?
回复 支持 反对

使用道具 举报

lluo0204 发表于 2016-9-23 07:04:35 | 显示全部楼层
厉害的超人 发表于 2016-9-23 04:38
我当时是类似这样过的:. from: 1point3acres.com/bbs
俩hashmap A和B,A存updated name-value pairs,B存specific value count;再加一 ...
. visit 1point3acres.com for more.
这个好,我刚才还在想把set前的值记录下来,记这个reverse command更方便了.1point3acres缃
回复 支持 反对

使用道具 举报

pupuchan1116 发表于 2016-9-24 01:59:22 | 显示全部楼层
wearless 发表于 2016-9-23 03:56. more info on 1point3acres.com
能举几个corner case么?
. From 1point 3acres bbs
我有点忘了,我记得主要是在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了
-google 1point3acres
有个疑问:

在transaction commit之前 的SET a 10, GET a这样的命令是否需要立刻返回结果呢?. 1point 3acres 璁哄潧

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

使用道具 举报

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

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


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

使用道具 举报

wsteg 发表于 2017-9-20 14:55:12 | 显示全部楼层
厉害的超人 发表于 2016-9-23 04:38
我当时是类似这样过的:
俩hashmap A和B,A存updated name-value pairs,B存specific value count;再加一 ...

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

使用道具 举报

本版积分规则

关闭

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

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

custom counter

GMT+8, 2017-11-24 22:53

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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