【发布时间】:2014-05-14 17:14:47
【问题描述】:
假设您需要生成前 N 个整数的随机排列。例如,{4, 3, 1, 5, 2} 和 {3, 1, 4, 2, 5} 是合法排列,但 {5, 4, 1, 2, 1} 不是,因为一个数 (1) 重复,而另一个 (3) 缺失。该程序常用于模拟 算法。我们假设存在随机数生成器 RandInt(i,j),即 在 i 和 j 之间以相等的概率生成。以下是三种算法:
(i) 将数组 A 从 A[0] 填充到 A[N-1] 如下: 要填充 A[i],生成随机数 直到你得到一个不在 A[0]、A[1]、...、A[i-1] 中的数字。
(ii) 与算法 (i) 相同,但保留一个称为 Used 数组的额外数组。当一个随机 数字 Ran 首先放入数组 A 中,设置 Used[Ran] = true。这意味着 用随机数填充 A[i] 时,可以一步测试,看是否 已使用随机数,而不是第一个算法中的(可能)i 步。
(iii) 填充数组使得 A[i] = i+1。那么
for (i=1; i<n; i++)
swap (A[i], A[RandInt(0,i)]);
尽可能准确 (Big-O) 分析每个算法的预期运行时间。
有人可以帮忙吗?因为我只是学习这一章,并不太明白问题想要什么..
【问题讨论】:
标签: arrays random operating-system big-o