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

G家电面

🔗
wenqiang88 2015-8-27 03:36:38 | 只看该作者
全局:
yawnzh 发表于 2015-8-27 03:29
如果id太多不能都放到内存里的话,第一次二分查找区间,第二次在区间内二分查找,只需要把这个区间load到 ...

嗯,有道理
回复

使用道具 举报

🔗
yawnzh 2015-8-27 03:49:46 | 只看该作者
全局:
alittlesheep 发表于 2015-8-26 04:48
优化的话,大致是这样:
现在概率分布是 0.2 0.3 0.5
如果想在O(1)时间找出 random结果对应的区间

我开始想的是等分id的数量,没考虑等分概率因为觉得不大好等分,不过如果id很多的情况下,说明每个id的概率很小,等分概率的时候就算有点微小的偏差也应该无所谓,等分以后在每个组内normalize就好了吧。
回复

使用道具 举报

🔗
w41q 2015-8-27 04:49:42 | 只看该作者
全局:
alittlesheep 发表于 2015-8-26 20:48
优化的话,大致是这样:
现在概率分布是 0.2 0.3 0.5
如果想在O(1)时间找出 random结果对应的区间

这样的话感觉每个id的概率就相等了啊。。
可能是我没看明白,麻烦lz再解释下行不。。
回复

使用道具 举报

🔗
yawnzh 2015-8-27 05:24:34 | 只看该作者
全局:
alittlesheep 发表于 2015-8-26 04:48
优化的话,大致是这样:
现在概率分布是 0.2 0.3 0.5
如果想在O(1)时间找出 random结果对应的区间

开始没仔细看,你把卡在区间中间的概率分到了两个区间啊,这样做的话每个区间的概率之和都是精确相等的,应该是最好的答案吧,不过为什么要用minheap和maxheap?还有可能出现的问题那里也没懂。
回复

使用道具 举报

🔗
w41q 2015-8-27 05:40:51 | 只看该作者
全局:
yawnzh 发表于 2015-8-27 05:24
开始没仔细看,你把卡在区间中间的概率分到了两个区间啊,这样做的话每个区间的概率之和都是精确相等的, ...

每个区间的概率之和相等的话 每个id输出的概率不也就相等了?
回复

使用道具 举报

🔗
yawnzh 2015-8-27 08:40:15 | 只看该作者
全局:
我自己用python写了一下,这个是代码:
  1. import random
  2. class MyRandom(object):

  3.     def __init__(self,a):
  4.         m=int(len(a)**0.5)
  5.         self.step=1/m
  6.         self.groups=self.preprocess(a,int(len(a)**0.5))

  7.     def get_random(self):
  8.         groups=self.groups
  9.         r=random.random()
  10.         j=int(r/self.step)
  11.         return groups[j][0]+self.binary_search(groups[j][1],r)

  12.     def preprocess(self,a,m):
  13.         groups=[[0,[]] for _ in range(m)]
  14.         step=1/m
  15.         sum=0
  16.         j=0
  17.         for i in range(len(a)):
  18.             sum+=a[i]
  19.             if sum<step*(j+1):
  20.                 groups[j][1].append(sum)
  21.             elif sum==step*(j+1):
  22.                 groups[j][1].append(sum)
  23.                 j+=1
  24.                 if j<m:
  25.                     groups[j][0]=i+1
  26.             else:
  27.                 groups[j][1].append(step*(j+1))
  28.                 j+=1
  29.                 groups[j][0]=i
  30.                 groups[j][1].append(sum)
  31.         return groups

  32.     def binary_search(self,a,target):
  33.         i=0
  34.         j=len(a)-1
  35.         while i<=j:
  36.             mid=(i+j)//2
  37.             if a[mid]==target:
  38.                 return mid
  39.             elif a[mid]>target:
  40.                 j=mid-1
  41.             else:
  42.                 i=mid+1
  43.         return i
复制代码
然后用一个大小为100和为1的数组进行测试,随机生成10000个数,统计频率然后跟给的概率进行比较:
  1. a=[random.random() for i in range(100)]
  2. while sum(a)>1 or 1-sum(a)>0.1**10:
  3.     s=sum(a)
  4.     a=[x/s for x in a]
  5. sol=MyRandom(a)
  6. count=[0]*10000
  7. i=0
  8. while i<10000:
  9.     x=sol.get_random()
  10.     count[x]+=1
  11.     i+=1
  12. f=[x/sum(count) for x in count]
  13. e=[abs(f[i]-a[i]) for i in range(len(a))]
  14. print(sum(e))
复制代码

补充内容 (2015-8-26 16:43):
有个地方写错了,应该是count=[0]*100。思想就是按楼主说的等概率分组。
回复

使用道具 举报

🔗
yawnzh 2015-8-27 08:55:30 | 只看该作者
全局:
w41q 发表于 2015-8-26 13:40
每个区间的概率之和相等的话 每个id输出的概率不也就相等了?

区间概率之和相等只是为了迅速找到随机数在哪个区间里面,这个区间还包含了很多id, 要继续用二分查找啊,概率怎么会一样呢。
回复

使用道具 举报

🔗
w41q 2015-8-28 02:30:05 | 只看该作者
全局:
yawnzh 发表于 2015-8-27 08:55
区间概率之和相等只是为了迅速找到随机数在哪个区间里面,这个区间还包含了很多id, 要继续用二分查找啊, ...

谢谢,如果我理解没错的话,思路是这样的对吗:
预处理之后输出id时,先random一个区间,然后在这区间里random一个数,做二分查找,在输出数所对应的id。
回复

使用道具 举报

全局:
看来是要复习一些概率的基本知识,谢谢楼主啦
回复

使用道具 举报

🔗
yawnzh 2015-8-28 04:14:25 | 只看该作者
全局:
w41q 发表于 2015-8-27 10:30
谢谢,如果我理解没错的话,思路是这样的对吗:
预处理之后输出id时,先random一个区间,然后在这区间里 ...

你可以直接random一个0-1的数,然后除以区间的大小就可以得到区间的index了,然后再在这个区间找这个随机数
回复

使用道具 举报

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

本版积分规则

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