Ваш код только проверяет, совпадает ли элемент в массиве со своим непосредственным предшественником.
Если ваш массив начинается отсортированным, это сработает, потому что все экземпляры определенного числа будут смежными.
Если ваш массив не отсортирован для начала, это не сработает, потому что экземпляры определенного числа могут не быть смежными, поэтому вам нужно просмотреть все предыдущие числа, чтобы определить, был ли один из них еще не видел.
Чтобы выполнить задание за время O (N log N), вы можете отсортировать массив, а затем использовать уже имеющуюся логику для удаления дубликатов из отсортированного массива. Очевидно, это полезно только в том случае, если вы в порядке с перестановкой чисел.
Если вы хотите сохранить исходный порядок, вы можете использовать что-то вроде хеш-таблицы или набора битов, чтобы отслеживать, было ли число уже просмотрено, и копировать каждое число в вывод только тогда / если оно еще не было просмотрено. Для этого меняем ваш текущий:
if (a[k] != a[i])
a[k+1] = a[i];
примерно так:
if (!hash_find(hash_table, a[i])) {
hash_insert(hash_table, a[i]);
a[k+1] = a[i];
}
Если все ваши числа попадают в довольно узкие границы или вы ожидаете, что значения будут плотными (т.е. присутствует большинство значений), вы можете использовать битовый набор вместо хеш-таблицы. Это будет просто массив битов, установленный в ноль или единицу, чтобы указать, было ли просмотрено конкретное число.
С другой стороны, если вас больше волнует верхняя граница сложности, чем средний случай, вы можете использовать сбалансированную древовидную коллекцию вместо хеш-таблицы. Обычно это использует больше памяти и работает медленнее, но его ожидаемая сложность и сложность наихудшего случая практически идентичны (O (N log N)). Типичная хеш-таблица вырождается от постоянной сложности к линейной в худшем случае, что изменит вашу общую сложность с O (N) на O (N 2).
person
Jerry Coffin
schedule
17.07.2011