Нет, по крайней мере, в моделях, где различимость элементов из n элементов требует времени Ω (n log n).
Рассмотрим следующую структуру данных, которую я описываю с помощью Python.
class SpecialList:
def __init__(self):
self.lst = []
def append(self, x):
self.lst.append(x)
def rotationalsimilarity(self, k):
rotatedlst = self.lst[k:] + self.lst[:k]
count = sum(1 if x == y else 0 for (x, y) in zip(self.lst, rotatedlst))
self.lst = []
return count
Очевидно, append
и rotationalsimilarity
(поскольку он очищает список) амортизируются O (1). Если бы rotationalsimilarity
был наихудшим O (1), то мы могли бы предоставить операцию O (1) undo
, которая восстанавливает структуру данных до ее предыдущего состояния. Отсюда следует, что мы могли бы реализовать различие элементов во времени O (n).
def distinct(lst):
slst = SpecialList()
for x in lst:
slst.append(x)
for k in range(1, len(lst)): # 1 <= k < len(lst)
if slst.rotationalsimilarity(k) > 0:
return False
slst.undo()
else:
return True