У меня есть программа, которая будет генерировать массивы целых чисел. Мне нужно иметь возможность эффективно проверять, был ли ранее создан новый массив. Вот то, что я знаю о природе этих массивов:C - Сравнение массивов (наборов) целых чисел - хеширование или попытки
- Целые бы между 0 и около 200 000
- Количество чисел в одном массиве произвольно, но я полагаю, меньше чем 200
- Порядок целых чисел не имеет значения. Повторения не имеют значения. Таким образом, массив
5 5 7 19
следует рассматривать так же, как7 5 19 7 7
(их следует рассматривать как множества, а не массивы, в основном) - Количество создаваемых массивов было бы в сотни тысяч, так что мне это нужно, чтобы быть эффективным
Я думал об использовании некоторой структуры данных trie. Для этого мне нужно будет отсортировать массив, а затем пересечь trie, игнорируя последовательные дубликаты.
Однако попытки обычно используются для символов, где вы знаете, что у всех узлов будет, например, 26 детей, поэтому дети могут быть легко сохранены и обнаружены в массиве из 26 элементов. В моем случае, однако, у меня есть целые числа, которые могут достигать 200 000 - поэтому, очевидно, множество детей недопустимо. Можно ли создать эффективный trie для таких целых чисел?
Моя другая идея - использовать хеш-таблицу. Для этого потребуется функция хэширования, которая не заботится о упорядочении элементов и является идемпотентной относительно дубликатов. Существует ли такая хеширующая функция? Если нет, мне снова нужно будет отсортировать массив и передать его в обычную хэш-функцию. И, конечно, дело с столкновениями.
И, наконец, какой из них был бы более эффективным? Или, может быть, какая-то другая структура данных, о которой я не думал?
Вы беспокоитесь о памяти или скорости? – nightshade
Память @nightshade не является большой проблемой, если она вписывается в 32-битный процесс, но скорость важна, поскольку объем данных довольно велик. – Godkiller
это должно быть в C или вы можете использовать C++? – nightshade