Какой самый эффективный алгоритм для группировки идентичных элементов в массиве, учитывая следующее:
- Почти все элементы продублированы несколько раз.
- Элементы не обязательно являются целыми числами или чем-то еще, что так же просто. Диапазон клавиш даже не четко определен, не говоря уже о небольшом. На самом деле ключи могут быть произвольными структурами. Это исключает самые простые формы подсчета сортировки.
- Мы заботимся об асимптотических и неасимптотических свойствах, и иногда n может быть небольшим. Однако, когда n мало, производительность по-прежнему важна, потому что эта функция может вызываться несколько миллионов раз в цикле для миллионов небольших наборов данных. Это исключает любую дорогостоящую хэш-функцию или использование сложной структуры данных, которая должна выполнять много выделений памяти.
- Данные могут быть отсортированы в произвольном порядке, если все идентичные элементы сгруппированы.
Если это сбивает с толку, вот пример, предполагая, что такая функция называется groupIdentical:
uint[] foo = [1,2,3,2,1,5,4,5];
uint[] bar = groupIdentical(foo);
// One possibile correct value for bar:
// bar == [2,2,1,1,3,4,5,5].
// Another possible correct answer:
// bar == [1,1,2,2,5,5,4,3].
Однако, как напоминание, мы не можем предполагать, что данные составлены как целые числа.
Редактировать: Спасибо за ответы. Моя основная проблема с хешированием заключалась в том, что хеш-таблицы часто выполняют выделение памяти. В итоге я написал собственную хеш-таблицу, в которой использовался распределитель областей, который у меня был, чтобы обойти эту проблему. Хорошо работает.