Я хочу заполнить массив 'a' случайными значениями от 1 до N (без повторных значений). Предположим, что Big-O of randInt (i, j) - O (1), и эта функция генерирует случайные значения от i до j.
Примеры выходных сигналов:Что такое Big-O кода, который использует генераторы случайных чисел?
{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 Loop будет продолжаться, пока мы не генерировать все значения от 1 до N. Я понимаю, что набор сортирует значения в логарифмической журнале времени (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 не так важно, как писать код, который работает/не имеет бесконечного цикла – kfsone
Мы также ничего не знаем о вашем случайном источнике. Если это действительно случайный, то ваш худший случай X - ∞. – kfsone