【发布时间】:2016-10-05 08:40:03
【问题描述】:
我想用从 1 到 N 的随机值填充数组“a”(没有重复值)。让我们假设 randInt(i, j) 的 Big-O 为 O(1),并且此函数生成从 i 到 j 的随机值。
输出示例如下:
{1,2,3,4,5} 或 {2,3,1,4,5} 或 {5,4,2,1,3} 但不是 {1,2,1,3,4 }
#include<set>
using std::set;
set<int> S;// space O(N) ?
int a[N]; // space O(N)
int i = 0; // space O(1)
do {
int val = randInt(1,N); //space O(1), time O(1) variable val is created many times ?
if (S.find(val) != S.end()) { //time O(log N)?
a[i] = val; // time O(1)
i++; // time O(1)
S.insert(val); // time O(log N) <-- we execute N times O(N log N)
}
} while(S.size() < N); // time O(1)
While 循环将继续,直到我们生成从 1 到 N 的所有值。 我的理解是 Set 以对数时间 log(N) 对值进行排序,并在 log(N) 中插入。
Big-O = O(1) + O(X*log N) + O(N*log N) = O(X*log N)
其中X越多,生成不在Set中的数字的概率就越大。
time O(X log N)
space O(2N+1) => O(N), we reuse the space of val
在哪里 ??每次执行 randInt 都很难生成所有不同的数字,所以至少我希望执行 N 次。
变量 X 是否创建了多次?
X 的良好价值是多少?
【问题讨论】:
-
弄清楚代码的大 O 不如编写可以工作/没有无限循环的代码重要
-
我们也对您的随机来源一无所知。如果它真的是随机的,那么你的最坏情况 X 是 ∞。