Фон
У меня есть большая коллекция (~ тысяч) последовательностей целых чисел. Каждая последовательность имеет следующие свойства:
- имеет длину 12;
- порядок элементов последовательности не имеет значения;
- ни один элемент не появляется дважды в той же последовательности;
- все элементы меньше 300.
Обратите внимание, что свойства 2. и 3. подразумевают, что последовательности фактически являются наборами, но они сохраняются как массивы C, чтобы максимизировать скорость доступа.
Я ищу хороший алгоритм на С++, чтобы проверить, присутствует ли новая коллекция в коллекции. Если нет, новая последовательность добавляется в коллекцию. Я думал об использовании хеш-таблицы (обратите внимание, однако, что я не могу использовать любые конструкции С++ 11 или внешние библиотеки, например Boost). Хеширование последовательностей и сохранение значений в std::set
также является опцией, так как столкновениями можно просто пренебречь, если они достаточно редки. Любое другое предложение также приветствуется.
Вопрос
Мне нужна коммутативная хеш-функция, т.е. функция, не зависящая от порядка элементов в последовательности. Я думал о первом сокращении последовательностей до некоторой канонической формы (например, сортировке), а затем с использованием стандартных хеш-функций (см. Ссылки ниже), но я предпочел бы избежать накладных расходов, связанных с копированием (я не могу изменить исходные последовательности) и сортировка. Насколько я могу судить, ни одна из функций, упомянутых ниже, не является коммутативной. В идеале хэш-функция также должна использовать тот факт, что элементы никогда не повторяются. Скорость имеет решающее значение.
Любые предложения?