Общий алгоритм более или менее очевиден (только один проход последовательности) - псевдокод, извините:)
set s
for each x in sequence
if s.contains(x)
return x
else
s.add(x)
end
Единственная оставшаяся часть - это какой набор данных выбрать.если |U|
является размером домена набора (например, алфавита), то на основе ожидаемого максимального значения |s| / |U|
мы решаем, использовать ли битовый вектор или хеш-таблицу.(Обратите внимание, что даже для огромного алфавита битовый вектор был бы лучше, чем хеш-таблица, если мы ожидаем появления большинства букв).
Также обратите внимание, что для использования битового вектора это подразумеваетсячто вы должны иметь возможность ранжировать элементы, то есть сопоставить их с числом в [0..n)
.Это просто, когда мы говорим о символах, но не для остальных типов ввода.