Вы можете попробовать вероятностный подход, выбрав коммутативную функцию для накопления (например, сложение или XOR) и параметризованную хеш-функцию.
unsigned addition(unsigned a, unsigned b);
unsigned hash(int n, int h_type);
unsigned hash_set(int* a, int num, int h_type){
unsigned rez = 0;
for (int i = 0; i < num; i++)
rez = addition(rez, hash(a[i], h_type));
return rez;
};
Таким образом, количество попыток до того, как вы решите, что вероятность ложного срабатывания будет ниже определенного порога, не будет зависеть от количества элементов, поэтому оно будет линейным.
РЕДАКТИРОВАТЬ : В общем случае вероятность того, что наборы одинаковы, очень мала, поэтому эту проверку O (n) с несколькими хэш-функциями можно использовать для предварительной фильтрации: решить как можно быстрее, если они безусловно, различны или если есть вероятность их эквивалентности, и если следует использовать медленный детерминистический метод. Конечная средняя сложность будет O (n), но в худшем случае сложность будет иметь детерминистский метод.