📣 独立日限时特惠: VIP通行证立减$68
楼主: paca
跳转到指定楼层
上一主题 下一主题
收起左侧

求问Two Sigma店面一题如何解?

🔗
maihuabu 2016-8-4 14:16:13 | 只看该作者
全局:
此题考查augmented data structure。你可以任选balanced binary search tree,每个node保存self和所有child nodes的weight的和,另外存一下所有node的和。getRandom每次生成随机数,然后再找相应的child node。这样实现所有operation皆是O(lgN)。

评分

参与人数 1大米 +5 收起 理由
atlas1017 + 5 没想到这个解法 厉害厉害!

查看全部评分

回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
xihaokai1 2016-8-4 21:17:55 | 只看该作者
全局:
paca 发表于 2016-8-4 01:24
能讲讲这个DoubleLinkedList用来存什么吗?Weight应该就是一个Integer,能不能再细讲一下。

就是一个双向的链表,每个node存前一个node,后一个node, 还有weight。
你把每个weight想成一个线段,用链表就相当于说每次加入新的weight或者更新/移除老的weight的时候所有的线段还是连续接在一起的,方便我们getrandom。

比如现在我们有个链表,里面的weight是1,5,2,3,9(总20, 概率分布可以想像成[0,1),[1,6),[6,8),[8,11),[11,20))。 我们从0-1产生个随机数,假设是0.2,那相当于1-20里面掷到了20*0.2=4, 也就是说在0-20的线段里落在了20*0.2=4这个点,那按我之前的算法,先4-1=3, 然后3-5=-2比0小了所以到第二个node就停了。的确,4是在[1,6)这个线段里,也就对应第二个node。

你可以看到在这些线段里找4其实可以用binary search, 所以之前我相信log(n)可以实现,第一感觉是用indexed binary tree可是我对这个数据结构不是很熟。。。不过直觉告诉我可以实现。tradeoff就是其他方法可能也得O(logn)了。
回复

使用道具 举报

🔗
maihuabu 2016-8-5 06:21:06 | 只看该作者
全局:
xihaokai1 发表于 2016-8-4 21:17
就是一个双向的链表,每个node存前一个node,后一个node, 还有weight。
你把每个weight想成一个线段,用 ...

这样只能靠binary indexed tree才能O(logN),remove也会非常复杂,这题就是用augmented tree。
回复

使用道具 举报

🔗
hxtang 2016-8-5 06:42:52 | 只看该作者
全局:
lz你这个数据结构有最大容量吗?还是可以一直insert的...
回复

使用道具 举报

🔗
blackrose 2016-8-5 06:59:56 | 只看该作者
全局:
getRandom 难道不是linkedlist reservior sampling 问题么

评分

参与人数 1大米 +1 收起 理由
twtypsj + 1 hao

查看全部评分

回复

使用道具 举报

🔗
haoshenxiong 2016-8-5 13:39:28 | 只看该作者
全局:
跟这个类似吧
http://stackoverflow.com/questions/5682218/data-structure-insert-remove-contains-get-random-element-all-at-o1

remove的时候把数组末尾的object和要remove的object对调,insert的时候直接插入队尾,update总的weight和,只有getRandom的时候需要O(n)去寻找在哪个区间
回复

使用道具 举报

🔗
 楼主| paca 2016-8-5 13:57:06 | 只看该作者
全局:
hxtang 发表于 2016-8-5 06:42
lz你这个数据结构有最大容量吗?还是可以一直insert的...

这个题目面试官说的是流,我想应该是无限的,不应该是固定容量的。
回复

使用道具 举报

🔗
 楼主| paca 2016-8-5 13:59:11 | 只看该作者
全局:
blackrose 发表于 2016-8-5 06:59
getRandom 难道不是linkedlist reservior sampling 问题么

可能我理解Reservior Sampling理解的不深。如果weight 都是1, 就是没有weight的话,对于流来说,随机产生应该是用这个方法。能说说如果有weight的话,如何应用?
回复

使用道具 举报

🔗
 楼主| paca 2016-8-5 14:01:50 | 只看该作者
全局:
xihaokai1 发表于 2016-8-4 21:17
就是一个双向的链表,每个node存前一个node,后一个node, 还有weight。
你把每个weight想成一个线段,用 ...

谢谢你的解释,我想概率那块我当时也是这么跟面试官说的,就是看区间。但是你用DDL貌似比我的那个HashMap好点。我估计面试官想要的是O(logn)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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