Существует несколько различных способов обнаружения / удаления дубликатов:
Вложенные циклы
Примите следующее значение в последовательности, затем просканируйте до конца списка, чтобы увидеть, не произойдет ли это значение снова.,Это O (n 2 ) - хотя я считаю, что границы можно утверждать ниже?- но реальная производительность может быть лучше, поскольку выполняется только сканирование от i
до end
(не 0
до end
), и оно может прекратиться досрочно.Это не требует дополнительных данных помимо нескольких переменных.
(См. Ответ Кристофа о том, как это можно сделать, просто используя обход связанного списка и деструктивное «добавление» в новый список - например, вложенныйциклы не должны «чувствовать» себя как вложенные циклы.)
Сортировка и фильтрация
Сортировка списка (сортировка слиянием может быть изменена для работы со связанными списками), а затем обнаружение дублированных значений (онибудет бок о бок сейчас).С хорошей сортировкой это O (n * lg (n)).Фаза сортировки обычно является / может быть разрушительной (например, у вас есть «одна копия»), но она была изменена; -)
Сканирование и ведение поиска
Сканирование списка и каксписок сканируется добавить значения в поиск.Если поиск уже содержит указанные значения, значит, есть дубликат!Этот подход может быть O (n), если доступ к поиску - O (1).Обычно для поиска используется хеш / словарь или набор, но если используется только ограниченный диапазон интегралов, то массив будет работать очень хорошо (например, индекс - это значение).Это требует дополнительной памяти, но не «дополнительной копии» - по крайней мере, в буквальном чтении.
Для малых значений n big-O практически бесполезен; -)
Счастливое кодирование.