【发布时间】:2022-01-09 03:33:23
【问题描述】:
我想在[1,n] 区间内生成一个n 随机整数序列,没有重复,即序列[1,2,...,n] 与O(log(n)) 空间复杂度的排列(或log(n) 的多项式函数) .
一个提示是,我可以假设我有一系列 l-wise 统一哈希函数 h : [n] -> [k](带有 l<=n),这样对于任何 y_1, y_2,..., y_l 和任何不同的 x_1, x_2,..., x_l:
P(h(x_1) = y_1 and h(x_2) = y_2 and ... and h(x_l) = y_l) = 1/(k^l)
我的第一个想法是使用哈希函数生成序列的第i个元素,即x_i = h(i),检查x_i是否已经被使用(已经被哈希函数返回了一些0<j<i ) 如果是这种情况,则将 x_i 增加 1 并再次检查直到 x_i 是一个新数字。我的问题是我不能有一个大小为n 的布尔向量来检查值x_i 是否已被使用。如果我执行递归函数来获得第 j 个值,我将在某个时候需要 O(n log2(n)) bits...
我还发现here 像线性同余生成器这样的伪随机生成器可用于解决类似x_i+1 = (a*x_i + c)%n + 1 之类的问题,但我不确定如何为n 的任何值选择a有一段长度为n。在那种情况下,除了生成序列的第一个数字之外,提示并没有真正有用,因此我认为这不是正确的方法。
【问题讨论】:
-
您需要即时生成数字,因为您无法存储它们(全部)。也许最好问问 Math SE。
-
学校运动或实际使用需要?如果实际使用需要,为什么不使用 GUID?
-
@Aldert 理论练习我不需要实现它只是证明我的解决方案的正确性
标签: algorithm random hash generator space-complexity