Я нашел алгоритм здесь, чтобы удалить повторяющиеся символы из строки с O (1) пробелом сложности (SC).Здесь мы видим, что алгоритм преобразует строку в массив символов, который не является постоянным, он будет меняться в зависимости от размера ввода.Они утверждают, что он будет работать в SC из O (1).Как?
Это не так.
Алгоритм принимает в качестве входных данных строку произвольного размера, состоящую только из 26 символов, и, следовательно, выходной результат составляет всего 26 символов или менее, поэтомувыходной массив не обязательно должен иметь размер входных данных.
Вы правильно заметили, что реализация, представленная на сайте, выделяет O (n) дополнительного пространства без необходимости для массива char.
Упражнение : Можете ли вы исправить проблему с массивом символов?
Более сложное упражнение : Можете ли вы описать и реализовать структуру данных строки, которая эффективно реализует контракт строки, нопозволяет этот алгоритм быть реализованным на самом деле, используя только O (1) дополнительное пространство для произвольных строк?
Лучшее упражнение : тот факт, что мы ограничены алфавитом из 26 символов, это то, что позволяетДрянное решение «давайте просто использовать int как набор флагов».Вместо того, чтобы говорить, что n - это размер входной строки, что если мы допустим произвольные последовательности произвольных значений, которые имеют отношение равенства ;Можете ли вы найти решение этой проблемы, которое заключается в O (n) по размеру выходной последовательности, а не входной последовательности?
То есть, вы можете реализовать public static IEnumerable<T> Distinct<T>(this IEnumerable<T> t)
таким образом, чтобы вывод был дедуплицированно в остальном в том же порядке, что и вход, с использованием памяти O (n), где n - размер выходной последовательности?
Это лучшее упражнение, поскольку эта функция фактически реализована в базовом классе.библиотека .Это полезно, в отличие от задачи с игрушкой.
Я также отмечаю, что в постановке задачи предполагается, что существует только один соответствующий алфавит с символами в нижнем регистре, и что их 26.Это предположение неверно.