查看: 1095| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 求问一道算法题

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
给一个m和一个n
只能用1 + Random.nextInt(m)来生产 1 ~ m的数字

要求是生产n个没有重复的数字,这些数字都要在[1, m]之间。

两个方案:
第一个方案:用一个set,每次生成完以后就放进去,下次生成的时候就检查。
第二个方案:用一个list,每次生成完以后就把它给扔出去,再从里面生成剩下的。

这两个方案都不好,第一个是在m,n都很大的时候,执行的次数多。
第二个方案是如果m很大的时候空间会比较大。

有没有更好的方案呢?

上一篇:最新leetcode tag截图9家公司~~~攒RP
下一篇:Leetcode10家
🔗
stellari 2018-12-5 12:38:20 | 只看该作者
全局:
这就是标准的reservoir sampling问题,你只需O(n)内存保存最后生成的结果即可。见
https://en.wikipedia.org/wiki/Reservoir_sampling

评分

参与人数 1大米 +1 收起 理由
14417335 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| lixianlovesu 2018-12-6 03:39:17 | 只看该作者
全局:
stellari 发表于 2018-12-5 12:38
这就是标准的reservoir sampling问题,你只需O(n)内存保存最后生成的结果即可。见
https://en.wikipedia.o ...

嗯,我大概了解了。谢谢。
回复

使用道具 举报

🔗
 楼主| lixianlovesu 2018-12-6 03:42:11 | 只看该作者
全局:
stellari 发表于 2018-12-5 12:38
这就是标准的reservoir sampling问题,你只需O(n)内存保存最后生成的结果即可。见
https://en.wikipedia.o ...

主要我当时提出了蓄水池算法,他不是很满意。然后说让我自己实现data structure, 说是用树,我表示很懵逼啊。。不知道层主有没有什么想法。
回复

使用道具 举报

🔗
magicsets 2018-12-6 14:09:03 | 只看该作者
全局:
更好的方案不知道.. 不过一个参考信息是统计/DS常用的R语言中的"sample"函数以及Python的Numpy包中的"random.choice"都是用的你所说的两个方案

R语言的sample函数的顶层定义(一小段dispatch代码,根据m、n的大小选择具体底层调用):https://github.com/wch/r-source/blob/5a156a0865362bb8381dcd69ac335f5174a4f60c/src/library/base/R/sample.R#L30
其在m > 10^7 且 n <= m/2时会使用方案一:https://github.com/wch/r-source/blob/d8279508eb30d9ce61c75f45190901f2a4d77be5/src/main/unique.c
否则使用方案二:https://github.com/wch/r-source/blob/9cdb15a838bc7bec0a26b3abf312ab842a85b509/src/main/random.c#L535

Numpy包里的实现更暴力一些,直接做一个permutation(相当于方案二)然后取数组前n个值:https://github.com/numpy/numpy/blob/7c41164f5340dc998ea1c04d2061f7d246894955/numpy/random/mtrand/mtrand.pyx#L1189


补充内容 (2018-12-6 14:11):
R语言中方案一的链接没有带上行号,应该是:
https://github.com/wch/r-source/ ... main/unique.c#L1821
回复

使用道具 举报

🔗
yliu2008 2018-12-7 06:59:06 | 只看该作者
全局:
Similar to LC 710.

O(n) time
回复

使用道具 举报

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

本版积分规则

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