Лучший алгоритм для удаления дубликатов в массиве строк

Сегодня в школе учитель попросил нас реализовать алгоритм удаления дубликатов. Это не так уж сложно, и все пришли к следующему решению (псевдокоду):

for i from 1 to n - 1
    for j from i + 1 to n
        if v[i] == v[j] then remove(v, v[j])    // remove(from, what)
    next j
next i

Вычислительная сложность для этого алгоритма составляет n (n-1) / 2 . (Мы учимся в старшей школе, и мы не говорили о большом O, но, похоже, это O (n ^ 2) ). Это решение выглядит уродливым и, конечно же, медленным, поэтому я попытался написать что-то более быстрое:

procedure binarySearch(vector, element, *position)
    // this procedure searches for element in vector, returning
    // true if found, false otherwise. *position will contain the
    // element's place (where it is or where it should be)
end procedure

----

// same type as v
vS = new array[n]

for i from 1 to n - 1
    if binarySearch(vS, v[i], &p) = true then
        remove(v, v[i])
    else
        add(vS, v[i], p)      // adds v[i] in position p of array vS
    end if
next i

Таким образом vS будет содержать все элементы, которые мы уже прошли. Если элемент v [i] находится в этом массиве, то он является дубликатом и удаляется. Вычислительная сложность для двоичного поиска составляет log (n) , а для основного цикла (второй фрагмент) - n . Следовательно, весь CC равен n * log (n) , если я не ошибаюсь.

Тогда у меня была другая идея об использовании двоичного дерева, но я не могу от нее отказаться.
В основном мои вопросы следующие:

  • Правильно ли рассчитан мой CC? (а если нет, то почему?)
  • Есть ли более быстрый способ для этого?

Спасибо

8
задан Tripp Kinetics 5 January 2015 в 21:39
поделиться