Если вам нужно точное значение для заданной длины ввода, тогда это сработает (хотя это излишне):
ALGORITHM complexity_counter_of_UniqueElements(A[0 .. n-1])
// Determines whether all the elements in a given array are distinct
// Input: An array A[0 .. n-1]
// Output: Returns "true" if all the elements in A are distinct
// and false otherwise.
counter acc = 0;
for i := 0 to n - 2 do
for j := i + 1 to n - 1 do
//if A[i] = A[j] return false
acc := 1 + acc
return acc
Легко видеть, что этот алгоритм O (n n), хотя, вероятно, это то, что вас интересует. Алгоритм сравнивает каждый элемент по каждому другому элементу. Если вы создали таблицу с результатами этой таблицы, таблица должна быть как минимум ((n n) / 2), чтобы содержать все результаты.
редактирование:
Теперь я понимаю, что вы на самом деле спрашивали.
Вам необходимо вычислить вероятность того, что каждое сравнение может привести к совпадению. Это зависит от размера ваших элементов (вещей, которые живут в A) и от того, какое распределение они имеют.
Предполагая случайное распределение, вероятность того, что любые два случайных A [x] == A [y], где x! = Y, будет 1,0 / (количество возможных значений элемента).
P(n)
total_chance := 0.0
for i:= 0 to n - 2 do
for j := i + 1 to n - 1 do
this_chance := 1.0/(number_of_possible_values_of_element)
total_chance := total_chance + ((1-total_chance)*this_chance)
// This should be the the probability of the newly compared pair being equal weighted
// to account for the chance that it actually mattered (ie, hadn't found a match earlier)
return total_chance
O ((1-P (n)) n n), но P (n) <= 1, поэтому оно меньше, чем n * n </p>