Я считаю, что следующее было бы оптимальным решением, по крайней мере, на основе сложности времени / пространства:
Шаг 1: Сохраните целые числа в хэш-карте, в которой целое число является ключом, а количествоколичества раз, когда оно появляется в качестве значения.Обычно это операция O (n) , и вставка / обновление элементов в хеш-таблице должно быть в среднем постоянным временем.Если обнаружено, что целое число появляется более двух раз, вам действительно не нужно увеличивать счетчик использования (если вы этого не хотите).
Шаг 2. Выполните второй проход над целыми числами.Посмотрите каждый на хэш-карте, и первый с числом появлений один - это тот, который вы искали (т. Е. Первое единственное появившееся целое число).Это также O (n) , что делает весь процесс O (n) .
Некоторые возможные оптимизации для особых случаев:
Оптимизация AМожет быть возможно использовать простой массив вместо хеш-таблицы.Это гарантирует O (1) даже в наихудшем случае для подсчета количества вхождений конкретного целого числа, а также поиска количества его появлений.Кроме того, это повышает производительность в реальном времени, так как алгоритм хеширования не нужно выполнять.Может произойти сбой из-за потенциально более плохого местоположения ссылки (то есть, большая разреженная таблица по сравнению с реализацией хеш-таблицы с разумным коэффициентом загрузки).Однако это может быть сделано для очень особых случаев целочисленного упорядочения и может быть смягчено хеш-функцией хеш-таблицы, создающей псевдослучайные размещения в сегментах на основе входящих целых чисел (т. Е. Плохая локальность ссылок для начала).
Каждыйбайт в массиве будет представлять количество (до 255) для целого числа, представленного индексом этого байта.Это было бы возможно только в том случае, если разница между самым низким целым и самым высоким (то есть количеством элементов в области допустимых целых чисел) была достаточно мала, чтобы этот массив помещался в память.Индексом в массиве конкретного целого числа будет его значение минус наименьшее целое число, присутствующее в наборе данных.
Например, на современном оборудовании с 64-разрядной ОС вполне возможно, что массив 4 ГБ можетбыть выделенным, который может обрабатывать весь домен 32-разрядных целых чисел.Возможны даже большие массивы с достаточным объемом памяти.
Наименьшие и наибольшие целые числа должны быть известны перед обработкой, или потребуется другой линейный проход по данным с использованием алгоритма minmax для выяснения этой информации.
Оптимизация B: Вы можете оптимизировать Оптимизация A дальше, используя максимум 2 бита на целое число (один бит указывает на присутствие, а другой указывает на множественность).Это позволило бы представить четыре целых числа на байт, расширив реализацию массива, чтобы обрабатывать больший домен целых чисел для заданного объема доступной памяти.Здесь можно сыграть больше битовых игр, чтобы дополнительно сжать представление, но они будут поддерживать только особые случаи поступления данных и поэтому не могут быть рекомендованы для все еще в основном общего случая.