【发布时间】:2019-04-11 21:59:59
【问题描述】:
使用恒定空间以均匀概率从流中随机选择一个项目
流提供以下操作:
class Stream:
def __init__(self, data):
self.data = list(data)
def read(self):
if not self.data:
return None
head, *self.data = self.data
return head
def peek(self):
return self.data[0] if self.data else None
流中的元素(data 的元素)的大小是恒定的,它们都不是None,所以None 表示流结束。流的长度只能通过消费整个流来学习。请注意,计算元素的数量会消耗 O(log n) 空间。
我相信没有办法统一使用 O(1) 空间从流中随机选择一个项目。
任何人都可以(反证)证明这一点吗?
【问题讨论】:
-
您对“O(1) 空间”的定义排除了具有足够状态空间的 PRNG 来统一选择一个元素,因此这几乎是不可能的......但这并不是 O(1) 的实际定义空间。
-
@MattTimmermans 如果我使用真正的 RNG 设备,它会逐位返回 rv?
-
@SeverinPappadeux 当然,或模拟计算机,或许多其他东西,但没有迹象表明任何一种都是允许的。
-
为什么计算元素个数会消耗 O(log n) 空间?
-
嗯?!?你在哪里找到这样的限制?在 /dev/random 之上编写这样的生成器非常简单
标签: algorithm optimization random probability