Я не думаю, что это возможно в O (N) времени и O (1) пространство. Чтобы получить время O (n), вы должны иметь блокнот (с вставкой и поиском O (1), например set
), записывая все элементы, которые вы уже видели; что требует O (m) пространства (где m - количество уникальных элементов). И наоборот, для того, чтобы получить O (1) пространство, вы должны повторно ранжировать ранее элементы в массиве для каждого элемента, что является O (n).
Если вы примете блокнот O (m), это соответствует требованию «изменить массив на месте» и работает в O (n) времени.
def remove_duplicates(arr):
"""Remove all duplicated elements from ARR in O(m) space and O(n) time.
ARR is modified in place and is not returned (like `sort`)."""
n = len(arr)
if n <= 1: return
seen = set((arr[0],))
i = 1
j = 1
while i < n:
if arr[i] not in seen:
seen.add(arr[i])
arr[j] = arr[i]
j += 1
i += 1
del arr[j:i]
Это все равно будет О (п) время, если я удалил элементы из массива, как я итерация над ним, потому что del arr[i]
сам по себе является О (п) операции: она должна скользить все после i
вниз один. del arr[j:i]
, где i
проходит мимо конца массива должен быть O (1), но если это действительно имеет значение, вам нужно будет check the implementation.
И если вы должны иметь O (1) пространство, здесь О (п) время алгоритм:
def remove_duplicates_quadratic(arr):
"""Remove all duplicated elements from ARR in O(1) space and O(n²) time.
ARR is modified in place and is not returned (like `sort`)."""
n = len(arr)
i = 0
while i < n:
for j in range(i):
if arr[j] == arr[i]:
del arr[i]
n -= 1
break
else:
i += 1
Я делаю ручную индексацию массива в них, так как удаление элементов из массива вы «Повторение с использованием любой из обычных конструкций ..in небезопасно. Вы можете использовать цикл for..in в первом, но вы потеряете parallel structure, чтобы он был менее читаемым.
В случае, если вы не видели его раньше, an else
clause on a loop выполняется только в случае, если цикл не вышел через break
.
Вы будете иметь, чтобы показать нам, что вы уже пробовали. Stackoverflow - это не просто функция, в которую вы помещаете свою проблему, и она выдает ответ. – lintmouse
Это невозможно. Операция с O (n) пространством. –
Если массив/данные отсортированы, я думаю, что это можно сделать. (Подобно шагу уменьшения на карте, сократите количество слов http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/) – viper