1. Использование O (1) дополнительного места за O (n log n) раз
Это возможно, например:
- сначала выполните сортировку на месте O (n log n)
- затем пройдите по списку один раз, записывая первый экземпляр каждого в начало списка
Я считаю, что партнер Эджеля прав в том, что лучший способ сделать это - это сортировка слияния на месте с упрощенным этапом слияния, и что, вероятно, это и есть цель вопроса, если вы, например, были. написать новую библиотечную функцию, чтобы сделать это как можно более эффективно без возможности улучшения входных данных, и в некоторых случаях было бы полезно сделать это без хэш-таблицы, в зависимости от типов входных данных. Но на самом деле я этого не проверял.
2. Использование O (лотов) дополнительного места за O (n) раз
- объявить массив с нулями, достаточно большой, чтобы вместить все целые числа
- пройти через массив один раз
- установите соответствующий элемент массива в 1 для каждого целого числа.
- Если это уже было 1, пропустите это целое число.
Это работает только при наличии нескольких сомнительных предположений:
- можно дешево обнулить память, или размер целых чисел мал по сравнению с их количеством
- вы счастливы попросить свою ОС о 256 ^ sizepof (int) памяти
- и он будет кэшировать его действительно очень эффективно, если он гигантский
Это плохой ответ, но если у вас МНОГО элементов ввода, но все они 8-битные целые числа (или, может быть, даже 16-битные целые числа), это может быть лучшим способом.
3. O (немного) лишнего места, O (n) - времени
То же, что № 2, но используйте хэш-таблицу.
4. Чистый путь
Если количество элементов невелико, написание соответствующего алгоритма бесполезно, если другой код быстрее пишется и быстрее читается.
Например. Пройдитесь по массиву для каждого уникального элемента (то есть первого элемента, второго элемента (дубликаты первого удалены) и т.д.), удалив все идентичные элементы. O (1) дополнительное пространство, O (n ^ 2) раз.
Например. Используйте библиотечные функции, которые это делают. эффективность зависит от того, что у вас есть.