【问题标题】:Generating a sequence of n random numbers without duplicates with a space complexity of O(log(n))以 O(log(n)) 的空间复杂度生成不重复的 n 个随机数序列
【发布时间】: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


【解决方案1】:

这是一个有趣的超级简单的解决方案,具有恒定的空间;当 N 是 2 的幂并且您对“随机”的定义非常宽松(结果序列将在偶数和奇数之间交替)。

N = power of 2
P = prime number larger than N.
S = random starting number between 0 and N-1
For i = 1 TO N
    // add our prime to the starting random number
    S += P
    // S Modulus N
    // Bitwise And N-1 works because N is a pow of 2
    T = S & (N - 1)
    //T is [0, (N-1)] => we want [1, N]
    PRINT (T + 1) 
Next I

JS

for(let N = 64, P = 73, S = N * Math.random(), i = 1; i <= N; i++) { S += P; console.log((S & (N - 1)) + 1); }

另一个答案可能是将所有数字 [1, N] 视为树中的叶节点,而您的 Log(N) 空间是通过树的路径的大小。您的解决方案将是一个置换所有 N 条路径穿过树的函数。您以伪随机方式排列路径的方式基本上是线性反馈移位寄存器类型的发生器,其周期大于 N。 https://www.maximintegrated.com/en/design/technical-documents/app-notes/4/4400.html

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多